1、Jboss数据源配置总结Jboss数据源配置总结2 七月, 2009 (23:31) | JBoss, JCA, JTA, Java EE | By: 黎子最近由于需求,JBoss需要同时访问两个数据库,一个主,一个从,主在很远的地方,从在很近的地方,主只写数据,从只读数据,也就是说从只查询, 所有数据的更改都要在主上进行。想想,这只要在JBoss中配置两个数据源,一个read,一个write,持久单元也定义两个,与数据源对应,由于我们 代码对EntityManage进行了封装,所以inject两个EntityMnage,一个的持久单元是定义是read,一个是write,在所有数 据更新的地方
2、使用write的EntityManage,其它地方使用read就可以了。但是在配置的过程中还是遇到了不少问题,这些问题都是对 Jboss的数据源的各种配置属性不太了解的原因,所以查查Jboss的资源(Jboss的文档总是写的好简单,大多数情况下只说大概)整理如下。在 Jboss的docsexamplesjca中有各种数据库的数据源配置模版。数据源配置文件总是以*-ds.xml文件命名,部署器是jboss- jca.sar中的XSLSubDeployer。这其中的数据源都使用的是local-tx-datasource定义,平常用的时候也没注意它到底是 什么意思,只是简单的修改其中的参数。*-ds
3、.xml文件中的XML结构如下:mbean定义数据源用到的任何MBean服务,并且这些服务要在jboss-service.xml文件中定义local-tx-datasource这是最常用的(至少我是这样),配置LocalTxConnectionManager服务,该ConnectionManager只支持“本地事 务”,确切的说,只支持一个数据源的事务,不支持分布事务,本地不是说数据源指定的数据库在本地,可以在任何地方,但local-tx- datasource不能在一个事务中访问两个数据源,即使这两个数据源配置是一样的。也就是一个事务中不能有两个Connection,如果有两个数据 源,后面
4、打开的数据源无法打开链接,并且出现异常:2009-07-02 12:08:30,892 WARN com.arjuna.ats.jta.logging.loggerI18N com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow Adding multiple last resources is disallowed. Current resource is o
5、rg.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource7d3b91b2009-07-02 12:08:30,902 DEBUG org.hibernate.util.JDBCExceptionReporter Cannot open connection ?org.jboss.util.NestedSQLException: Could not enlist in transaction on entering meta-aware object!; nested throwable: (javax.tra
6、nsaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple ); nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; nested throwable: (javax.transaction.SystemExcept
7、ion: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple )at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:94)at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConn
8、ectionProvider.java:47)at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)LocalTxConnectionManager会确保所有的链接都是同一个ManagedConnection(所以两个数据源就是两个 Connection就不行),当有一个链接请示时会检查该链接是否存在,存在则用之包含的元素xa
9、-datasource该数据源配置XATxConnectionManager服务。XA事务也就是通常所说的分布式事务。在一个事务中可以有多个资源(如数据源),但 这些资源必须能够支持XA事务,支持XA事务的数据库在docsexamplesjca目录中都有一个xa-ds.xml文件,但mysql没 有,mysql是支持XA事务的(我的是mysql 5, jdbc驱动是5.1.7,可以用 xa start test,test; xa end test,test; 来测试一下是否支持)XA与JTAXA是Open Group提出的分布式事务模型。JTA是sun提出的java事务API(Java Tra
10、nsaction API),也支持XA,或者说实现了XA,使用JTA可以与任何其它支持XA事务的应用集成。这里有份openlink的文档:但在我测试的时候,我本来想如果我不再需要两个数据库操作,那我是不是只需要修改数据源配置,把读和写都指定到同一个数据库就行了,代码就不用修改 了,但是xa-datasource的两个数据源配置到同样的数据库有异常:2009-07-02 14:25:28,224 DEBUG org.hibernate.jdbc.AbstractBatcher about to open PreparedStatement (open PreparedStatements: 0,
11、 globally: 1)2009-07-02 14:25:28,224 DEBUG org.hibernate.jdbc.ConnectionManager opening JDBC connection2009-07-02 14:25:28,224 DEBUG org.jboss.resource.connectionmanager.IdleRemover internalRegisterPool: registering pool with interval 900000 old interval: 4500002009-07-02 14:25:28,304 WARN com.arjun
12、a.ats.jta.logging.loggerI18N com.arjuna.ats.internal.jta.transaction.arjunacore.xastart com.arjuna.ats.internal.jta.transaction.arjunacore.xastart TransactionImple.enlistResource xa_start caught: XAException.XAER_INVAL for 131075, 27, 25, 1-7f000001:8ab7:4a4c49ba:6e7f000001:8ab7:4a4c49ba:732009-07-0
13、2 14:25:28,305 ERROR STDERR com.mysql.jdbc.jdbc2.optional.MysqlXAException: XAER_INVAL: Invalid arguments (or unsupported command)2009-07-02 14:25:28,307 ERROR STDERR at com.mysql.jdbc.jdbc2.optional.MysqlXAConnection.mapXAExceptionFromSQLException(MysqlXAConnection.java:602)2009-07-02 14:25:28,307
14、ERROR STDERR at com.mysql.jdbc.jdbc2.optional.MysqlXAConnection.dispatchCommand(MysqlXAConnection.java:585)2009-07-02 14:25:28,307 ERROR STDERR at com.mysql.jdbc.jdbc2.optional.MysqlXAConnection.start(MysqlXAConnection.java:525).org.jboss.util.NestedSQLException: Could not enlist in transaction on e
15、ntering meta-aware object!; nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple ); nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware ob
16、ject!; nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple )看mysql日志:17 Query SHOW COLLATION17 Query SET NAMES latin117 Query SET character_set_results = NULL17 Query SET autocommit=117 Query SET sql_mo
17、de=STRICT_TRANS_TABLES17 Query SELECT session.tx_isolation17 Query XA START 0x312d37663030303030313a386162373a34613463343962613a6134,0x37663030303030313a386162373a34613463343962613a6139,0x20003.18 Connect rootlocalhost ON test18 Query /* mysql-connector-java-5.1.7 ( Revision: $svn.Revision ) */SELEC
18、T session.auto_increment_increment18 Query SHOW COLLATION18 Query SET NAMES latin118 Query SET character_set_results = NULL18 Query SET autocommit=118 Query SET sql_mode=STRICT_TRANS_TABLES18 Query SELECT session.tx_isolation18 Query XA START 0x312d37663030303030313a386162373a34613463343962613a6134,
19、0x37663030303030313a386162373a34613463343962613a6139,0x20003 JOIN17 Query XA END 0x312d37663030303030313a386162373a34613463343962613a6134,0x37663030303030313a386162373a34613463343962613a6139,0x2000317 Query XA ROLLBACK 0x312d37663030303030313a386162373a34613463343962613a6134,0x37663030303030313a3861
20、62373a34613463343962613a6139,0x20003或许跟两次XA START 0312d37663030303030313a386162373a34613463343962613a6134,037663030303030313a386162373a34613463343962613a6139,020003有关:mysql有一个bug讨论的就是这个问题:Bug #17343 XAConnection doesnt allow second XA START.或许这是个mysql的bug,所以如果又要要求取消两个数据库的话,只有修改一个persistence.xml,把两个
21、persistence-unit的jta-data-source定义成同一个jndi了包含的元素no-tx-datasource该数据源的链接管理噐是NoTxConnectionManager,不支持事务包含的元素ha-local-tx-datasource同local-tx-datasource,区别是提供了一些容错能力允许Jboss从数据库错误中恢复。不是很理解包含的元素ha-xa-datasource同ha-tx-datasource,区别是提供了一些容错能力允许Jboss从数据库错误中恢复。不是很理解包含的元素多个数据源可以配置在同一个*-ds.xml文件中,也可以配置在不同的*-ds
22、.xml文件中jboss 4.2.2GA中没有给出mysql的xa数据源定义,这里给个例子: MySqlXADS com.mysql.jdbc.jdbc2.optional.MysqlXADataSource jdbc:mysql:/127.0.0.1:3306/temp user name password org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter mySQL 各配置元素说明参考文档:http:/www.jboss.org/file-access/default/members/jbossas/freezone/docs/Server_Configuration_Guide/4/html/Connectors_on_JBoss-Configuring_JDBC_DataSources.html#Configuring_JDBC_DataSources-The_non_transactional_DataSource_configuration_schema
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1