2 bissome bissome 于 2016.02.18 11:08 提问

手动jdbc连接造成已有session的中断,求大侠指点

有系统X_A,使用spring,jboss容器,连接数据库DB_A。
系统X_A有定时调度,导入数据至数据库DB_A的表T_A。

有系统X_B,使用spring,jboss容器,连接数据库DB_B。
系统X_B有定时调度,同步DB_A的T_A的数据至DB_B的T_B。X_B使用jdbc连接X_A查询T_A。

当X_A的定时导入处理未执行完,X_B的定时同步处理就启动时,X_A正在执行的事务出现异常,导致数据不完整,但是不报任何错误。
例:
X_A应该导入数据row1~row10。在执行到row5时,X_B启动了连接,然后关闭。最终X_A只导入了row5~row10,row1~row4都丢了。

请问原因是什么?是X_A的事务管理方式有问题?还是DB_A的最大连接数有问题?还是X_B多配一个DB_A的jndi,同步时使用jndi连接会好些?求解答,多谢了!

3个回答

tarenahuangdw
tarenahuangdw   2016.02.18 16:55

图片说明
如图: 可以看到有2个应用同时连接 数据库DB_A , 一个写,一个读。。。

既然是读的话,就是根据数据库存在的数据来说。。 在应用2用读的时候,数据库只有5~10.。 那就证明当前你 DB_A的数据写入没有1~5.。
几乎可以确定是你应用X_A 写入的事务控制出了问题。。。

1 猜测这种问题出现的情况:

假设:
1 spring 事务管理在service层
2 在action层 用循环调用 servcie的 删除接口。。

_ 当:service出现异常, spring 事务回滚(1~5条记录插入无效), 然后你在action 捕获异常, 继续调用接口。。
就会出现这种情况

bissome
bissome 继续调查的结果如下:在jboss的server.log中有如下信息
接近 2 年之前 回复
CQ_LW
CQ_LW   2016.02.18 11:30

X_A的事务管理有问题吧

bissome
bissome 没有头绪要怎么调整。jboss里配的jdni,由spring管理,这个怎么查原因呢?
接近 2 年之前 回复
bissome
bissome   2016.02.20 11:47

