`

JBoss Transaction

 
阅读更多

 

先给出通过JBoss容器获取JTA事务的方法

private UserTransaction getUserTransaction() throws ServletException {
UserTransaction ut;
try {
InitialContext ic = new InitialContext();
//comp java:/UserTransaction
ut = (UserTransaction) ic.lookup("java:comp/UserTransaction");
} catch(Exception e) {
throw new ServletException(e);
}
return ut;
}

经测试使用串“java:comp/UserTransaction”从JNDI获取JTA事务。启动后发现抛类型转换异常

org.jboss.tm.usertx.client.ServerVMClientUserTransaction cannot be cast to javax.transaction.UserTransaction

应用中多余引入了jta.jar导致。该jar已由JBoss提供,应用中删除即可
JTA属于分布式事务,如何结合JDBC事务呢,即在JTA事务内,对数据库的操作也具有事务特性。

通常在JBoss容器中使用数据库时,一般会在jboss-4.0.5.GA\server\default\deploy目录下面配置数据源,本地事务配置如下:

<datasources>
<local-tx-datasource>
<jndi-name>java:mysqlDS</jndi-name>
<connection-url>jdbc:mysql://192.168.0.10:1521/test</connection-url>
<driver-class>com.mysql.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>

<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
</local-tx-datasource>
</datasources>

在JBoss应用中通过JNDI获取该数据源时,JTA中对数据库的操作是不能回滚的,需要配置成分布式事务的形式,即:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<xa-datasource>
<jndi-name>mySQLDataSource</jndi-name>
<track-connection-by-tx>true</track-connection-by-tx>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
<new-connection-sql>set autocommit=1</new-connection-sql>
<no-tx-separate-pools>true</no-tx-separate-pools>
<xa-datasource-property name="Url">jdbc:mysql://127.0.0.1:3306/mytest?autoReconnect=true</xa-datasource-property>
<xa-datasource-property name="User">root</xa-datasource-property>
<xa-datasource-property name="Password">root</xa-datasource-property>

<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>

<exception-sorter-class-name>
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
</exception-sorter-class-name>
<type-mapping>mySQL</type-mapping>

<!--pooling parameters-->
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>15</idle-timeout-minutes>
</xa-datasource>
</datasources>

转自:http://www.jdon.com/jivejdon/thread/30264 的一段说明。

为了支持I2SS框架,目前的解决方式就是替换支持分布式事务的驱动,修改数据源配置将其替换成<xa-datasource>。
配置文件如下:
<datasources>
<xa-datasource>
<jndi-name>DataSource</jndi-name>
<track-connection-by-tx>true</track-connection-by-tx>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
<new-connection-sql>set autocommit=1</new-connection-sql>
<no-tx-separate-pools>true</no-tx-separate-pools>
<xa-datasource-property name="Url">jdbc:mysql://127.0.0.1:3306/sms1?autoReconnect=true</xa-datasource-property>
<xa-datasource-property name="User">smsdb</xa-datasource-property>
<xa-datasource-property name="Password">smsdb</xa-datasource-property>

<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>

<exception-sorter-class-name>
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
</exception-sorter-class-name>
<type-mapping>mySQL</type-mapping>

<!--pooling parameters-->
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>15</idle-timeout-minutes>
</xa-datasource>
</datasources>
在上述配置文件中用户色标记出的元素需要特别注意,而且这四个配置元素必须同时使用。下面将进行详细解释:
1、<no-tx-separate-pools>
这个元素的设定使得两个连接池能够分开:一个支持JTA事务的连接,另一个不支持JTA事务的连接。连接池在第一次
使用时创建。
2、<track-connection-by-tx>
当这个值设置为true时,连接管理器会保持一个XID-to-connection影射表,当事务结束时而且所有的连接关闭或者
未被引用时连接将放回连接池。这样做的副作用是不会挂起或者恢复连接的XAResource里的XID,这个行为和本地事务
是一样的。
3、<xa-datasource-class>
指定javax.sql.XASDataSource实现类的全名
4、<new-connection-sql>
当新的连接创建时执行此语句。
在我们的配置文件中,我们进行了如下配置:
<new-connection-sql> set autocommit=1</new-connection-sql>
这样做的原因是因为我们通过MySQLXADataSource中获取的连接默认被设置成autocommit 为false,如果我们的连接
并入到事务中时(即事务启动之后获取的连接),会统一由UserTransaction 进行提交。对于那些没有并入事务中的单连接,
就会出现操作一直不能提交的错误,可能出现XAER_OUTSIDE 异常。通过上述的设置,我们可以将单连接操作放入一个
隔离的连接池中,并将其设置为自动提交。
【避免此类问题的建议】
产生这个问题的原因可以归结为I2SS框架中事务处理不当,connection 封装不合理。为了适应框架改用分布式事务,
理论上讲会造成非常大的性能开销。

注意需要在JBoss中引入支持XA的数据库驱动包

获取数据源和数据库连接的方式为:

//获取数据源:
InitialContext ic = new InitialContext();
ds = (DataSource) ic.lookup("java:mySQLDataSource");

//获取连接
Connection conn = ds.getConnection();

一个事务操作实例如下:

try {
ut.begin();
Admin a = new Admin();
a.setId(2);
adminDAO.delAdmin(a);
System.out.println("before add:" + cache.get("KEY-10"));
int index = serviceWithinTx(servletResponse, cache);
System.out.println("after add:" + cache.get("KEY-10"));
printLine(servletResponse, "Bye #" + (index + 1));
ut.commit();

} catch (Exception e) {
printLine(servletResponse, "Caught a " + e.getClass() + "! Rolling Tx back");
if (!printStackTrace) {
PrintWriter s = servletResponse.getWriter();
e.printStackTrace(s);
s.flush();
}
rollbackTransaction(ut);
}

OK!在JBoss容器环境中,利用JTA分布式事务特性将应用中事务(如:Ehcache中支持获取JBoss JTA事务管理器)与数据库事务(即JDBC事务,包括多JBDC事务)组合起来的实现成功了!

分享到:
评论

相关推荐

    jboss-transaction-api

    jboss-transaction-api

    jboss-transaction

    jboss-transaction

    JBOSS架构分析.doc

    JBoss的架构分析主要集中在四个核心组件:JBoss EJB容器、JBoss Naming Service (JBossNS)、JBoss Transaction (JBossTX) 和 JBoss Container Managed Persistence (JBossCMP)。逆向工程工具允许研究人员通过源代码...

    jboss-transaction-api_1.2_spec-1.0.1.Final.jar

    java运行依赖jar包

    jboss-transaction-api_1.2_spec-1.0.0.Final.jar.zip

    java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 ...能够让JAR包里面的文件依赖于统一版本的类文件。...

    jboss-transaction-api_1.1_spec-1.0.1.Final.jar

    jboss-transaction-api_1.1_spec-1.0.1.Final.jar包 描述: There is a new version for this artifact

    rh-maven33-jboss-transaction-1.1-api-1.0.1-8.12.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    jta-1_0_1B-classes.jar

    集成JTA到项目中,开发者需要配置事务管理器,例如使用JBoss Transaction Manager或WebLogic的Transaction Service,并确保所有的持久化层(如JPA、JDBC)都支持XAResource。同时,业务逻辑层需要适当地调用...

    jboss 下载(httpwww.jboss.org)

    5. JTA(Java Transaction API):处理分布式事务管理。 总的来说,JBoss 作为一个强大的开源应用服务器,因其免费、高效、易用和丰富的功能,深受开发者喜爱。无论是小型项目还是大型企业级应用,都可以借助 JBoss...

    在jboss上部署web应用

    它提供了企业级的功能,如EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTS/JTA(Java Transaction Service / Java Transaction API)、Servlet和JSP(JavaServer Pages)、JNDI(Java Naming and ...

    jboss-4.0.5.GA.zip

    7. **Transaction管理**:JBoss提供了事务管理服务,确保了多步骤操作的原子性和一致性。 8. **安全管理**:具备用户认证和授权功能,支持JAAS(Java Authentication and Authorization Service),可实现基于角色...

    jboss7ejb配置文件

    &lt;transaction-type&gt;Container&lt;/transaction-type&gt; ``` 在`ejb-jar.xml`中,还可以定义安全性、依赖注入、定时器服务等高级特性。 `jboss-ejb3.xml`是JBoss AS 7特有的配置文件,用于扩展或覆盖`ejb-jar.xml`中...

    hibernate3下载

    4. **JTA (Java Transaction API)**: 用于管理事务,特别是在分布式环境中,可能会包含JTA实现,如JBoss Transaction API。 5. **Annotations and XML Configuration**: Hibernate 3.3.2支持使用注解和XML文件来...

    JBoss4.0中文版.pdf

    7. **事务处理**:解释JBoss的事务管理功能,如JTA(Java Transaction API)的使用,确保多操作的原子性和一致性。 8. **JMS消息队列**:介绍如何在JBoss中配置和使用JMS(Java Message Service),实现异步通信和...

    JBOSS开发人员指南

    JBoss支持JTA(Java Transaction API)来管理和协调跨系统事务。 5.2 配置与使用 开发者需要了解如何在JBoss中配置事务管理器,并在代码中使用UserTransaction接口开始、提交或回滚事务。 六、安全与权限控制 6.1...

    Jboss5源代码-官方-第一部分

    例如,`jboss.getTransaction`包下的源码涉及到JTA(Java Transaction API)的实现,而`jboss.security`包则包含安全管理相关的类和接口。 2. **模块化设计**:JBoss 5引入了模块化设计,使得不同组件之间解耦合,...

    JBOSS 架构分析

    JBoss 是一个基于Java的中间件平台,它支持J2EE的各种服务,如EJB(Enterprise JavaBeans)、JMS(Java Message Service)和JTA(Java Transaction API)。作为一个开放源代码项目,JBoss 提供了企业级应用程序所需...

    jboss-4.2.3.GA_下的jboss-4.2.3.GA_下的

    JBoss AS 4.2.3.GA(Application Server)是Red Hat公司开发的一款开源Java应用服务器,它基于Java EE(Enterprise Edition)5规范,提供了全面的企业级服务,包括EJB(Enterprise JavaBeans)、JMS(Java Message ...

    jboss-4.0.2.zip

    这个版本提供了对EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTA(Java Transaction API)等关键企业服务的支持。 2. **核心组件** - **EJB容器**:JBoss 4.0.2包含一个EJB 2.1容器,用于托管和...

Global site tag (gtag.js) - Google Analytics