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 >
