- 浏览: 7656 次
- 来自: ...
文章分类
最新评论
-
zzxanadu:
这几天我也把这个例子实现了一下,JMS和JDBC全局事务都回滚 ...
使用JTA的事务处理(pro spring ch12范例)问题 -
haihai:
看看我的那个用Weblogic做的spring的jta事务的测 ...
使用JTA的事务处理(pro spring ch12范例)问题 -
wolf_jack:
楼贴问题基本查出,JTA不能支持代码中的ISOLATION_R ...
使用JTA的事务处理(pro spring ch12范例)问题 -
wolf_jack:
<div class="quote_title ...
使用JTA的事务处理(pro spring ch12范例)问题 -
wolf_jack:
<div class="quote_title ...
使用JTA的事务处理(pro spring ch12范例)问题
在实施<spring专业开发指南>中12章多事务处理范例遇到问题,当指定由JTA管理的事务执行时,相关代码进入异常抛出部分:
TestControl.java
...
try {
accountManager.insert(account);
} catch (Exception ex) {
failures++;
}
...
每次insert都失败,failures值增加.原代码insert部分如下
public void insert(Account account) {
System.out.println("come on,folks");
doInsert(account);
jmsTemplate.send(queue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("foobar");
}
});
if (random.nextInt(10) > 5) {
System.out.println("Fail now");
throw new IllegalArgumentException("fff");
}
}
将随机函数部分关闭后,所有提交仍无法成功.
配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="*"><ref local="testController"/></entry>
</map>
</property>
</bean>
<bean id="testController" class="com.apress.prospring.ch12.web.TestController">
<property name="accountManager"><ref bean="accountManager"/></property>
</bean>
</beans>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="accountDao" class="com.apress.prospring.ch12.data.SqlMapClientAccountDao">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
</bean>
<bean id="historyDao" class="com.apress.prospring.ch12.data.UnreliableSqlMapClientHistoryDao">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
</bean>
<bean id="accountManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref bean="accountManagerJTATarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
<prop key="transfer*">PROPAGATION_REQUIRED, ISOLATION_SERIALIZABLE</prop>
<prop key="deposit*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
</props>
</property>
</bean>
</beans>
已知的范例BUG有spring-xa-ds.xml,修改后如下
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<xa-datasource>
<jndi-name>XASpringDS</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:oci8:@orcl</xa-datasource-property>
<xa-datasource-property name="User">jboss</xa-datasource-property>
<xa-datasource-property name="Password">password</xa-datasource-property>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<no-tx-separate-pools/>
</xa-datasource>
<mbean
code="org.jboss.resource.adapter.jdbc.vendor.OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager</depends>
</mbean>
</datasources>
(原文中mbean为
<mbean
code="org.jboss.resource.adapter.jdbc.xa.oracle.OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager</depends>
</mbean>
注意code部分类名区别,这是使用手册的bug)
applicationContext-as.xml有人说要将
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
改为
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransactionName">
<value>UserTransaction</value>
</property>
</bean>
但实施后发现无明显区别.
需另外修改的地方包括源码ibatis目录下将Account-ora.xml和History-ora.xml改名为Account.xml,History.xml
jboss中的debug级日志如下
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@130e79e] in DispatcherServlet with name 'spring-ch12'
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Looking up handler for [/test.html]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@1b64611]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Last-Modified value for [/spring-ch12/test.html] is [-1]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] DispatcherServlet with name 'spring-ch12' received request for [/spring-ch12/test.html]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@1b64611]
2007-01-12 00:12:29,930 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Opening JDBC connection
2007-01-12 00:12:31,118 DEBUG [java.sql.Connection] {conn-100006} Connection
2007-01-12 00:12:31,118 DEBUG [java.sql.Connection] {conn-100006} Preparing Statement: select count(*) from Accounts
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Executing Statement: select count(*) from Accounts
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Parameters: []
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Types: []
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} ResultSet
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} Header: [COUNT(*)]
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} Result: [0]
2007-01-12 00:12:31,118 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Closing JDBC connection
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] Getting transaction for method 'insert' in class [com.apress.prospring.ch12.business.AccountManager]
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Using transaction object [org.springframework.transaction.jta.JtaTransactionObject@5ec9da]
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Creating new transaction
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Beginning JTA transaction
2007-01-12 00:12:31,133 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Opening JDBC connection
2007-01-12 00:12:31,133 DEBUG [java.sql.Connection] {conn-100009} Connection
2007-01-12 00:12:31,133 DEBUG [java.sql.Connection] {conn-100009} Preparing Statement: select count(*) from Accounts
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Executing Statement: select count(*) from Accounts
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Parameters: []
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Types: []
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} ResultSet
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} Header: [COUNT(*)]
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} Result: [0]
2007-01-12 00:12:31,133 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Closing JDBC connection
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.servlet.DispatcherServlet] Null ModelAndView returned to DispatcherServlet with name 'spring-ch12': assuming HandlerAdapter completed request handling
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.servlet.DispatcherServlet] Successfully completed request
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.context.support.XmlWebApplicationContext] Publishing event in context [XmlWebApplicationContext for namespace 'spring-ch12-servlet']: RequestHandledEvent: url=[/spring-ch12/test.html]; time=[1203ms]; client=[127.0.0.1]; method=[GET]; servlet=[spring-ch12]; session=[null]; user=[null]; status=[OK]
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.context.support.XmlWebApplicationContext] Publishing event in context [Root XmlWebApplicationContext]: RequestHandledEvent: url=[/spring-ch12/test.html]; time=[1203ms]; client=[127.0.0.1]; method=[GET]; servlet=[spring-ch12]; session=[null]; user=[null]; status=[OK]
2007-01-12 00:17:52,305 DEBUG [org.jboss.resource.connectionmanager.IdleRemover] run: IdleRemover notifying pools, interval: 450000
JTA事务好象启动了,但却无法进入相关代码,没有挂JTA事务的JDBC操作部分完全正常,调试发现TestController.java中的
int count = accountManager.count();
执行正常,函数被正确解析到了JTAAccountManager.java使用的代码,但使用
accountManager.insert(account);
时,代码没有进入到JTAAccountManager.java部分(标记"come on,folks"未在上述LOG中出现)
也就是说,TestControl.java中AccountManager已可被解析到其代理实现类JTAAccountManager.java,但挂接JTA部分不能正常工作
pro spring的英文电子书下载地址:
ftp://222.214.218.42/20060927/8a0a863e-cc50-401d-b0d2-fb5561322f03.chm
原书中代码下载地址:
http://www.apress.com/ApressCorporate/supplement/1/405/1590594614-2446.zip
JBOSS版本为4.0.5,XA数据源使用书中推荐的ORACLE10g,jboss405\server\default\lib目录下部署的是oracle14.jar包.
如有达人不吝指教,不胜感激
这个问题网上的解释多是classloader的问题,请检查你的.ear包,可参考
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=69587
遵循该页指导,我将.WAR的LIB下清空后问题消除.
spring-ch12.ear
|
|-spring-ch12-web.war
| |-META-INF
| |-WEB-INF
| | |-class
| | |-lib(*.jar清空)
|
|-spring-ch12-ejb.jar
| |-com
| |-META-INF
| |-*.JAR
如上图,ejb.jar中与.war中具有一些相同的JAR包,我去掉的是.war的lib中的,在本例中可行,你的程序可能需要具体尝试
http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/transaction/jta/JtaTransactionManager.html的说明:
Some well-known JNDI locations are:
"java:comp/UserTransaction" for Resin 2.x, Oracle OC4J (Orion), JOnAS (JOTM), BEA WebLogic
"java:comp/TransactionManager" for Resin 3.x
"java:pm/TransactionManager" for Borland Enterprise Server and Sun Application Server (Sun ONE 7 and later)
"java:/TransactionManager" for JBoss Application Server
当使用2.0版的的spring.jar代替在二楼贴中的1.2.8版spring.jar和aopalliance.jar后(请注意二楼贴中所列文件的大小和时间),部署spring-ch12.ear时,JBOSS的log:
...
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Retrieving JTA UserTransaction from JNDI location [java:comp/UserTransaction]
2007-01-12 18:45:07,765 DEBUG [org.springframework.jndi.JndiTemplate] Looking up JNDI object with name [java:comp/UserTransaction]
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Retrieving JTA TransactionManager from JNDI location [java:comp/TransactionManager]
2007-01-12 18:45:07,765 DEBUG [org.springframework.jndi.JndiTemplate] Looking up JNDI object with name [java:comp/TransactionManager]
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] No JTA TransactionManager found at fallback JNDI location [java:comp/TransactionManager]
org.springframework.transaction.TransactionSystemException: JTA TransactionManager is not available at JNDI location [java:comp/TransactionManager]; nested exception is javax.naming.NameNotFoundException: TransactionManager not bound
Caused by:
javax.naming.NameNotFoundException: TransactionManager not bound
...
至于为何2.0的spring.jar会出现这个问题,"Spring2.0及以后的版本中声明式事务的配置与之前的版本有相当大的不同。主要差异在于不再需要配置TransactionProxyFactoryBean了。"
这个问题网上的解释多是classloader的问题,请检查你的.ear包,可参考
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=69587
遵循该页指导,我将.WAR的LIB下清空后问题消除.
spring-ch12.ear
|
|-spring-ch12-web.war
| |-META-INF
| |-WEB-INF
| | |-class
| | |-lib(*.jar清空)
|
|-spring-ch12-ejb.jar
| |-com
| |-META-INF
| |-*.JAR
如上图,ejb.jar中与.war中具有一些相同的JAR包,我去掉的是.war的lib中的,在本例中可行,你的程序可能需要具体尝试
JBOSS好象有个J2EE的包直接支持JTA,原贴中的spring-xa-ds.xml用于JBOSS下部署一个XA事务的数据源,问的是这个吗?
TestControl.java
...
try {
accountManager.insert(account);
} catch (Exception ex) {
failures++;
}
...
每次insert都失败,failures值增加.原代码insert部分如下
public void insert(Account account) {
System.out.println("come on,folks");
doInsert(account);
jmsTemplate.send(queue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("foobar");
}
});
if (random.nextInt(10) > 5) {
System.out.println("Fail now");
throw new IllegalArgumentException("fff");
}
}
将随机函数部分关闭后,所有提交仍无法成功.
配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="*"><ref local="testController"/></entry>
</map>
</property>
</bean>
<bean id="testController" class="com.apress.prospring.ch12.web.TestController">
<property name="accountManager"><ref bean="accountManager"/></property>
</bean>
</beans>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="accountDao" class="com.apress.prospring.ch12.data.SqlMapClientAccountDao">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
</bean>
<bean id="historyDao" class="com.apress.prospring.ch12.data.UnreliableSqlMapClientHistoryDao">
<property name="dataSource"><ref bean="dataSource"/></property>
<property name="sqlMapClient"><ref bean="sqlMapClient"/></property>
</bean>
<bean id="accountManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref bean="accountManagerJTATarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
<prop key="transfer*">PROPAGATION_REQUIRED, ISOLATION_SERIALIZABLE</prop>
<prop key="deposit*">PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
</props>
</property>
</bean>
</beans>
已知的范例BUG有spring-xa-ds.xml,修改后如下
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<xa-datasource>
<jndi-name>XASpringDS</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:oci8:@orcl</xa-datasource-property>
<xa-datasource-property name="User">jboss</xa-datasource-property>
<xa-datasource-property name="Password">password</xa-datasource-property>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<no-tx-separate-pools/>
</xa-datasource>
<mbean
code="org.jboss.resource.adapter.jdbc.vendor.OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager</depends>
</mbean>
</datasources>
(原文中mbean为
<mbean
code="org.jboss.resource.adapter.jdbc.xa.oracle.OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager</depends>
</mbean>
注意code部分类名区别,这是使用手册的bug)
applicationContext-as.xml有人说要将
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
改为
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransactionName">
<value>UserTransaction</value>
</property>
</bean>
但实施后发现无明显区别.
需另外修改的地方包括源码ibatis目录下将Account-ora.xml和History-ora.xml改名为Account.xml,History.xml
jboss中的debug级日志如下
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@130e79e] in DispatcherServlet with name 'spring-ch12'
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Looking up handler for [/test.html]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@1b64611]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Last-Modified value for [/spring-ch12/test.html] is [-1]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] DispatcherServlet with name 'spring-ch12' received request for [/spring-ch12/test.html]
2007-01-12 00:12:29,930 DEBUG [org.springframework.web.servlet.DispatcherServlet] Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@1b64611]
2007-01-12 00:12:29,930 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Opening JDBC connection
2007-01-12 00:12:31,118 DEBUG [java.sql.Connection] {conn-100006} Connection
2007-01-12 00:12:31,118 DEBUG [java.sql.Connection] {conn-100006} Preparing Statement: select count(*) from Accounts
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Executing Statement: select count(*) from Accounts
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Parameters: []
2007-01-12 00:12:31,118 DEBUG [java.sql.PreparedStatement] {pstm-100007} Types: []
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} ResultSet
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} Header: [COUNT(*)]
2007-01-12 00:12:31,118 DEBUG [java.sql.ResultSet] {rset-100008} Result: [0]
2007-01-12 00:12:31,118 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Closing JDBC connection
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] Getting transaction for method 'insert' in class [com.apress.prospring.ch12.business.AccountManager]
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Using transaction object [org.springframework.transaction.jta.JtaTransactionObject@5ec9da]
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Creating new transaction
2007-01-12 00:12:31,133 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Beginning JTA transaction
2007-01-12 00:12:31,133 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Opening JDBC connection
2007-01-12 00:12:31,133 DEBUG [java.sql.Connection] {conn-100009} Connection
2007-01-12 00:12:31,133 DEBUG [java.sql.Connection] {conn-100009} Preparing Statement: select count(*) from Accounts
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Executing Statement: select count(*) from Accounts
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Parameters: []
2007-01-12 00:12:31,133 DEBUG [java.sql.PreparedStatement] {pstm-100010} Types: []
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} ResultSet
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} Header: [COUNT(*)]
2007-01-12 00:12:31,133 DEBUG [java.sql.ResultSet] {rset-100011} Result: [0]
2007-01-12 00:12:31,133 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Closing JDBC connection
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.servlet.DispatcherServlet] Null ModelAndView returned to DispatcherServlet with name 'spring-ch12': assuming HandlerAdapter completed request handling
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.servlet.DispatcherServlet] Successfully completed request
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.context.support.XmlWebApplicationContext] Publishing event in context [XmlWebApplicationContext for namespace 'spring-ch12-servlet']: RequestHandledEvent: url=[/spring-ch12/test.html]; time=[1203ms]; client=[127.0.0.1]; method=[GET]; servlet=[spring-ch12]; session=[null]; user=[null]; status=[OK]
2007-01-12 00:12:31,133 DEBUG [org.springframework.web.context.support.XmlWebApplicationContext] Publishing event in context [Root XmlWebApplicationContext]: RequestHandledEvent: url=[/spring-ch12/test.html]; time=[1203ms]; client=[127.0.0.1]; method=[GET]; servlet=[spring-ch12]; session=[null]; user=[null]; status=[OK]
2007-01-12 00:17:52,305 DEBUG [org.jboss.resource.connectionmanager.IdleRemover] run: IdleRemover notifying pools, interval: 450000
JTA事务好象启动了,但却无法进入相关代码,没有挂JTA事务的JDBC操作部分完全正常,调试发现TestController.java中的
int count = accountManager.count();
执行正常,函数被正确解析到了JTAAccountManager.java使用的代码,但使用
accountManager.insert(account);
时,代码没有进入到JTAAccountManager.java部分(标记"come on,folks"未在上述LOG中出现)
也就是说,TestControl.java中AccountManager已可被解析到其代理实现类JTAAccountManager.java,但挂接JTA部分不能正常工作
pro spring的英文电子书下载地址:
ftp://222.214.218.42/20060927/8a0a863e-cc50-401d-b0d2-fb5561322f03.chm
原书中代码下载地址:
http://www.apress.com/ApressCorporate/supplement/1/405/1590594614-2446.zip
JBOSS版本为4.0.5,XA数据源使用书中推荐的ORACLE10g,jboss405\server\default\lib目录下部署的是oracle14.jar包.
如有达人不吝指教,不胜感激
评论
9 楼
zzxanadu
2007-08-31
这几天我也把这个例子实现了一下,JMS和JDBC全局事务都回滚成功,没遇到什么问题啊,你有什么问题??
8 楼
haihai
2007-03-08
看看我的那个用Weblogic做的spring的jta事务的测试,是声明式的事务
7 楼
wolf_jack
2007-01-13
楼贴问题基本查出,JTA不能支持代码中的ISOLATION_READ_COMMITTED隔离级别.使用默认级别前述问题消除.
新问题:
1.jms消息发出后,日志:
....
2007-01-13 21:48:49,171 DEBUG [org.jboss.mq.il.uil2.SocketManager] Failed to handle: org.jboss.mq.il.uil2.msgs.CloseMsg22893735[msgType: m_connectionClosing, msgID: -2147483641, error: null]
java.io.IOException: Client is not connected
at org.jboss.mq.il.uil2.SocketManager.internalSendMessage(SocketManager.java:264)
....
很奇怪,因为后面的log显示消息已正确收到并处理.
2.JTA提交报告失败,但在sqlplus中检查,数据已提交
...
2007-01-13 21:48:49,187 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Committing JTA transaction
2007-01-13 21:48:49,250 ERROR [org.jboss.resource.adapter.jdbc.xa.XAManagedConnectionFactory] End transaction failed for XAResource
oracle.jdbc.xa.OracleXAException
at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:962)
at oracle.jdbc.xa.client.OracleXAResource.end(OracleXAResource.java:355)
...
继续等待达人路过.-_-#
新问题:
1.jms消息发出后,日志:
....
2007-01-13 21:48:49,171 DEBUG [org.jboss.mq.il.uil2.SocketManager] Failed to handle: org.jboss.mq.il.uil2.msgs.CloseMsg22893735[msgType: m_connectionClosing, msgID: -2147483641, error: null]
java.io.IOException: Client is not connected
at org.jboss.mq.il.uil2.SocketManager.internalSendMessage(SocketManager.java:264)
....
很奇怪,因为后面的log显示消息已正确收到并处理.
2.JTA提交报告失败,但在sqlplus中检查,数据已提交
...
2007-01-13 21:48:49,187 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Committing JTA transaction
2007-01-13 21:48:49,250 ERROR [org.jboss.resource.adapter.jdbc.xa.XAManagedConnectionFactory] End transaction failed for XAResource
oracle.jdbc.xa.OracleXAException
at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:962)
at oracle.jdbc.xa.client.OracleXAResource.end(OracleXAResource.java:355)
...
继续等待达人路过.-_-#
6 楼
wolf_jack
2007-01-12
wolf_jack 写道
yananay 写道
但我用JTA的事务控制时,jboss 出来log 是
not found JTA with JNDI java:comp/UserTransaction
(大概是这个意思)
这个就应该是 JTA 没配置对吧?
not found JTA with JNDI java:comp/UserTransaction
(大概是这个意思)
这个就应该是 JTA 没配置对吧?
这个问题网上的解释多是classloader的问题,请检查你的.ear包,可参考
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=69587
遵循该页指导,我将.WAR的LIB下清空后问题消除.
spring-ch12.ear
|
|-spring-ch12-web.war
| |-META-INF
| |-WEB-INF
| | |-class
| | |-lib(*.jar清空)
|
|-spring-ch12-ejb.jar
| |-com
| |-META-INF
| |-*.JAR
如上图,ejb.jar中与.war中具有一些相同的JAR包,我去掉的是.war的lib中的,在本例中可行,你的程序可能需要具体尝试
http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/transaction/jta/JtaTransactionManager.html的说明:
Some well-known JNDI locations are:
"java:comp/UserTransaction" for Resin 2.x, Oracle OC4J (Orion), JOnAS (JOTM), BEA WebLogic
"java:comp/TransactionManager" for Resin 3.x
"java:pm/TransactionManager" for Borland Enterprise Server and Sun Application Server (Sun ONE 7 and later)
"java:/TransactionManager" for JBoss Application Server
当使用2.0版的的spring.jar代替在二楼贴中的1.2.8版spring.jar和aopalliance.jar后(请注意二楼贴中所列文件的大小和时间),部署spring-ch12.ear时,JBOSS的log:
...
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Retrieving JTA UserTransaction from JNDI location [java:comp/UserTransaction]
2007-01-12 18:45:07,765 DEBUG [org.springframework.jndi.JndiTemplate] Looking up JNDI object with name [java:comp/UserTransaction]
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Retrieving JTA TransactionManager from JNDI location [java:comp/TransactionManager]
2007-01-12 18:45:07,765 DEBUG [org.springframework.jndi.JndiTemplate] Looking up JNDI object with name [java:comp/TransactionManager]
2007-01-12 18:45:07,765 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] No JTA TransactionManager found at fallback JNDI location [java:comp/TransactionManager]
org.springframework.transaction.TransactionSystemException: JTA TransactionManager is not available at JNDI location [java:comp/TransactionManager]; nested exception is javax.naming.NameNotFoundException: TransactionManager not bound
Caused by:
javax.naming.NameNotFoundException: TransactionManager not bound
...
至于为何2.0的spring.jar会出现这个问题,"Spring2.0及以后的版本中声明式事务的配置与之前的版本有相当大的不同。主要差异在于不再需要配置TransactionProxyFactoryBean了。"
5 楼
wolf_jack
2007-01-12
yananay 写道
但我用JTA的事务控制时,jboss 出来log 是
not found JTA with JNDI java:comp/UserTransaction
(大概是这个意思)
这个就应该是 JTA 没配置对吧?
not found JTA with JNDI java:comp/UserTransaction
(大概是这个意思)
这个就应该是 JTA 没配置对吧?
这个问题网上的解释多是classloader的问题,请检查你的.ear包,可参考
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=69587
遵循该页指导,我将.WAR的LIB下清空后问题消除.
spring-ch12.ear
|
|-spring-ch12-web.war
| |-META-INF
| |-WEB-INF
| | |-class
| | |-lib(*.jar清空)
|
|-spring-ch12-ejb.jar
| |-com
| |-META-INF
| |-*.JAR
如上图,ejb.jar中与.war中具有一些相同的JAR包,我去掉的是.war的lib中的,在本例中可行,你的程序可能需要具体尝试
4 楼
yananay
2007-01-12
但我用JTA的事务控制时,jboss 出来log 是
not found JTA with JNDI java:comp/UserTransaction
(大概是这个意思)
这个就应该是 JTA 没配置对吧?
not found JTA with JNDI java:comp/UserTransaction
(大概是这个意思)
这个就应该是 JTA 没配置对吧?
3 楼
wolf_jack
2007-01-12
yananay 写道
楼主 jboss 里怎么配置 JTA 啊?
谢谢了:)
谢谢了:)
JBOSS好象有个J2EE的包直接支持JTA,原贴中的spring-xa-ds.xml用于JBOSS下部署一个XA事务的数据源,问的是这个吗?
2 楼
yananay
2007-01-12
楼主 jboss 里怎么配置 JTA 啊?
谢谢了:)
谢谢了:)
1 楼
wolf_jack
2007-01-12
忘记说明,使用ant编译原书代码中build.xml配置时,生成的.ear文件有classloader问题,可将.war中的lib下文件全部去掉解决(.ejb下保有应有的lib文件).
我的build.xml使用的lib文件列表为
2004-08-24 21:37 100,776 commons-dbcp.jar
2006-11-22 19:44 1,223,877 xercesImpl.jar
2006-08-07 12:56 79,151 qdox-1.5.jar
2004-11-13 21:50 1,348,814 spring.jar
2006-11-30 17:18 383,531 ibatis-2.3.0.677.jar
2004-08-24 21:37 39,523 commons-pool.jar
2004-08-24 21:37 210,908 pg74.213.jdbc3.jar
2004-09-16 16:57 91,627 servlet-api.jar
2006-12-21 17:58 36,452 commons-attributes-api.jar
2006-12-21 18:46 29,590 commons-attributes-compiler.jar
2006-12-21 18:48 3,199 commons-attributes-plugin.jar
2004-09-16 16:57 12,822 ejb.jar
2004-08-18 20:58 4,467 aopalliance.jar
2004-09-16 16:57 25,998 jms.jar
这并非是最简的,但编译可用
我的build.xml使用的lib文件列表为
2004-08-24 21:37 100,776 commons-dbcp.jar
2006-11-22 19:44 1,223,877 xercesImpl.jar
2006-08-07 12:56 79,151 qdox-1.5.jar
2004-11-13 21:50 1,348,814 spring.jar
2006-11-30 17:18 383,531 ibatis-2.3.0.677.jar
2004-08-24 21:37 39,523 commons-pool.jar
2004-08-24 21:37 210,908 pg74.213.jdbc3.jar
2004-09-16 16:57 91,627 servlet-api.jar
2006-12-21 17:58 36,452 commons-attributes-api.jar
2006-12-21 18:46 29,590 commons-attributes-compiler.jar
2006-12-21 18:48 3,199 commons-attributes-plugin.jar
2004-09-16 16:57 12,822 ejb.jar
2004-08-18 20:58 4,467 aopalliance.jar
2004-09-16 16:57 25,998 jms.jar
这并非是最简的,但编译可用
相关推荐
在Spring中使用JTA事务管理 1 通过集成JOTM,直接在Spring中使用JTA事务 1.1. 将JOTM以下类库添加到类路径中 1.2. 编写JOTM配置文件,放到类路径下 1.3. 在MySQL上建立两个数据库 1.4. 在Spring配置文件中配置JOTM ...
JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。 要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。
JTA分布式事务处理多数据事务问题的示例代码。
JTA配置文件请看applicationContext-jta.xml 博文链接:https://liran-email.iteye.com/blog/227990
spring + JTA + JOTM实现分布式事务, 高大上的技术
Spring+iBatis+JOTM实现JTA事务
如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中...
atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA) 结合spring 和durid进行配置,
分布式事务操作之Spring+JTA+mybatis源码
博客上有很多类似的,很多都有点小错误。还是自己搭建测试的好用。resource中有sql,自己创建两个数据库导入sql,即可运行test测试
Spring Boot+Druid+Mybatis实现JTA分布式事务
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
在tomcat 中配置JTA 事务,方便管理web项目
2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...
NULL 博文链接:https://sjsky.iteye.com/blog/1112012
1.利用mina框架重构api,脱离了web应用服务器resin,而原api的jta事务由resin支持,故需要用其他支持jta事务的工具重新配置。在支持jta事务的工具中选择了atomikos 2.Api的数据库连接配置参数没有类似:testQuery的...
有关JDBC事务 JTA事务 传播特性 隔离级别等等
spring + JTA + atomikos实现分布式事务, 高大上的技术
例子虽小,可覆盖面广,设计spring载入.properties文件,spring配置jta和jotm分布式事务,设置数据源连接池,注解事务驱动。功能是在mysql上建立了两个数据库分别为dbone和dbtwo,在dbone里有表tb1,表中只有一个字段...