Jboss数据源配置总结.docx
《Jboss数据源配置总结.docx》由会员分享,可在线阅读,更多相关《Jboss数据源配置总结.docx(11页珍藏版)》请在冰豆网上搜索。
![Jboss数据源配置总结.docx](https://file1.bdocx.com/fileroot1/2023-4/29/d705cfef-8727-491d-a54e-c6d68e21d0ee/d705cfef-8727-491d-a54e-c6d68e21d0ee1.gif)
Jboss数据源配置总结
Jboss数据源配置总结
2七月,2009(23:
31)|JBoss,JCA,JTA,JavaEE|By:
黎子
最近由于需求,JBoss需要同时访问两个数据库,一个主,一个从,主在很远的地方,从在很近的地方,主只写数据,从只读数据,也就是说从只查询,所有数据的更改都要在主上进行。
想想,这只要在JBoss中配置两个数据源,一个read,一个write,持久单元也定义两个,与数据源对应,由于我们代码对EntityManage进行了封装,所以inject两个EntityMnage,一个的持久单元是定义是read,一个是write,在所有数据更新的地方使用write的EntityManage,其它地方使用read就可以了。
但是在配置的过程中还是遇到了不少问题,这些问题都是对Jboss的数据源的各种配置属性不太了解的原因,所以查查Jboss的资源(Jboss的文档总是写的好简单,大多数情况下只说大概)整理如下。
在Jboss的docs\examples\jca中有各种数据库的数据源配置模版。
数据源配置文件总是以*-ds.xml文件命名,部署器是jboss-jca.sar中的XSLSubDeployer。
这其中的数据源都使用的是local-tx-datasource定义,平常用的时候也没注意它到底是什么意思,只是简单的修改其中的参数。
*-ds.xml文件中的XML结构如下:
mbean
定义数据源用到的任何MBean服务,并且这些服务要在jboss-service.xml文件中定义
local-tx-datasource
这是最常用的(至少我是这样),配置LocalTxConnectionManager服务,该ConnectionManager只支持“本地事务”,确切的说,只支持一个数据源的事务,不支持分布事务,本地不是说数据源指定的数据库在本地,可以在任何地方,但local-tx-datasource不能在一个事务中访问两个数据源,即使这两个数据源配置是一样的。
也就是一个事务中不能有两个Connection,如果有两个数据源,后面打开的数据源无法打开链接,并且出现异常:
2009-07-0212:
08:
30,892WARN [com.arjuna.ats.jta.logging.loggerI18N][com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow][com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow]Addingmultiplelastresourcesisdisallowed.Currentresourceisorg.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@7d3b91b
2009-07-0212:
08:
30,902DEBUG[org.hibernate.util.JDBCExceptionReporter]Cannotopenconnection[?
?
?
]
org.jboss.util.NestedSQLException:
Couldnotenlistintransactiononenteringmeta-awareobject!
;–nestedthrowable:
(javax.transaction.SystemException:
java.lang.Throwable:
Unabledtoenlistresource,seethepreviouswarnings.tx=TransactionImple7f000001:
dcdc:
4a4c3005:
35status:
ActionStatus.ABORT_ONLY>);–nestedthrowable:
(org.jboss.resource.JBossResourceException:
Couldnotenlistintransactiononenteringmeta-awareobject!
;–nestedthrowable:
(javax.transaction.SystemException:
java.lang.Throwable:
Unabledtoenlistresource,seethepreviouswarnings.tx=TransactionImple7f000001:
dcdc:
4a4c3005:
35status:
ActionStatus.ABORT_ONLY>))
atorg.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource
.java:
94)
atorg.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.
getConnection(InjectedDataSourceConnectionProvider.java:
47)
atorg.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:
423)
atorg.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:
144)
LocalTxConnectionManager会确保所有的链接都是同一个ManagedConnection(所以两个数据源就是两个Connection就不行),当有一个链接请示时会检查该链接是否存在,存在则用之
包含的元素
xa-datasource
该数据源配置XATxConnectionManager服务。
XA事务也就是通常所说的分布式事务。
在一个事务中可以有多个资源(如数据源),但这些资源必须能够支持XA事务,支持XA事务的数据库在docs\examples\jca目录中都有一个xa-ds.xml文件,但mysql没有,mysql是支持XA事务的(我的是mysql5,jdbc驱动是5.1.7,可以用xastart‘test’,'test’; xaend‘test’,'test’;来测试一下是否支持)
XA与JTA
XA是OpenGroup提出的分布式事务模型。
JTA是sun提出的java事务API(JavaTransactionAPI),也支持XA,或者说实现了XA,使用JTA可以与任何其它支持XA事务的应用集成。
这里有份openlink的文档:
但在我测试的时候,我本来想如果我不再需要两个数据库操作,那我是不是只需要修改数据源配置,把读和写都指定到同一个数据库就行了,代码就不用修改了,但是xa-datasource的两个数据源配置到同样的数据库有异常:
2009-07-0214:
25:
28,224DEBUG[org.hibernate.jdbc.AbstractBatcher]abouttoopenPreparedStatement(openPreparedStatements:
0,globally:
1)
2009-07-0214:
25:
28,224DEBUG[org.hibernate.jdbc.ConnectionManager]openingJDBCconnection
2009-07-0214:
25:
28,224DEBUG[org.jboss.resource.connectionmanager.IdleRemover]internalRegisterPool:
registeringpoolwithinterval900000oldinterval:
450000
2009-07-0214:
25:
28,304WARN [com.arjuna.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_INVALfor<131075,27,25,1-7f000001:
8ab7:
4a4c49ba:
6e7f000001:
8ab7:
4a4c49ba:
73
2009-07-0214:
25:
28,305ERROR[STDERR]com.mysql.jdbc.jdbc2.optional.MysqlXAException:
XAER_INVAL:
Invalidarguments(orunsupportedcommand)
2009-07-0214:
25:
28,307ERROR[STDERR] atcom.mysql.jdbc.jdbc2.optional.MysqlXAConnection.mapXAExceptionFromSQLException
(MysqlXAConnection.java:
602)
2009-07-0214:
25:
28,307ERROR[STDERR] atcom.mysql.jdbc.jdbc2.optional.MysqlXAConnection.dispatchCommand
(MysqlXAConnection.java:
585)
2009-07-0214:
25:
28,307ERROR[STDERR] atcom.mysql.jdbc.jdbc2.optional.MysqlXAConnection.start(MysqlXAConnection.java:
525)
.
.
.
.
org.jboss.util.NestedSQLException:
Couldnotenlistintransactiononenteringmeta-awareobject!
;–nestedthrowable:
(javax.transaction.SystemException:
java.lang.Throwable:
Unabledtoenlistresource,seethepreviouswarnings.tx=TransactionImple7f000001:
8ab7:
4a4c49ba:
80status:
ActionStatus.ABORT_ONLY>);–nestedthrowable:
(org.jboss.resource.JBossResourceException:
Couldnotenlistintransactiononenteringmeta-awareobject!
;–nestedthrowable:
(javax.transaction.SystemException:
java.lang.Throwable:
Unabledtoenlistresource,seethepreviouswarnings.tx=TransactionImple7f000001:
8ab7:
4a4c49ba:
80status:
ActionStatus.ABORT_ONLY>))
看mysql日志:
17Query SHOWCOLLATION
17Query SETNAMESlatin1
17Query SETcharacter_set_results=NULL
17Query SETautocommit=1
17Query SETsql_mode='STRICT_TRANS_TABLES'
17Query SELECT@@session.tx_isolation
17Query XASTART0x312d37663030303030313a386162373a34613463343962613a6134
0x37663030303030313a386162373a34613463343962613a6139,0x20003
.
.
.
18Connect root@localhostONtest
18Query /*mysql-connector-java-5.1.7(Revision:
${svn.Revision})*/
SELECT@@session.auto_increment_increment
18Query SHOWCOLLATION
18Query SETNAMESlatin1
18Query SETcharacter_set_results=NULL
18Query SETautocommit=1
18Query SETsql_mode='STRICT_TRANS_TABLES'
18Query SELECT@@session.tx_isolation
18Query XASTART0x312d37663030303030313a386162373a34613463343962613a6134,
0x37663030303030313a386162373a34613463343962613a6139,0x20003JOIN
17Query XAEND0x312d37663030303030313a386162373a34613463343962613a6134,
0x37663030303030313a386162373a34613463343962613a6139,0x20003
17Query XAROLLBACK0x312d37663030303030313a386162373a34613463343962613a6134,
0x37663030303030313a386162373a34613463343962613a6139,0x20003
或许跟两次
XASTART0×312d37663030303030313a386162373a34613463343962613a6134,
0×37663030303030313a386162373a34613463343962613a6139,0×20003
有关:
mysql有一个bug讨论的就是这个问题:
Bug#17343XAConnectiondoesn’tallowsecondXASTART.
或许这是个mysql的bug,所以如果又要要求取消两个数据库的话,只有修改一个persistence.xml,把两个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.xml文件中
jboss4.2.2GA中没有给出mysql的xa数据源定义,这里给个例子:
xmlversion="1.0"encoding="UTF-8"?
>
MySqlXADS
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
jdbc:
mysql:
//127.0.0.1:
3306/temp
username
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