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