Tomcat 结合Atomikos 实现JTA
来源:互联网 发布:淘宝联盟api免费申请 编辑:程序博客网 时间:2024/06/05 06:46
Tomcat下配置Atomikos实现JTA
Tomcat作为一款经典的Web服务器,在开发、测试和生产环境中得到了广泛的使用。但Tomcat毕竟不是Java EE服务器,因此在EJB,JTA方面并没有提供支持。本文讲述了Tomcat使用Atomikos实现JTA的一种方法。
在Tomcat中使用JTA,可以将Atomikos部署在Tomcat中,使用Tomcat支持的数据源;也可以在项目中配置,利用Spring配置好数据源、连接池、事务管理器等等。两种方式各有特点,本文只介绍Tomcat与Atomikos的集成,集成后Tomcat可以对外提供JTA的事务管理器和数据源。
在使用Atomikos之前,我们也曾使用过JOTM,不过在高并发的情况下,JOTM频频出错,最后不得不放弃,通过测试,发现Atomikos性能和稳定性都不错。
我们使用了Atomikos最新的4.04版本,Jar包的获取可以从maven的配置库中得到,链接地址:http://mvnrepository.com/artifact/com.atomikos
如果不使用Hibernate,需要的包包括:
atomikos-util.jar,jta.jar,transactions.jar,transactions-api.jar,transactions-jdbc.jar,
transactions-jta.jar
配置步骤如下:
Step 1:将这些jar 拷贝到tomcat 的lib 目录中。要实现Tomcat与Atomikos集成,还需要一个集成包,这个集成包里面有两个class,可以自己参考实现,也可以使用官方提供的jar包,最新的是atomikos-integration-extension-3.7.2.jar
Step2:在tomcat/config/server.xml中 增加一个监听器
<Listener className="com.atomikos.tomcat.AtomikosLifecycleListener" />
Step3:在tomcat/config/context.xml中增加数据源和相关的事务管理器,下面是一个参考的例子,参数酌情修改
<Resource name="jdbc/DS_MYSQL"
auth="Container"
type="com.atomikos.jdbc.AtomikosDataSourceBean"
uniqueResourceName="jdbc/DS_MYSQL"
xaDataSourceClassName="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
xaProperties.databaseName="db_test"
xaProperties.serverName="localhost"
xaProperties.port="3306"
xaProperties.user="root"
xaProperties.password="root"
maxPoolSize="200"
xaProperties.url="jdbc:mysql://localhost:3306/db_test?characterEncoding=UTF8"
factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory" />
<Resource name="UserTransaction"
auth="Container"
type="javax.transaction.UserTransaction" />
<Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory" />
Step4:在tomcat/lib目录下增加一个jta.properties文件,设置Atomikos事务相关的参数,否则将使用默认的配置参数,一些并发事务数(默认50个),超时时间等都需要调整,下面给出了文件中的一些参数配置,参数解释请查阅官方文档:https://www.atomikos.com/Documentation/JtaProperties
# SAMPLE PROPERTIES FILE FOR THE TRANSACTION SERVICE
# THIS FILE ILLUSTRATES THE DIFFERENT SETTINGS FOR THE TRANSACTION MANAGER
# UNCOMMENT THE ASSIGNMENTS TO OVERRIDE DEFAULT VALUES;
# Required: factory implementation class of the transaction core.
# NOTE: there is no default for this, so it MUST be specified!
#
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
# Set base name of file where messages are output
# (also known as the 'console file').
#
# com.atomikos.icatch.console_file_name = tm.out
# Size limit (in bytes) for the console file;
# negative means unlimited.
#
# com.atomikos.icatch.console_file_limit=-1
# For size-limited console files, this option
# specifies a number of rotating files to
# maintain.
#
# com.atomikos.icatch.console_file_count=1
# Set the number of log writes between checkpoints
#
# com.atomikos.icatch.checkpoint_interval=500
# Set output directory where console file and other files are to be put
# make sure this directory exists!
#
# com.atomikos.icatch.output_dir = ./
# Set directory of log files; make sure this directory exists!
#
# com.atomikos.icatch.log_base_dir = ./
# Set base name of log file
# this name will be used as the first part of
# the system-generated log file name
#
# com.atomikos.icatch.log_base_name = tmlog
# Set the max number of active local transactions
# or -1 for unlimited.
#
# com.atomikos.icatch.max_actives = 50
# Set the default timeout (in milliseconds) for local transactions
#
# com.atomikos.icatch.default_jta_timeout = 10000
# Set the max timeout (in milliseconds) for local transactions
#
# com.atomikos.icatch.max_timeout = 300000
# The globally unique name of this transaction manager process
# override this value with a globally unique name
#
# com.atomikos.icatch.tm_unique_name = tm
# Do we want to use parallel subtransactions? JTA's default
# is NO for J2EE compatibility
#
# com.atomikos.icatch.serial_jta_transactions=true
# If you want to do explicit resource registration then
# you need to set this value to false.
#
# com.atomikos.icatch.automatic_resource_registration=true
# Set this to WARN, INFO or DEBUG to control the granularity
# of output to the console file.
#
# com.atomikos.icatch.console_log_level=WARN
# Do you want transaction logging to be enabled or not?
# If set to false, then no logging overhead will be done
# at the risk of losing data after restart or crash.
#
# com.atomikos.icatch.enable_logging=true
# Should two-phase commit be done in (multi-)threaded mode or not?
# Set this to false if you want commits to be ordered according
# to the order in which resources are added to the transaction.
#
# NOTE: threads are reused on JDK 1.5 or higher.
# For JDK 1.4, thread reuse is enabled as soon as the
# concurrent backport is in the classpath - see
# http://mirrors.ibiblio.org/pub/mirrors/maven2/backport-util-concurrent/backport-util-concurrent/
#
# com.atomikos.icatch.threaded_2pc=false
# Should shutdown of the VM trigger shutdown of the transaction core too?
#
# com.atomikos.icatch.force_shutdown_on_vm_exit=false
Atomikos中参数的默认值在transactions.jar中定义,transactions-default.properties,具体参数如下:
com.atomikos.icatch.enable_logging=true
com.atomikos.icatch.force_shutdown_on_vm_exit=false
com.atomikos.icatch.automatic_resource_registration=true
com.atomikos.icatch.checkpoint_interval=500
com.atomikos.icatch.serial_jta_transactions=true
com.atomikos.icatch.default_jta_timeout=10000
com.atomikos.icatch.max_timeout=300000
com.atomikos.icatch.log_base_dir=./
com.atomikos.icatch.threaded_2pc=false
com.atomikos.icatch.max_actives=50
com.atomikos.icatch.log_base_name=tmlog
java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory
com.atomikos.icatch.client_demarcation=false
java.naming.provider.url=rmi://localhost:1099
com.atomikos.icatch.rmi_export_class=none
com.atomikos.icatch.trust_client_tm=false
com.atomikos.icatch.forget_orphaned_log_entries_delay=86400000
com.atomikos.icatch.recovery_delay=${com.atomikos.icatch.default_jta_timeout}
com.atomikos.icatch.oltp_max_retries=5
com.atomikos.icatch.oltp_retry_interval=10000
com.atomikos.icatch.allow_subtransactions=true
配置完以上四个步骤,Tomcat的集成就算完成了,项目中可以使用Spring来关联数据源和事务管理器,参考配置如下:
<!-- JNDI模板配置信息,用于连接应用服务器-->
<beanclass="org.springframework.jndi.JndiTemplate"id="jndiTemplate"/>
<!--引用Tomcat数据源-->
<beanclass="org.springframework.jndi.JndiObjectFactoryBean"id="dataSource">
<propertyname="jndiName">
<value>java:comp/env/jdbc/DS_MYSQL</value>
</property>
<propertyname="jndiTemplate">
<refbean="jndiTemplate"/>
</property>
</bean>
<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
<propertyname="dataSource">
<refbean="dataSource"/>
</property>
</bean>
<!--用户事务对象-->
<beanclass="org.springframework.jndi.JndiObjectFactoryBean"id="userTransaction">
<!--class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">-->
<propertyname="jndiName">
<value>java:comp/UserTransaction</value>
</property>
<propertyname="jndiTemplate">
<refbean="jndiTemplate"/>
</property>
</bean>
<beanid="atomikosTransactionManager"class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init"destroy-method="close">
<propertyname="forceShutdown"value="false"/>
</bean>
<!--配置基于注解的声明式事务管理器 -->
<beanid="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager">
<propertyname="userTransaction"ref="userTransaction"/>
<propertyname="transactionManager"ref="atomikosTransactionManager"/>
</bean>
<tx:annotation-driventransaction-manager="transactionManager"/>
在Tomcat配置中使用的XA的数据源和JDBC驱动,应该可以使用nonXA的相关设置,Atomikos中也支持非XA的连接,以提高运行速度。关于nonXa的数据源,可以参考一下配置:
<Resource name="jdbc/DS_MYSQL"
auth="Container"
type="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"
uniqueResourceName="jdbc/DS_MYSQL"
driverClassName="com.mysql.jdbc.Driver"
maxPoolSize="200"
url="jdbc:mysql://localhost:3306/db_test?characterEncoding=UTF8"
user="root"
password="root"
factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory" />
本文中的内容参考官方文档整理:细节请查阅
https://www.atomikos.com/Documentation/Tomcat7Integration35
- Tomcat 结合Atomikos 实现JTA
- Spring+Tomcat+Atomikos + Druid 实现JTA
- Spring+Tomcat+Atomikos + Druid 实现JTA
- JAVAEE 应用容器 + tomcat + jtom + atomikos + jta
- atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA)
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- spring+mybatis+atomikos 实现JTA事务
- Spring+iBatis+Atomikos实现JTA事务
- 分布式事务JTA实现之:SSM+ATOMIKOS
- Spring+iBatis+Atomikos实现JTA事务
- Springboot+atomikos+jta实现分布式事务统一管理
- Spring JTA multiple resource transactions in Tomcat with Atomikos example
- Spring JTA multiple resource transactions in Tomcat with Atomikos example
- bzoj2668 [cqoi2012]交换棋子
- RPG难题(找规律,也开看作DP)
- Atitit 理财之道---分期与利率的比较列表 attilax总结
- poj1959 Darts
- [iOS固定宽度后计算UILable高度]
- Tomcat 结合Atomikos 实现JTA
- 2017.9.9 幸运数字 失败总结
- 关于resultset返回数字类型时为BigDecimal类型
- 使用jeesite生成单表的增删改查BUG总结
- threejs概览
- 解决Linux无法用ssh进行连接
- 67 个拯救前端开发者的工具、库和资源
- JAVA设计模式---装饰模式
- CSS3基础