Jboss数据源配置总结

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

最近由于需求,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结构如下:
jboss_ds

mbean

定义数据源用到的任何MBean服务,并且这些服务要在jboss-service.xml文件中定义

local-tx-datasource

这是最常用的(至少我是这样),配置LocalTxConnectionManager服务,该ConnectionManager只支持“本地事 务”,确切的说,只支持一个数据源的事务,不支持分布事务,本地不是说数据源指定的数据库在本地,可以在任何地方,但local-tx- datasource不能在一个事务中访问两个数据源,即使这两个数据源配置是一样的。也就是一个事务中不能有两个Connection,如果有两个数据 源,后面打开的数据源无法打开链接,并且出现异常:

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 org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@7d3b91b
2009-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.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 7f000001:dcdc:4a4c3005:35 status: ActionStatus.ABORT_ONLY >); – nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; – nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 7f000001:dcdc:4a4c3005:35 status: ActionStatus.ABORT_ONLY >))
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource

.java:94)
at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.

getConnection(InjectedDataSourceConnectionProvider.java:47)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)

LocalTxConnectionManager会确保所有的链接都是同一个ManagedConnection(所以两个数据源就是两个Connection就不行),当有一个链接请示时会检查该链接是否存在,存在则用之

包含的元素

jboss_ds_local_tx

xa-datasource

该数据源配置XATxConnectionManager服务。XA事务也就是通常所说的分布式事务。在一个事务中可以有多个资源(如数据源),但 这些资源必须能够支持XA事务,支持XA事务的数据库在docs/examples/jca目录中都有一个xa-ds.xml文件,但mysql没 有,mysql是支持XA事务的(我的是mysql 5, jdbc驱动是5.1.7,可以用 xa start ‘test’,'test’;      xa end ‘test’,'test’; 来测试一下是否支持)

XA与JTA

XA是Open Group提出的分布式事务模型。JTA是sun提出的java事务API(Java Transaction API),也支持XA,或者说实现了XA,使用JTA可以与任何其它支持XA事务的应用集成。
这里有份openlink的文档:http://docs.openlinksw.com/mt/xamt.html

但在我测试的时候,我本来想如果我不再需要两个数据库操作,那我是不是只需要修改数据源配置,把读和写都指定到同一个数据库就行了,代码就不用修改了,但是xa-datasource的两个数据源配置到同样的数据库有异常:

2009-07-02 14:25:28,224 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open PreparedStatement (open PreparedStatements: 0, globally: 1)
2009-07-02 14:25:28,224 DEBUG [org.hibernate.jdbc.ConnectionManager] opening JDBC connection
2009-07-02 14:25:28,224 DEBUG [org.jboss.resource.connectionmanager.IdleRemover] internalRegisterPool: registering pool with interval 900000 old interval: 450000
2009-07-02 14:25:28,304 WARN  [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_INVAL for < 131075, 27, 25, 1-7f000001:8ab7:4a4c49ba:6e7f000001:8ab7:4a4c49ba:73
2009-07-02 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 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 entering meta-aware object!; – nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 7f000001:8ab7:4a4c49ba:80 status: ActionStatus.ABORT_ONLY >); – nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; – nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 7f000001:8ab7:4a4c49ba:80 status: ActionStatus.ABORT_ONLY >))

看mysql日志:

17 Query       SHOW COLLATION
17 Query       SET NAMES latin1
17 Query       SET character_set_results = NULL
17 Query       SET autocommit=1
17 Query       SET sql_mode='STRICT_TRANS_TABLES'
17 Query       SELECT @@session.tx_isolation
17 Query       XA START 0x312d37663030303030313a386162373a34613463343962613a6134
,
0x37663030303030313a386162373a34613463343962613a6139,0x20003
.
.
.
18 Connect     root@localhost ON test
18 Query       /* mysql-connector-java-5.1.7 ( Revision: ${svn.Revision} ) */
SELECT
@@session.auto_increment_increment
18 Query       SHOW COLLATION
18 Query       SET NAMES latin1
18 Query       SET character_set_results = NULL
18 Query       SET autocommit=1
18 Query       SET sql_mode='STRICT_TRANS_TABLES'
18 Query       SELECT @@session.tx_isolation
18 Query       XA START 0x312d37663030303030313a386162373a34613463343962613a6134,
0x37663030303030313a386162373a34613463343962613a6139,0x20003 JOIN
17 Query       XA END 0x312d37663030303030313a386162373a34613463343962613a6134,
0x37663030303030313a386162373a34613463343962613a6139,0x20003
17 Query       XA ROLLBACK 0x312d37663030303030313a386162373a34613463343962613a6134,
0x37663030303030313a386162373a34613463343962613a6139,0x20003

