问题:用seam建立ear工程,工程使用了两个数据库,当访问数据库时不要出现冲突的时候工程是没有问题的,如果同时访问两个数据库的时候就会出现数据库无法连接的现象:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection
然后所有的访问数据库都出现这个错误;
解决方法:首先采用了两个数据库,我们必须采用jta事务来处理(这里不讲jta事务的配置),主要讲解决的方法,因为seam自动生成数据源(goldeninfo-ds.xml)采用了本地数据源,不适用多库数据源,所以这里我们要创建分布式事务要配置XA的数据源(goldeninfo-xa-ds.xml),如Jboss给的示例 JBOSS/docs/examples/jca/oracle-xa-ds.xml。这里我们采用了mysql数据库,下面是XA数据源的参考配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE datasources PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
"http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
<datasources>
<xa-datasource>
<jndi-name>goldeninfoDatasource</jndi-name>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
<xa-datasource-property name="Url">jdbc:mysql://localhost:3306/goldeninfo</xa-datasource-property>
<xa-datasource-property name="User">root</xa-datasource-property>
<xa-datasource-property name="Password">root</xa-datasource-property>
<track-connection-by-tx>true</track-connection-by-tx>
<new-connection-sql>set autocommit=1</new-connection-sql>
<no-tx-separate-pools>true</no-tx-separate-pools>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</xa-datasource>
<xa-datasource>
<jndi-name>goldeninfojbpm</jndi-name>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
<xa-datasource-property name="Url">jdbc:mysql://localhost:3306/goldenjbpm</xa-datasource-property>
<xa-datasource-property name="User">root</xa-datasource-property>
<xa-datasource-property name="Password">root</xa-datasource-property>
<track-connection-by-tx>true</track-connection-by-tx>
<new-connection-sql>set autocommit=1</new-connection-sql>
<no-tx-separate-pools>true</no-tx-separate-pools>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</xa-datasource>
</datasources>
注:蓝色部分比jboss中多出来的,一定要加,不加照样不行的;记得把原来的goldeninfo-ds.xml文件去掉,因为两个数据源不能同时存在。这样还不行,你启动jboss的时候没有问题,但你登陆(既第一次访问数据库的时候)就会出现下面的错误:
2007-05-16 14:17:28,078 ERROR [org.jboss.resource.adapter.jdbc.xa.XAManagedConnectionFactory] End transaction failed for XAResource
com.mysql.jdbc.jdbc2.optional.MysqlXAException: XAER_INVAL: Invalid arguments (or unsupported command)
at com.mysql.jdbc.jdbc2.optional.MysqlXAConnection.mapXAExceptionFromSQLException(MysqlXAConnection.java:564)
我们继续,找到在jboss下的deploy/ear-deployer.xml文件修改其中的值:
<attribute name="Isolated">true</attribute>
<attribute name="CallByValue">true</attribute>
到这里就算修改完毕,启动jboss即可。
可以参考:http://seamframework.org/Community/MultipleDatasourcesAndXADatasource
http://stenlylee.iteye.com/category/53846?show_full=true
http://community.jboss.org/wiki/ConfigDataSources
http://zhangsiwei-1001.iteye.com/blog/430598
分享到:
相关推荐
JTA定义了一套规范,允许在多资源环境下进行事务管理,比如跨越多个数据库或者消息队列的服务。它包括三个主要组件:JTAS(Java Transaction Service,事务服务)、XAResource(可扩展的资源接口)和TM(Transaction...
总的来说,"多数据源事务之解决方案jta+atomikos"是Java环境下解决分布式事务问题的一种有效途径。通过JTA和Atomikos,开发者可以构建出能够处理复杂事务场景的应用,同时享受到Java EE标准带来的可移植性和灵活性。...
JOTM 是一个开源的JTA事务管理器,实现了X/Open XA规范,允许跨多个资源进行分布式事务处理。它与各种数据库和JMS提供者兼容,为Java应用提供了强大的事务管理能力。JOTM可以在Spring框架中无缝集成,通过Spring的...
JDBC事务和JTA(XA)事务是两种常见的数据库事务类型,它们都可以用来管理数据库事务,确保数据库的一致性和可靠性。 JDBC事务 JDBC事务是Java Database Connectivity(JDBC)的事务机制,它可以将多个SQL语句组合成...
JTA是Java平台的标准事务API,它允许应用程序进行跨多个数据源(如数据库或消息队列)的全局事务处理。通过JTA,开发者可以编写不关心具体事务管理细节的代码,这样就提高了代码的可移植性和可维护性。 JOTM则是JTA...
**JTA(Java Transaction API)** 是Java平台的标准事务处理API,用于管理和协调跨多个资源的事务。在分布式环境中,JTA确保数据的一致性和完整性。配置JTA,你需要设置事务管理器,例如JBoss的Atomikos或WebLogic的...
在分布式系统中,由于多个资源(如数据库、消息队列等)需要进行原子操作,因此需要一个事务管理器来协调这些操作,确保事务的ACID特性(原子性、一致性、隔离性和持久性)。Atomikos通过实现JTA规范,允许应用程序...
XA协议是数据库层面的一套分布式事务管理的规范,JTA是XA协议在Java中的实现,多个数据库或是消息厂商实现JTA接口,开发人员只需要调用SpringJTA接口即可实现JTA事务管理功能。 JTA事务比JDBC事务更强大。一个JTA事务...
JTA 支持全局事务(X/Open XA 事务),能够在多个资源(如不同数据库)之间保持事务的一致性。在本项目中,JTA 被用来协调两个或更多数据源的事务操作,确保在所有数据源上的更改要么全部成功,要么全部回滚。 4. *...
JTA是Java平台标准的一部分,用于管理跨多个数据源(如数据库、消息队列等)的事务。 在Spring框架中,JTA事务管理主要用于处理分布式系统中的事务,确保数据的一致性和完整性。Spring提供了两种主要的方式来实现...
本示例项目"spring+mybatis+jta实现多数据源的分布式事务"提供了一种解决方案,利用Spring框架、MyBatis持久层框架以及Java Transaction API (JTA)来处理跨多个数据源的事务一致性。以下是对这一技术栈及其应用的...
这篇博客"多数据源事务jta测试"可能探讨了如何在Java环境中利用JTA来实现对不同数据库的事务一致性。 JTA允许应用程序进行分布式事务处理,这意味着一个事务可以跨越多个数据库或者其他事务资源。这对于那些需要在...
这个项目整合的jar包是针对Java Transaction API (JTA) 的扩展,提供了分布式事务管理功能,使得应用程序能够在多个数据库之间进行跨库事务操作。 JTA 是Java平台标准版(Java EE)的一部分,它定义了一个接口,...
4. **XA Transactions**: JTA使用X/Open XA协议来支持两阶段提交(2PC)过程,确保跨多个资源的事务一致性。`XAResource`接口是实现这一协议的关键。 5. **TransactionSynchronizationRegistry**: 提供了在事务上...
Atomikos包含了事务协调器(Transaction Manager)和资源管理器(如XAResource),可以处理跨数据库、JMS和其他JTA兼容资源的事务。Atomikos的使用使得在不依赖特定数据库厂商API的情况下,能够在不同资源之间实现两...
这些文档可能涵盖如何在实际项目中集成JTA,解决常见问题,以及如何调试和优化事务性能等内容。 `jta-1_1-classes.zip` 文件很可能是JTA 1.1规范的实现类库,通常由Java EE应用服务器提供,例如Oracle WebLogic ...
5. **XADataSource**:这是JDBC驱动的一种扩展,它实现了`XAResource`接口,允许数据库连接参与到JTA事务中。在描述中提到了`mysql-connector-java`,这意味着我们将使用MySQL数据库,并且其JDBC驱动支持JTA。 在...
本文将深入探讨如何配置和使用Spring Boot与JTA来管理多个数据库的数据源事务。 首先,JTA是Java平台企业版(Java EE)的一部分,它提供了一种标准的方式来管理和协调跨多个数据存储的事务。在Spring Boot中,我们...
JTA的主要目标是简化在复杂分布式环境下,跨多个资源管理器进行一致性和可靠性操作的过程。它通过定义一系列接口和协议,使得开发人员能够更专注于业务逻辑的实现,而不必深入理解底层的事务管理和并发控制机制。 #...
【基于JTA的跨数据库分布式事务的实现】 在大规模的企业级应用中,常常涉及到多个数据库系统的交互,这就需要实现跨数据库的分布式事务处理。Java Transaction API(JTA)是Java平台上的标准,用于管理和协调跨多个...