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