或许跟两次
XA START 0×312d37663030303030313a386162373a34613463343962613a6134,

0×37663030303030313a386162373a34613463343962613a6139,0×20003
有关:mysql有一个bug讨论的就是这个问题:Bug #17343 XAConnection doesn’t allow second XA START.

或许这是个mysql的bug,所以如果又要要求取消两个数据库的话,只有修改一个persistence.xml,把两个persistence-unit的jta-data-source定义成同一个jndi了

包含的元素

jboss_ds_xa

no-tx-datasource

该数据源的链接管理噐是NoTxConnectionManager,不支持事务

包含的元素

jboss_ds_no_tx

ha-local-tx-datasource

同local-tx-datasource,区别是提供了一些容错能力允许Jboss从数据库错误中恢复。不是很理解

包含的元素

jboss_ds_ha_local

ha-xa-datasource

同ha-tx-datasource,区别是提供了一些容错能力允许Jboss从数据库错误中恢复。不是很理解

包含的元素

jboss_ds_ha_xa

多个数据源可以配置在同一个*-ds.xml文件中,也可以配置在不同的*-ds.xml文件中

jboss 4.2.2GA中没有给出mysql的xa数据源定义,这里给个例子:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<xa-datasource>
  <jndi-name>MySqlXADS</jndi-name>
  <xa-datasource-class>
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
  <xa-datasource-property name="Url">
jdbc:mysql://127.0.0.1:3306/temp</xa-datasource-property>
  <user-name>user name</user-name>
  <password>password</password>
  <exception-sorter-class-name>
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
  <metadata>
   <type-mapping>mySQL</type-mapping>
  </metadata>
</xa-datasource>
</datasources>

各配置元素说明参考文档: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

jboss配置MySQL数据源  1.     配置Jboss数据源配置。你可以到Jboss的安装目录找到JBoss/docs/examples/jca文件夹下找到mysql -ds.xml文件将它复制到JBoss/server/default/deploy目录下打开该文件。     MySqlDS    jdbc:mysql://localhost:3306/test    com.my 阅读详情

相关推荐

【算力网络】算力知识

尽管算力这个词在近年来很“火”,但其背后的含义,却很少有人真正了解

qq_42809645的博客 1万+

java jta_java-“ jta-datasource”和“ resource-local”数据源之间的区别?

术语“ jta-data source”和“ resource-local datasource”对我来说有点模糊。我猜您实际上是指EntityManagerFactory和JTA元素。 简而言之:如果持久性单元的事务类型为JTA,则EntityManagerFactory元素用于声明将用于获得连接的JTA数据源的JNDI名称。 这是常见的情况。如果持久性单元的事务类型是资源本地的,则应使用Ent...

weixin_36337823的博客 505

Ubuntu安装有线网卡驱动

问题:插入网线后,无法识别有线连接。 原因:主板有线网卡的型号和系统中网卡的驱动不匹配 解决 前提条件: 需要连wifi通网,因为需要安装dkms,和下载驱动。 删除原驱动 1、查看网卡型号 lspci | grep net 我的网卡型号是8125 2、查看网卡驱动 lspci -k 网卡驱动是r8169 3、卸载网卡驱动 找出位置 modinfo r8169 | grep filename 然后删除 rm path/r8169.ko 卸载驱动 rmmod r8169 查看是否卸载成功 lsm

weixin_43932656的博客 1万+

JBOSS使用JPA操作数据库

ejb和jpa一般会整合起来使用,但是ejb程序和别的有很大差异,使用的时候要格外注意,配置的问题很容易导致jboss报错。

技术成就梦想 2650

mysql JTA dataSource配置

<br /><datasources> <xa-datasource> <jndi-name>MySqlDS</jndi-name> <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class> <xa-datasource-property name="Url">jdbc:mysql://localhost:3306/ejb3</xa-datasource-prop

fondOfJava的专栏 4606

数据库——jdbc+jta (基础)

