JOTM介绍
JOTM (Java Open Transaction Manager)是由ObjectWeb协会开发的功能完整的且开源的事务管理器。
JOTM 提供了以下功能,有助于增强 WEB 应用程序:
1.完全分布式事务支持。
如果数据层、业务层、表示层运行在不同的 JVM 上,则有可能有一个全程的事务跨度这些JVM,事务的内容在RMI/JRMP 和 RMI/IIOP 上传播。
2.整合 JDBC。
使用的 XAPool就是一个 XA-兼容的 JDBC 连接池,可以与数据库相互操作。XAPool 类似于 Jakarta DBCP,只是增加了XA-兼容的特征,如果要结合 JDBC 使用 JTA 事务就必须遵从这个特征。
3.整合 JMS。
JOTM 可以结合 JORAM,JORAM是由ObjectWeb 协会开发的“JMS 提供者”,提供了事务的 JMS 消息。你可以得到出现在 servlet中同一事务的 JMS 消息发送件和更新的数据库
4.WEB 服务(web service)事务。
JOTM 提供了BTP(Business Transaction Protocol)、JOTM-BTP接口,它们用于在 WEB 服务中增加事务行为。
JOTM简单示例
1.启动JOTM
在jotm发布包根目录下的bin文件下有个jotm脚本文件,执行命令:sh jotm
2.启动数据库
如果是MySQL,请先查看:http://blog.csdn.net/conquer0715/article/details/48215155
3.java示例程序
- import org.enhydra.jdbc.standard.StandardXADataSource;
- import org.objectweb.jotm.Jotm;
- import javax.naming.Context;
- import javax.sql.XAConnection;
- import javax.transaction.Status;
- import javax.transaction.TransactionManager;
- import javax.transaction.UserTransaction;
- import java.lang.reflect.Field;
- import java.sql.Connection;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class JOTMTest {
- public static String getStatusName(int status) {
- String statusName = null;
- try {
- Field[] flds = Status.class.getDeclaredFields();
- for (int i = 0; i < flds.length; i++) {
- if (flds[i].getInt(null) == status) {
- statusName = flds[i].getName();
- break;
- }
- }
- } catch (Exception e) {
- statusName = "invalid status value!";
- }
- return statusName;
- }
- public static Connection getConnection(TransactionManager tm, String u, String p) throws SQLException {
- StandardXADataSource standardXADataSource = new StandardXADataSource();
- standardXADataSource.setDriverName("com.mysql.jdbc.Driver");
- standardXADataSource.setUrl("jdbc:mysql://127.0.0.1/wangpl");
- standardXADataSource.setTransactionManager(tm);
- XAConnection xaconn = standardXADataSource.getXAConnection(u, p);
- return xaconn.getConnection();
- }
- public static void main(String[] a) throws Exception {
- System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.ow2.carol.jndi.spi.MultiOrbInitialContextFactory");
- System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
- Jotm jotm = new Jotm(false, false);
- UserTransaction utx = jotm.getUserTransaction();
- System.out.println(getStatusName(utx.getStatus()));
- utx.begin();
- System.out.println(getStatusName(utx.getStatus()));
- try {
- Connection conn = getConnection(jotm.getTransactionManager(), "root", "pwssword");
- Statement statement = conn.createStatement();
- statement.execute("insert into user values('a')");
- } catch (Exception e) {
- e.printStackTrace();
- }
- try {
- Connection conn2 = getConnection(jotm.getTransactionManager(), "wangpl", "wangpl");
- Statement statement = conn2.createStatement();
- statement.execute("insert into user values('b')");
- } catch (Exception e) {
- e.printStackTrace();
- }
- // utx.commit();
- utx.rollback();
- System.out.println(getStatusName(utx.getStatus()));
- jotm.stop();
- }
- }
JTA的实现框架有:
GeronimoTM/Jencks 官方文档比较少,不适合学习和维护。
SimpleJTA 没有实现JTS (Java Transaction Service)而且不是活跃的。
Atomikos 是一个另人钦佩的产品。有丰富的文档,而且有很好的支持。
JBossTS 是一个应用在JBOSS服务器上的,肯定是一个成熟的产品,也有好的支持,详细信息可以看这里:http://www.theserverside.com/news /thread.tss?thread_id=37941
JOTM
JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA分布式事务的功能。
存在的问题:使用中不能自动rollback,无论什么情况都commit。注:spring3开始已经不再支持jotm
Atomikos