A-A+
Nutz.DAO+Atomikos出现ResourceException错误
一直使用Atomikos做跨数据库的事务处理,之前都是SpringMVC+Hibernate+Atomikos,因为最近使用Nutz.DAO感觉很轻量很便捷,所以现在有一些项目使用SpringMVC+Nutz.Dao来做,今天遇到跨库需求,所以自然而然的引进了Atomikos,不过就出现了如题的错误,这个错误很奇怪,第一次请求数据库时发生,在之后就不会出现,困扰了很久,错误的具体内容如下:
HTTP Status 500 - Request processing failed; nested exception is com.atomikos.datasource.ResourceException: XA resource 'jdbc_ds2': resume for XID '3137322E31362E352E3234372E746D30303030313030303132:3137322E31362E352E3234372E746D32' raised -5: invalid arguments were given for the XA operation
数据库开始使用的是Mysql5.6,后来尝试使用Oracle时就不会再报错,所以估计是Atomikos操作Mysql时遇到了某种问题或者BUG,于是搜索相关的资料,在stackoverflow上面发现了类似的问题,地址如下:
http://stackoverflow.com/questions/27729496/atomikos-with-mysql-jta-not-working-properly
老外认为是Atomikos的一个BUG,它建议的解决办法如下:
- <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
- init-method="init" destroy-method="close">
- ...
- <property name="xaProperties">
- <props>
- <prop key="pinGlobalTxToPhysicalConnection">true</prop>
- </props>
- </property>
- </bean>
经过测试后,办法有效,但是令我困扰的是在使用Hibernate的时候,即使不加入“pinGlobalTxToPhysicalConnection”也不会报错,有时间再探索吧。下面是完整的配置内容:
- <bean id="dataSource2" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
- <property name="uniqueResourceName" value="jdbc_ds2"/>
- <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
- <property name="poolSize" value="3"/>
- <property name="maxPoolSize" value="30"/>
- <property name="minPoolSize" value="1"/>
- <property name="xaProperties">
- <props>
- <prop key="user">root</prop>
- <prop key="password">root</prop>
- <prop key="url">jdbc:mysql://127.0.0.1:3306/ceservice?useUnicode=true&charaterEncoding=utf-8</prop>
- <prop key="pinGlobalTxToPhysicalConnection">true</prop>
- </props>
- </property>
- <property name="testQuery" value="select 1"/>
- </bean>