Hi,

The BundleDbPersistenceManager also supports auto-reconnect.

With Jackrabbit 1.4.0 RC-1, the connection can be created using a JNDI
Data Source as well. To do that, the driver class name must reference
a javax.naming.Context class (for example
javax.naming.InitialContext), and the URL must be the JNDI URL (for
example java:comp/env/jdbc/Test).

Regards,
Thomas


On Jan 10, 2008 10:46 AM, Neubauer, Matthias <[EMAIL PROTECTED]> wrote:
> Hi!
>
> We are facing a problem regarding the connection between Jackrabbit
> (especially the JNDIPersistenceManager, probably other classes, too) and
> a MySQL database in a clustered environment. We are using:
>
> - Tomcat 5.5
> - Jackrabbit 1.3.3 / 1.4.0 RC-1 (we tried both)
> - MySQL-connector 5.0.6 / MySQL-DB 5.0
> - Commons DBCP 1.2.2
>
> At start, the application runs just fine. But in case of a database
> restart or if MySQL closed the connection after the timeout limit, the
> repository becomes unusable, because the connection to the database as
> JNDI resource cannot be reestablished. This happens for:
>
> - org.apache.jackrabbit.core.fs.db.JNDIDatabaseFileSystem
> -
> org.apache.jackrabbit.core.persistence.db.JNDIDatabasePersistenceManager
>
> but not for the Journal, either with the Standard DatabaseJournal class,
> or with our own JNDI modification of it.
>
> However, we can't see, why the Journal is able to reestablish the
> connection, as the code in all these classes seems to be pretty much
> equal for the connection part.
>
> Did anybody also have this problem, or knows how it could be solved? Did
> we do something wrong in the configuration, or is it a bug?
>
> Best regards,
> Matthias Neubauer
>
> PS: Here is our repository.xml and the stacktrace of the tomcat:
>
> Repository configruation is:
> ------------------------------------------------------------------------
> ----------------------------------------------
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD
> Jackrabbit 1.2//EN"
> "http://jackrabbit.apache.org/dtd/repository-1.2.dtd";>
>
> <Repository>
>   <FileSystem
> class="org.apache.jackrabbit.core.fs.db.JNDIDatabaseFileSystem">
>     <param name="dataSourceLocation" value="java:jdbc/rome"/>
>     <param name="schemaObjectPrefix" value="rep_"/>
>     <param name="schema" value="mysql"/>
>   </FileSystem>
>
>
>   <Security appName="Jackrabbit">
>     <AccessManager
>       class="org.apache.jackrabbit.core.security.SimpleAccessManager">
>       <!-- <param name="config" value="${rep.home}/access.xml"/> -->
>     </AccessManager>
>
>     <LoginModule
>       class="org.apache.jackrabbit.core.security.SimpleLoginModule">
>       <!-- anonymous user name ('anonymous' is the default value) -->
>       <param name="anonymousId" value="anonymous" />
>     </LoginModule>
>   </Security>
>
>
>   <Workspaces rootPath="${rep.home}/workspaces"
>     defaultWorkspace="rome" />
>
>   <Workspace name="${wsp.name}">
>     <FileSystem
> class="org.apache.jackrabbit.core.fs.db.JNDIDatabaseFileSystem">
>       <param name="dataSourceLocation" value="java:jdbc/rome"/>
>       <param name="schemaObjectPrefix" value="${wsp.name}_"/>
>       <param name="schema" value="mysql"/>
>     </FileSystem>
>
>     <PersistenceManager
> class="org.apache.jackrabbit.core.persistence.db.JNDIDatabasePersistence
> Manager">
>       <param name="dataSourceLocation" value="java:jdbc/rome"/>
>       <param name="schemaObjectPrefix" value="${wsp.name}_"/>
>       <param name="schema" value="mysql"/>
>       <param name="externalBLOBs" value="false"/>
>     </PersistenceManager>
>
>     <SearchIndex
>       class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
>       <param name="path" value="${wsp.home}/index" />
>     </SearchIndex>
>   </Workspace>
>
>   <Versioning rootPath="${rep.home}/version">
>     <FileSystem
> class="org.apache.jackrabbit.core.fs.db.JNDIDatabaseFileSystem">
>       <param name="dataSourceLocation" value="java:jdbc/rome"/>
>       <param name="schemaObjectPrefix" value="ver_"/>
>       <param name="schema" value="mysql"/>
>     </FileSystem>
>
>     <PersistenceManager
> class="org.apache.jackrabbit.core.persistence.db.JNDIDatabasePersistence
> Manager">
>       <param name="dataSourceLocation" value="java:jdbc/rome"/>
>       <param name="schemaObjectPrefix" value="ver_"/>
>       <param name="schema" value="mysql"/>
>       <param name="externalBLOBs" value="false"/>
>     </PersistenceManager>
>   </Versioning>
>
>   <Cluster id="test-worker0">
>     <Journal class="de.dNb.jackrabbit.core.journal.JNDIDatabaseJournal">
>       <param name="dataSourceLocation" value="java:jdbc/rome"/>
>       <param name="revision" value="${rep.home}/revision.log" />
>       <param name="driver" value="com.mysql.jdbc.Driver" />
>       <param name="schemaObjectPrefix" value="rev_"/>
>       <param name="schema" value="mysql"/>
>     </Journal>
>   </Cluster>
>
>
> <!-- NO global search index
>   <SearchIndex
>     class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
>     <param name="path" value="${rep.home}/repository/index" />
>   </SearchIndex>
> -->
> </Repository>
> ------------------------------------------------------------------------
> ----------------------------------------------
>
>
>
> Following is a stacktrace we get after the first call to the repository
> after a database inactivity phase:
>
> ------------------------------------------------------------------------
> ----------------------------------------------
> 20080110-093251.908 INFO  [ajp-18009-1] [] [DispatcherServlet] Servlet
> 'webservices' configured successfully
> 20080110-093252.010 WARN  [ajp-18009-1] [] [DbFileSystem] execute
> failed, about to reconnect...
> 20080110-093302.037 ERROR [ajp-18009-1] [] [DbFileSystem] failed to
> re-establish connection
> javax.naming.NameNotFoundException: Name jdbc is not bound in this
> Context
>         at
> org.apache.naming.NamingContext.lookup(NamingContext.java:770)
>         at
> org.apache.naming.NamingContext.lookup(NamingContext.java:153)
>         at
> org.apache.naming.SelectorContext.lookup(SelectorContext.java:137)
>         at javax.naming.InitialContext.lookup(InitialContext.java:351)
>         at
> org.apache.jackrabbit.core.fs.db.JNDIDatabaseFileSystem.getConnection(JN
> DIDatabaseFileSystem.java:74)
>         at
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.initConnection(Datab
> aseFileSystem.java:956)
>         at
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.reestablishConnectio
> n(DatabaseFileSystem.java:1026)
>         at
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.executeStmt(Database
> FileSystem.java:1071)
>         at
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.exists(DatabaseFileS
> ystem.java:328)
>         at
> org.apache.jackrabbit.core.fs.FileSystemResource.exists(FileSystemResour
> ce.java:140)
>         at
> org.apache.jackrabbit.core.lock.LockManagerImpl.<init>(LockManagerImpl.j
> ava:132)
>         at
> org.apache.jackrabbit.core.RepositoryImpl$WorkspaceInfo.getLockManager(R
> epositoryImpl.java:1608)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.getLockManager(RepositoryImpl.
> java:792)
>         at
> org.apache.jackrabbit.core.WorkspaceImpl.getLockManager(WorkspaceImpl.ja
> va:323)
>         at
> org.apache.jackrabbit.core.XASessionImpl.getLockManager(XASessionImpl.ja
> va:176)
>         at
> org.apache.jackrabbit.core.XASessionImpl.init(XASessionImpl.java:127)
>         at
> org.apache.jackrabbit.core.XASessionImpl.<init>(XASessionImpl.java:100)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.createSessionInstance(Reposito
> ryImpl.java:1313)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.createSession(RepositoryImpl.j
> ava:834)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.login(RepositoryImpl.java:1192
> )
>         at
> org.apache.jackrabbit.core.jndi.BindableRepository.login(BindableReposit
> ory.java:185)
>         at
> org.springmodules.jcr.JcrSessionFactory.getSession(JcrSessionFactory.jav
> a:268)
>         at
> org.springmodules.jcr.SessionFactoryUtils.doGetSession(SessionFactoryUti
> ls.java:79)
>         at
> org.springmodules.jcr.SessionFactoryUtils.getSession(SessionFactoryUtils
> .java:119)
>         at
> org.springmodules.jcr.support.OpenSessionInViewFilter.doFilterInternal(O
> penSessionInViewFilter.java:88)
>         at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequ
> estFilter.java:76)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
> tionFilterChain.java:215)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
> erChain.java:188)
>         at
> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFil
> terInternal(OpenSessionInViewFilter.java:174)
>         at
> de.dNb.portal.util.HibernateFilter.doFilterInternal(HibernateFilter.java
> :100)
>         at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequ
> estFilter.java:76)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
> tionFilterChain.java:215)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
> erChain.java:188)
>         at
> org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(
> CharacterEncodingFilter.java:75)
>         at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequ
> estFilter.java:76)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
> tionFilterChain.java:215)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
> erChain.java:188)
>         at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv
> e.java:210)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv
> e.java:174)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java
> :127)
>         at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java
> :117)
>         at
> org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAcc
> essLogValve.java:482)
>         at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.
> java:108)
>         at
> org.apache.catalina.cluster.tcp.ReplicationValve.invoke(ReplicationValve
> .java:347)
>         at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:1
> 51)
>         at
> org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:444)
>         at
> org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpApr
> Protocol.java:472)
>         at
> org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
>         at java.lang.Thread.run(Thread.java:595)
> 20080110-093302.038 ERROR [ajp-18009-1] [] [DbFileSystem] failed to
> check existence of file system entry: /locks
> com.mysql.jdbc.CommunicationsException: Communications link failure due
> to underlying exception:
>
> ** BEGIN NESTED EXCEPTION **
>
> java.io.EOFException
>
> STACKTRACE:
>
> java.io.EOFException
>         at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1956)
>         at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2368)
>         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2867)
>         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616)
>         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1708)
>         at com.mysql.jdbc.Connection.execSQL(Connection.java:3255)
>         at
> com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:
> 1293)
>         at
> com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:867)
>         at
> org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.execute(Delegati
> ngPreparedStatement.java:168)
>         at
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.executeStmt(Database
> FileSystem.java:1060)
>         at
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.exists(DatabaseFileS
> ystem.java:328)
>         at
> org.apache.jackrabbit.core.fs.FileSystemResource.exists(FileSystemResour
> ce.java:140)
>         at
> org.apache.jackrabbit.core.lock.LockManagerImpl.<init>(LockManagerImpl.j
> ava:132)
>         at
> org.apache.jackrabbit.core.RepositoryImpl$WorkspaceInfo.getLockManager(R
> epositoryImpl.java:1608)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.getLockManager(RepositoryImpl.
> java:792)
>         at
> org.apache.jackrabbit.core.WorkspaceImpl.getLockManager(WorkspaceImpl.ja
> va:323)
>         at
> org.apache.jackrabbit.core.XASessionImpl.getLockManager(XASessionImpl.ja
> va:176)
>         at
> org.apache.jackrabbit.core.XASessionImpl.init(XASessionImpl.java:127)
>         at
> org.apache.jackrabbit.core.XASessionImpl.<init>(XASessionImpl.java:100)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.createSessionInstance(Reposito
> ryImpl.java:1313)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.createSession(RepositoryImpl.j
> ava:834)
>         at
> org.apache.jackrabbit.core.RepositoryImpl.login(RepositoryImpl.java:1192
> )
>         at
> org.apache.jackrabbit.core.jndi.BindableRepository.login(BindableReposit
> ory.java:185)
>         at
> org.springmodules.jcr.JcrSessionFactory.getSession(JcrSessionFactory.jav
> a:268)
>         at
> org.springmodules.jcr.SessionFactoryUtils.doGetSession(SessionFactoryUti
> ls.java:79)
>         at
> org.springmodules.jcr.SessionFactoryUtils.getSession(SessionFactoryUtils
> .java:119)
>         at
> org.springmodules.jcr.support.OpenSessionInViewFilter.doFilterInternal(O
> penSessionInViewFilter.java:88)
>         at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequ
> estFilter.java:76)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
> tionFilterChain.java:215)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
> erChain.java:188)
>         at
> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFil
> terInternal(OpenSessionInViewFilter.java:174)
>         at
> de.dNb.portal.util.HibernateFilter.doFilterInternal(HibernateFilter.java
> :100)
>         at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequ
> estFilter.java:76)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
> tionFilterChain.java:215)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
> erChain.java:188)
>         at
> org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(
> CharacterEncodingFilter.java:75)
>         at
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequ
> estFilter.java:76)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
> tionFilterChain.java:215)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
> erChain.java:188)
>         at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv
> e.java:210)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv
> e.java:174)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java
> :127)
>         at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java
> :117)
>         at
> org.apache.catalina.valves.FastCommonAccessLogValve.invoke(FastCommonAcc
> essLogValve.java:482)
>         at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.
> java:108)
>         at
> org.apache.catalina.cluster.tcp.ReplicationValve.invoke(ReplicationValve
> .java:347)
>         at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:1
> 51)
>         at
> org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:444)
>         at
> org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpApr
> Protocol.java:472)
>         at
> org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
>         at java.lang.Thread.run(Thread.java:595)
>
>
> ** END NESTED EXCEPTION **
>
>
>
> Last packet sent to the server was 3 ms ago.
>         at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2579)
>         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2867)
>         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616)
>         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1708)
>         at com.mysql.jdbc.Connection.execSQL(Connection.java:3255)
>         at
> com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:
> 1293)
>         at
> com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:867)
> [...]
> ------------------------------------------------------------------------
> ----------------------------------------------
>
> *If you read this far, you are really interested in helping us* ;-)
>
> --
> Matthias Neubauer
> Deutsche Nationalbibliothek
> Informationstechnik
> Projekt kopal
> Adickesallee 1
> D-60322 Frankfurt am Main
> Telefon: +49-69-1525-1778
> Telefax: +49-69-1525-1799
> mailto:[EMAIL PROTECTED]
> http://www.d-nb.de
>

Reply via email to