数据库,jdbc验证--mysql 需要哦导入驱动jar包 import java.sql.*; public class Mysql { //public static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; public static final String DBDRIVER = "com.mysql.jdbc

chx0501的专栏 520

JPA配置示例

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence           http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"

走在路上 681

JBOSS配置JNDI数据源

环境:JBOSS4.2+jdk1.6+oracle9i      项目中使用了spring注入的方式实例化数据源 1。在spring中的配置          DataSource       2。JBOSS配置数据源需要配置文件,jboss-4.2.2.GA\docs\examples\jca中用各种数据库配置文件的实例。 oracle的配置文件为:oracle-ds.x

lt26w的专栏 788

Jboss 数据源配置参数

jboss 配置参数说明

远望的天空的专栏 3480

JBOSS配置JNDI数据源

JBOSS配置JNDI数据源 spring的配置文件 我在property中的配置 ############################################ #jboss JNDI database configurati...

快马扬鞭须努力! 185

如何在jboss配置数据源

数据源配置:在jboss/doc/examples/jca,如果你的是mysql数据库,则选mysql-ds.xml       DefaultMySqlDS     jdbc:mysql://localhost:3306/itcast?useUnicode=

yjsuge的专栏 7740

Jboss数据源配置

一、jboss数据源配置信息: 数据源名称(即库名):semantic_cloud JNDI(jboss前面必须以java:开头):java:jboss/jdbc/semantic_cloud MinPoolSize :10 MaxPoolSize:100 二、代码中配置文件: 在代码中必须配好数据源名称,且要与jndi一致,如下面配置中的红

yeqingyun2012的博客 1551

jboss7 配置Oracle数据源

一、jboss7 目录结构       在 JBoss 7 中,文件系统分为两部分: 1. 独立服务器 2. 域服务器 (这是 JBoss 7 首次引入的) — 用于统一的管理多个实例 BIN: 包含启动的脚本,用来启动独立服务器(如果使用独立实例的话)或者域(使用域服务器)   DOCS: 包含服务器文档,有两个子目录,分别是 Licenses (licenses.x

不忘初心 ,方得始终 4382

JBoss配置MySql数据源

 使用JBoss配置MySql数据源                                                     Author: liuxiaohua JBoss 版本:4.xMySql 版本:5.x第一步,去MySQL的官网下一个JDBC驱动(点这里下载)。然后把解压出来的文件mysql-connector-java-5.0.7-bin.ja

Vincent的专栏 5080

jboss7配置mysql数据源,jboss 7 oracle数据源配置

I'm currently migrating from jboss 4.3 to jboss 7.1.1 (Final) and i'm trying to configure an oracle datasource but it's not working. Following is what I've done to setup an oracle datasource1)Download...

weixin_35930255的博客 273

jboss7配置mysql数据源

1  首先在%JBOSS_HOME%/modules/com/    新建   目录mysqldatabase/mysql/main           在这个目录下有三个文件  分别是  mysql-connector-java-5.1.15-bin.jar

地平线的专栏 1222

配置JBoss7数据源

JBoss7与JBoss5相比有了很大的变化,模块化加载的应用使得JBoss7的启动时间大大缩短,但同时也增加了数据源配置的复杂度(相比JBoss5来说).下面以PostgreSql为例说明一下Jboss7如何配置数据源. 创建模块 在Jboss下找到/modules/com目录,在这里你会发现有一个名为 "h2database" 的目录.这就是JBoss默认内置的数据库模块.我们

血色流年的专栏 918

Jboss6 配置数据源

1、将数据库所用的jar文件放到Jboss安装目录下的 server/**/lib/下    【**是你的EJB部署的位置,一般为default】 2、在Jboss安目录下的 docs/examples/jca/下找到各数据源配置示例,以MySql为例:将mysql-ds.xml拷贝后修改放到 **【default】下的deploy目录下 3、mysql-ds.xml配置如下

走在路上 2198

Jboss配置 Oracle数据源

C:\jbdevstudio\jboss-eap\jboss-as\server\default\deploy\MBDB.XML 前提: JBOSS_HOME=jboss的home目录(安装目录) 有测试JBoss4.2.0-GA版本 数据源的jndi名字为OracleDS   配置密码为明码的Oracle数据源 1 将%JBOSS_HOME%\docs\examples\j

kongjunlongaa的博客 1084
上一篇: compute和compute by的用法
下一篇: SQL Server主键自动增长的设置
netoxi
博客等级 码龄19年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值