Hi Dainius, I could easily reproduce your scenario with a clustered setup and MySQL backend. Apparently, other backends are more tolerant when calling commit() on a connection that is already in auto-commit mode. I filed a JIRA issue for this:
https://issues.apache.org/jira/browse/JCR-1254 and fixed it in the main trunk. Thank you very much for reporting! On 04/12/2007, dainius rygelis <[EMAIL PROTECTED]> wrote: > Hi Dominique, > > Yes, we're using 1.3.3. > > Two more questions... > Are the DatabaseJournal sql operations supposed in their own transaction? Yes. > Also, why the use of a single connection vs obtaining a new one when needed > from the connection pool supported datasource in the DatabaseJournal, > DbFileSystem/JNDIDatabaseFileSystem and > BundleDbPersistenceManager/JNDIDatabasePersistenceManager implementations? There are PreparedStatements inside these classes that one would have to prepare every time a connection is obtained from the pool. Kind regards Dominique > Appreciate your help, > Dainius > > -----Original Message----- > From: Dominique Pfister [mailto:[EMAIL PROTECTED] > Sent: December-04-07 4:15 AM > To: [email protected] > Subject: Re: autcommit in DatabaseJournal.append > > Hi Dainius, > > your configuration looks fine to me and I don't think you're using > DatabaseJournal incorrectly. You're using Jackrabbit 1.3.3, right? > When appending new entries to the journal, the order of calls on the journal > and corresponding actions on the database connection is as > follows: > > Journal Connection > > lock() autocommit=false > append() commit or rollback > unlock() autocommit=true > > In your stack trace commit() is called while the connection is in autocommit > mode, which implies that some other component already unlocked the journal. > I'm going to investigate the calls made on behalf of the journal when a > transaction - updating both a workspace and the versioning space - is > committed. > > Kind regards > Dominique > > On 03/12/2007, dainius rygelis <[EMAIL PROTECTED]> wrote: > > Hi, we're fairly new to jackrabbit and are evaluating it for use in a > > highly available deployment. We're looking at using the database journal > > but are encountering problems. Jackrabbit has been deployed as resource > > adapter on glassfish and works great until we attempt to use the database > > journal. > > The jackrabbit resource adapter is enlisted in a container managed > > transaction through a resource environment reference in a session bean. > > When the container attempts to commit or rollback the transaction an error > > is thrown because DatabaseJournal.append has called connection.commit and > > attempted to set autocommit to true. Are we using DatabaseJournal > > incorrectly? > > > > Here's the snippet of our config that's causing the problem. > > <Cluster id="node1"> > > <Journal class="org.apache.jackrabbit.core.journal.DatabaseJournal"> > > <param name="revision" value="${rep.home}/revision.log" /> > > <param name="driver" value="com.mysql.jdbc.Driver" /> > > <param name="url" value="jdbc:mysql://localhost/######" /> > > <param name="user" value="######" /> > > <param name="password" value="#######" /> > > <param name="schema" value="mysql" /> > > <param name="schemaObjectPrefix" value="global_" /> > > </Journal> > > </Cluster> > > > > > > Here's the relevant test code from the session bean.. > > > > @Stateless > > @TransactionManagement(value = TransactionManagementType.CONTAINER) > > public class JackrabbitFacadeBean implements JackrabbitFacadeLocal { > > > > @Resource(name = "jcr/repository", shareable = true, type = > > Repository.class) > > private Repository repository; > > > > ...... > > ...... > > ...... > > > > public String saveDocument(String parentNode, String document) { > > if (LOGGER.isDebugEnabled()) { > > LOGGER.debug("saveDocument(" + parentNode + ", " + document + > > ") - start"); > > } > > SimpleCredentials credentials = new SimpleCredentials("######", > > "######".toCharArray()); > > String uuid = null; > > try { > > InputStream stream = new > > ByteArrayInputStream(document.getBytes()); > > Session session = repository.login(credentials); > > Node root = session.getRootNode(); > > dump(root); > > if (!root.hasNode(parentNode)) { > > Node node = root.addNode(parentNode, "nt:unstructured"); > > uuid = node.getPath(); > > }else{ > > Node node = root.getNode(parentNode); > > uuid = node.getPath(); > > } > > session.importXML("/" + parentNode, stream, > > ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW); > > stream.close(); > > session.save(); > > dump(root); > > session.logout(); > > } catch (Exception e) { > > LOGGER.fatal(e.getLocalizedMessage(), e); > > throw new RuntimeException(e); > > } > > if (LOGGER.isDebugEnabled()) { > > LOGGER.debug("saveDocument() - end return value=" + uuid); > > } > > return uuid; > > } > > > > and the stack trace... > > > > 2007-12-03 > > 16:56:05,WARN,org.apache.jackrabbit.core.journal.DatabaseJournal,httpS > > SLWorkerThread-8080-1 Error while rolling back connection: Can't call > > rollback when autocommit=true > > 2007-12-03 > > 16:56:05,ERROR,org.apache.jackrabbit.core.cluster.ClusterNode,httpSSLWorkerThread-8080-1 > > Unable to commit log entry. > > org.apache.jackrabbit.core.journal.JournalException: Unable to append > > revision 4. > > at > > org.apache.jackrabbit.core.journal.DatabaseJournal.append(DatabaseJournal.java:322) > > at > > org.apache.jackrabbit.core.journal.AppendRecord.update(AppendRecord.java:251) > > at > > org.apache.jackrabbit.core.cluster.ClusterNode$WorkspaceUpdateChannel.updateCommitted(ClusterNode.java:614) > > at > > org.apache.jackrabbit.core.state.SharedItemStateManager$Update.end(SharedItemStateManager.java:725) > > at > > org.apache.jackrabbit.core.state.XAItemStateManager.commit(XAItemStateManager.java:162) > > at > > org.apache.jackrabbit.core.version.XAVersionManager.commit(XAVersionManager.java:475) > > at > > org.apache.jackrabbit.core.TransactionContext.commit(TransactionContext.java:177) > > at > > org.apache.jackrabbit.core.XASessionImpl.commit(XASessionImpl.java:339) > > at > > org.apache.jackrabbit.jca.TransactionBoundXAResource.commit(TransactionBoundXAResource.java:39) > > at > > com.sun.jts.jtsxa.OTSResourceImpl.commit_one_phase(OTSResourceImpl.java:166) > > at > > com.sun.jts.CosTransactions.RegisteredResources.commitOnePhase(RegisteredResources.java:1575) > > at > > com.sun.jts.CosTransactions.TopCoordinator.commitOnePhase(TopCoordinator.java:2949) > > at > > com.sun.jts.CosTransactions.CoordinatorTerm.commit(CoordinatorTerm.java:317) > > at > > com.sun.jts.CosTransactions.TerminatorImpl.commit(TerminatorImpl.java:249) > > at > > com.sun.jts.CosTransactions.CurrentImpl.commit(CurrentImpl.java:623) > > at > > com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:309) > > at > > com.sun.enterprise.distributedtx.J2EETransactionManagerImpl.commit(J2EETransactionManagerImpl.java:1030) > > at > > com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.commit(J2EETransactionManagerOpt.java:397) > > at > > com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3792) > > at > > com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571) > > at > > com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354) > > at > > com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316) > > at > > com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:205) > > at > > com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:127) > > at $Proxy24.saveDocument(Unknown Source) > > at > > pps.jackrabbit.demo.web.bean.JackRabbitTestBean.submit(JackRabbitTestBean.java:42) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > > at > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > > at java.lang.reflect.Method.invoke(Method.java:597) > > at com.sun.el.parser.AstValue.invoke(AstValue.java:187) > > at > > com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) > > at > > javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77) > > at > > com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91) > > at javax.faces.component.UICommand.broadcast(UICommand.java:383) > > at > > javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447) > > at > > javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752) > > at > > com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97) > > at > > com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) > > at > > com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) > > at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) > > at > > org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411) > > at > > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:290) > > at > > org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271) > > at > > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202) > > at > > org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) > > at > > org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) > > at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) > > at > > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206) > > at > > org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) > > at > > org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) > > at > > org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) > > at > > org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) > > at > > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150) > > at > > org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) > > at > > org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) > > at > > org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) > > at > > org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) > > at > > org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:270) > > at > > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637) > > at > > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568) > > at > > com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813) > > at > > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:339) > > at > > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:261) > > at > > com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:212) > > at > > com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:361) > > at > > com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) > > at > > com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWo > > rkerThread.java:106) Caused by: java.sql.SQLException: Can't call > > commit when autocommit=true > > at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:914) > > at com.mysql.jdbc.Connection.commit(Connection.java:2273) > > at > > org.apache.jackrabbit.core.journal.DatabaseJournal.append(DatabaseJournal.java:311) > > ... 67 more > > > > Thanks for your help, > > Dainius > > > >
