使用JTA事务,jboss,weblogic,websphere 等等ejb容器都自带了jta事务的支持,如果你使用tomcat,jetty或者其他web容器,则需要安装第三方的jta插件,假定这里使用jboss容器,则需要在jboss中配置JNDI数据源,比如有两个mysql的数据源需要被JTA管理,则需要在jboss的server/default/deploy目录下新建两个数据源文件app1-ds.xml和app2-ds.xml,这里只拿一个文件做例子,内容如下所示:
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
jdbc:mysql://localhost:3306/test
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
完成JNDI数据源配置后,需要在spring中获取JNDI数据源,配置如下:
然后定义JTA事务如下:
通过声明式事务模板(代理),指定目标类的特定方法采用JTA事务:
追问
dataSource >在配置sql-map-config.xml 中如果有两个数据源那么着 DataSource 是不是应该配置两个,如果是 两个名字一样,如果不是那么应该怎么来配置这个。UserTransaction的value指的什么?
回答
是应该配置两个,但是为什么要配置两个数据源名字一样呢?既然是两个不同的数据库,数据源名字怎么可能一样。
java:/ctx/con/UserTransaction 是指spring访问EJB容器的资源,即容器拥有的JTA事务的API,是特定的接口,可以理解为JTA事务的驱动,不同的容器所拥有的API是不一样的,如下所示:
JBoss: "java:/ctx/con/UserTransaction"
WebLogic: "javax.transaction.UserTransaction"
WebSphere: "java:comp/UserTransaction"
追问
在我启动的时候出现了
Error initializing JtaTransactionConfig while looking up UserTransaction (java:/ctx/con/UserTransaction). Cause: javax.naming.NameNotFoundException: ctx not bound
请问下,这个空间命名,需要我自己添加 还是jboss中就有了这样的空间命名。如果没有 应在怎样添加这个文件
回答
将jboss\docs\examples\jca下的mysql-ds.xml拷贝到jboss\server\default\deploy下,并做相应修改,主要内容如下:
第一步、测试能否配置多个DataSource
第二步、测试能否配置多个SessionFactory
第三步、测试能否配置多个TransactionManager
第四步、测试能否使用多个TransactionManager,也就是看能否配置多个
第五步、测试能否配置JTATransactionManager
第六步、更换Tomcat为GlassFish,更换JDBC的DataSource为JNDI查找的DataSource,然后配置JTATransactionManager