更多调查的结果如下:在jboss的server.log中有如下信息
2016-02-18 14:40:00,012 WARN [com.arjuna.ats.arjuna.logging.arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.BasicAction_58] - Abort of action id -3f575715:fc11:56c40259:4d7e invoked while multiple threads active within it.
2016-02-18 14:40:00,012 WARN [com.arjuna.ats.arjuna.logging.arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.CheckedAction_2] - CheckedAction::check - atomic action -3f575715:fc11:56c40259:4d7e aborting with 1 threads active!
如果这之后没有其他错误信息了,就会出现数据不完整的情况。
如果继续出现其他的错误信息,如:
2016-02-18 14:09:30,441 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Creating new transaction with name [cjf.transaction.db.TransactionBase.requireNewTrans]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,-Throwable
2016-02-18 14:09:30,457 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Initiating transaction commit
2016-02-18 14:10:00,019 WARN [com.arjuna.ats.arjuna.logging.arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.BasicAction_58] - Abort of action id -3f575715:fc11:56c40259:48f0 invoked while multiple threads active within it.
2016-02-18 14:10:00,019 WARN [com.arjuna.ats.arjuna.logging.arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.CheckedAction_2] - CheckedAction::check - atomic action -3f575715:fc11:56c40259:48f0 aborting with 1 threads active!
2016-02-18 14:10:00,128 WARN [org.jboss.resource.connectionmanager.TxConnectionManager] Connection error occured: org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener@b0f808[state=NORMAL mc=org.jboss.resource.adapter.jdbc.local.LocalManagedConnection@1c4853a handles=1 lastUse=1455775434916 permit=true trackByTx=true mcp=org.jboss.resource.connectionmanager.JBossManagedConnectionPool$OnePool@106d2ee context=org.jboss.resource.connectionmanager.InternalManagedConnectionPool@1020ffd xaResource=org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@6be703 txSync=null]
java.sql.SQLException: Io 异常: socket closed
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.doDescribeTable(T4CConnection.java:3253)
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3335)
at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:242)
at cjf.persist.jdbc.wrapper.ConnectionCJF.prepareStatement(ConnectionCJF.java:128)
at cjf.persist.jdbc.template.JdbcTemplateBase.update(JdbcTemplateBase.java:171)
at cjf.persist.session.executor.row.table.TableExecutorBase.executeUpdate(TableExecutorBase.java:132)
at cjf.persist.session.executor.row.table.TableExecutorBase.executeUpdateRow(TableExecutorBase.java:95)
at cjf.persist.session.executor.row.table.update.TableUpdateExecutor.insert(TableUpdateExecutor.java:71)
at cjf.module.BaseModule.saveRow(BaseModule.java:63)
at cjf.module.base.ExcelModule.billdeSave(ExcelModule.java:671)
at cjf.service.base.ExcelService.autoScanFiles(ExcelService.java:447)
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 cjf.service.BaseService.executeOperation(BaseService.java:128)
at cjf.service.BaseService.execute(BaseService.java:63)
at cjf.transaction.db.TransactionBase.transaction(TransactionBase.java:44)
at cjf.transaction.db.TransactionBase.requireNewTrans(TransactionBase.java:23)
at sun.reflect.GeneratedMethodAccessor109.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy53.requireNewTrans(Unknown Source)
at cjf.biz.service.decorater.transaction.RequireNewTransaction.service(RequireNewTransaction.java:20)
at cjf.biz.service.facade.ServiceExecutor.execute(ServiceExecutor.java:77)
at cjf.biz.service.facade.ServiceFacade.executeService(ServiceFacade.java:162)
at cjf.biz.service.facade.ServiceFacade.service(ServiceFacade.java:119)
at cjf.edi.edge.rcver.client.ClientEdiRcver.consumeReqMo(ClientEdiRcver.java:29)
at cjf.edi.edge.rcver.EdiRcverBase.receive(EdiRcverBase.java:49)
at cjf.util.MessageObjectUtil.executeServiceJson(MessageObjectUtil.java:27)
at cjf.service.base.AutoImportJob.execute(AutoImportJob.java:34)
at cjf.timertask.task.JobProxy.execute(JobProxy.java:35)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
2016-02-18 14:10:00,128 ERROR [org.jboss.resource.connectionmanager.TxConnectionManager] There is something wrong with the pooling?
java.lang.IllegalStateException: afterCompletion called with wrong tx! Expected: TxSync25182384{tx=TransactionImple < ac, BasicAction: -3f575715:fc11:56c40259:48f0 status: ActionStatus.ABORTED > wasTrackByTx=true enlisted=true}, actual: null
at org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener$TransactionSynchronization.afterCompletion(TxConnectionManager.java:819)
at org.jboss.resource.connectionmanager.TransactionSynchronizer.invokeAfter(TransactionSynchronizer.java:301)
at org.jboss.resource.connectionmanager.TransactionSynchronizer.afterCompletion(TransactionSynchronizer.java:265)
at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.afterCompletion(SynchronizationImple.java:136)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.afterCompletion(TwoPhaseCoordinator.java:340)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.cancel(TwoPhaseCoordinator.java:107)
at com.arjuna.ats.arjuna.AtomicAction.cancel(AtomicAction.java:230)
at com.arjuna.ats.arjuna.coordinator.TransactionReaper.check(TransactionReaper.java:202)
at com.arjuna.ats.internal.arjuna.coordinator.ReaperThread.run(ReaperThread.java:107)
2016-02-18 14:10:00,128 ERROR [STDERR] cjf.persist.jdbc.template.exception.ExecuteJdbcException: when execute jdbc update operation, occurs error!
Exception Context:
。。。
此时倒是比较好的情况,基本是完全失败的情况,不会有不完整数据被保存。
不明的地方在于为什么X_B用jdbc联DB_A时会造成X_A的问题。。。

准备打个补丁试试看,先把这个问题对付过去:X_A每次执行完都再查询统计一下数据条数,如果此时的事务中的数据与应有数据不符,就重新执行一遍此数据。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!