tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Stiles <dsti...@opentext.com>
Subject Problem with accessing multiple DB2 datasources within one transaction using TomEE
Date Mon, 13 Feb 2017 16:45:21 GMT
We are in the process of porting a large and mature application from WebLogic
to TomEE. The application currently supports DB2, Oracle, SQL Server and
PostgreSQL databases. The application also has a requirement to access
multiple datasources within a single transaction. This currently works with
WebLogic and with all supported databases. It also works in the application
ported to TomEE with Oracle, SQL Server and PostgreSQL, but we have
encountered a problem when running with DB2. 

The problem we have observed is a failure to enlist the datasource that is
accessed second in the transaction. Once a connection is obtained from
DataSource.getConnection(), the first use of the connection, regardless of
the method called (e.g. prepareStatement(), getAutoCommit(), close()),
results in the exception shown below.

It is unclear to us where the actual problem is. Is it our configuration or
usage of TomEE or our datasources? Is it a problem with TomEE? Is it a
problem with DB2 or the DB2 JDBC driver? The problem has been reproduced
with TomEE 7.0.1 and TomEE 7.0.2, with DB2 10.5 and 11.1, and with both the
DB2 10.5 FP8 JDBC 4.0 driver and DB2 11.1 FP1 JDBC 4.0 driver. We have
attempted to investigate the DB2 error reported in the exception, but have
been unable to find any relevant information.

We have put together a simple test application that demonstrates the problem
and is contained in the attached package file  multids.zip
<http://tomee-openejb.979440.n4.nabble.com/file/n4681087/multids.zip>  . One
thing that the test application demonstrates is that this is not a general
problem when accessing two datasources within a single transaction when only
one of the datasources is for DB2 (i.e. when the DB2 JDBC driver is not used
for both datasources). It appears to only be a problem when both datasources
are using the same DB2 JDBC driver. This seems to suggest the problem is
with the driver, however again, the same use case works with WebLogic. That
seems to suggest the problem is with TomEE, but the same use case works with
other databases.

One other use case that was tested as an experiment during development of
the attached test application is also accessing two datasources within a
single transaction, but from within an embedded TomEE instance instead of
remotely. In this case the same problem occurs with DB2, but additionally, a
similar problem occurs with Oracle, which does not occur in the remote TomEE
case. The attached test application demonstrates both the embedded and
remote TomEE failures and with both DB2 and Oracle. Other database types
were not tested in the embedded TomEE case.

An example exception as seen with DB2 in the remote TomEE case:

09-Feb-2017 16:48:22.347 WARNING [http-nio-8080-exec-1]
org.apache.geronimo.transaction.manager.TransactionImpl.enlistResource
Unable to enlist XAResource com.ibm.db2.jcc.t4.ec@4278c5cf, errorCode: -4
 com.ibm.db2.jcc.am.XaException: [jcc][t4][10401][12066][4.19.66] XA
exception: XAER_NOTA ERRORCODE=-4228, SQLSTATE=null
	at com.ibm.db2.jcc.am.kd.c(kd.java:524)
	at com.ibm.db2.jcc.am.kd.c(kd.java:548)
	at com.ibm.db2.jcc.t4.ec.a(ec.java:2100)
	at com.ibm.db2.jcc.t4.ec.a(ec.java:2346)
	at com.ibm.db2.jcc.t4.ec.start(ec.java:1938)
	at
org.apache.geronimo.transaction.manager.TransactionImpl.enlistResource(TransactionImpl.java:202)
	at
org.apache.openejb.resource.jdbc.managed.local.ManagedConnection.invoke(ManagedConnection.java:134)
	at com.sun.proxy.$Proxy106.prepareStatement(Unknown Source)
	at com.opentext.multids.DbActions.insert(DbActions.java:61)
	at com.opentext.multids.DbActions.insert(DbActions.java:85)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205)
	at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186)
	at
org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:181)
	at
org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:100)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205)
	at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186)
	at
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:85)
	at
org.apache.openejb.core.stateful.StatefulContainer.businessMethod(StatefulContainer.java:690)
	at
org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulContainer.java:377)
	at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:265)
	at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:260)
	at
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:89)
	at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:347)
	at
com.opentext.multids.DbActions$$LocalBeanProxy.insert(com/opentext/multids/DbActions.java)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:309)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
	at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:65)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
	at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)
	at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
	at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at
org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
	at
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
	at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
	at
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784)
	at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802)
	at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410)
	at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)



--
View this message in context: http://tomee-openejb.979440.n4.nabble.com/Problem-with-accessing-multiple-DB2-datasources-within-one-transaction-using-TomEE-tp4681087.html
Sent from the TomEE Users mailing list archive at Nabble.com.

Mime
View raw message