最近单位有一个网站的数据库负载过重,考虑进行数据库拆分,问题就来了,拆分以后数据库的事务处理咋办?因为以前写的java程序没有考虑到分布式事务。正好前两天接触了JOTM,这是个好东西。废话少说,马上开工。
网上查了好多关于3者的整合,但大都是Spring+Hibernate+JTOM的,很少有直接Hibernate+JOTM的(有,但很少),还是自己动手吧。
一.所需组件
二.JOTM2.0安装
1.
解压
jotm-2.0.10.tgz\jotm-2.0.10\lib
下所有
jar
包到
$TOMCAT5_HOME\common\lib
下
2.
重新编译
carol
,覆盖
$TOMCAT_HOME\common\lib
下的
ow_carol.jar
文件(和
jdk
有关系,所以要自己重新编译一下)
3.
在
$TOMCAT_HOME\common\classes\
下建立
carol.properties
文件,内容如下(我测试的时候此文件不建立也可以)
# lmi stands for
Local Method Invocation (it's a "fake" RMI)
carol.protocols=lmi
# do not use
CAROL JNDI wrapper
carol.start.jndi=false
# do not start a
name server
carol.start.ns=false
4
.
JOTM
安装完成。
三.在Tomcat下建立两个数据源和一个事务处理
<Resource
name="zhang/jta1"
auth="Container"
description="DB Connection jat1"
factory="org.objectweb.jndi.DataSourceFactory"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jta1?autoReconnect=true"
username="root"
password=""
/>
<Resource
name="zhang/jta2"
auth="Container"
description="DB Connection jat2"
factory="org.objectweb.jndi.DataSourceFactory"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jta2?autoReconnect=true"
username="root"
password=""
/>
<Resource name="UserTransaction" auth="Container"
type="javax.transaction.UserTransaction"
factory = "org.objectweb.jotm.UserTransactionFactory"
jotm.timeout = "60"/>
网上的事务部分一般采用<Transaction>…..</Transaction>配置,但是我测了一下,就是不成,也不知是哪里出了问题,所以改用数据源的形式,效果一样.
注意:
上面配置数据源的时候参数名字一定要写对,开始的时候我的配置文件里面是
c3p0
的配置,当时没注意,就直接把
factory
后面类名改了一下,别的参数都没动,结果调了一天半也没弄好,后来,将
driverClass
改成
driverClassName
,
jdbcUrl
改成
url
,
user
改成
username
搞定,郁闷坏了
……
四.配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<resource-ref>
<description>jta1</description>
<res-ref-name>zhang/jta1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>jt2</description>
<res-ref-name>zhang/jta2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>UserTransaction description</description>
<res-ref-name>UserTransaction</res-ref-name>
<res-type>javax.transaction.UserTransaction</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
五.数据源配好了,下面改Hibernate了
因为是多数据库操作,需要建立两个HibernateSessionFactory和两个Hibernate配置文件。工厂部分代码直接拷贝一份,修改一下其中的CONFIG_FILE_LOCATION就可以了
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
<property name="connection.datasource">java:comp/env/zhang/jta1</property>
<property name="jta.UserTransaction">java:comp/env/UserTransaction</property>
<property name="transaction.manager_lookup_class">org.hibernate.transaction.JOTMTransactionManagerLookup</property>
<property name="show_sql">
true
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<mapping resource="com/zhang/pojos/Users.hbm.xml"/>
</session-factory>
</hibernate-configuration>
hibernate2.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
<property name="connection.datasource">java:comp/env/zhang/jta2</property>
<property name="jta.UserTransaction">java:comp/env/UserTransaction</property>
<property name="show_sql">
true
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<mapping resource="com/zhang/pojos/Address.hbm.xml"/>
</session-factory>
</hibernate-configuration>
六.测试代码
package com.zhang.test;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import org.hibernate.Session;
import com.zhang.factory.HibernateSessionFactory;
import com.zhang.factory.HibernateSessionFactory2;
import com.zhang.pojos.Address;
import com.zhang.pojos.Users;
public class Test {
public void insertinto() {
UserTransaction tx = null;
try {
tx = (UserTransaction) new InitialContext().lookup("java:comp/env/UserTransaction");
} catch (NamingException e1) {
e1.printStackTrace();
}
try {
tx.begin();
Session session = HibernateSessionFactory.getSession();
//
Users user = new Users();
user.setUsername("SSSSS");
user.setPassword("123");
session.save(user);
Session session2 = HibernateSessionFactory2.getSession();
Address address = new Address();
address.setUsersId(1);
address.setAddress("XXXXXXX");
session2.save(address);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
try {
tx.rollback();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (SystemException e1) {
e1.printStackTrace();
}
}
}
}
以上配置本家调试通过,如果有什么问题希望大家留言~共同进步~~
CSDN本人原创.今搬家至ITEYE.版权所有@Robot_G
分享到:
相关推荐
这个整合项目中的文档,如"Spring2.5+Hibernate3.2+Struts2.0+jotm2.0集成配置.doc"、"spring 2.0 + hibernate3.2 + struts 2.0 开放配置.pdf"和"Spring2.5.3+Hibernate3.2+Struts2.0.11整合.pdf"应该详细介绍了这些...
简介: struts + spring + hibernate + velocity + ajax + jotm + acegi ================================================================================================ 本资料共包含以下附件: 1161...
标题 "hibernate+tomcat5.5+JOTM 2.10 JTA配置" 涉及的是在Java环境下使用Hibernate ORM框架与Tomcat 5.5应用服务器,以及集成JOTM(Java Open Transaction Manager)进行JTA(Java Transaction API)管理的配置过程...
2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...
8. **集成与配置**:学习如何将JOTM集成到常见的Java应用服务器(如Tomcat、JBoss等)和Spring框架中,是实际开发中非常实用的部分。 通过深入研究JOTM 2.0的源码,开发者不仅可以掌握事务管理的精髓,还能提升对...
在Spring中,Java Transaction API (JTA) 和 JOTM(Java Open Transaction Manager)是实现分布式事务管理的关键组件。 **Spring 框架** Spring 是一个开源的Java平台,它提供了一个全面的编程和配置模型,用于现代...
### Spring + JOTM 多数据源事务管理详解(三):JNDI + Tomcat 在本篇文章中,我们将深入探讨如何利用Spring框架结合JOTM(Java Open Transaction Manager)来实现多数据源下的分布式事务管理。我们将通过具体实例...
Spring框架作为一个广泛使用的Java应用程序开发框架,提供了多种支持事务管理的解决方案,其中包括集成JOTM(Java Open Transaction Manager)来处理分布式事务。本文将深入探讨Spring与JOTM结合使用的知识点,帮助...
本篇文章将聚焦于如何结合Spring和JOTM(Java Open Transaction Manager)来实现多数据源的事务管理,特别是针对使用Hibernate的情况。 JOTM是Java平台上的一个开放源代码事务管理器,它遵循JTA(Java Transaction ...
本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...
标题中的“spring 3.0.5 + jotm 实现的的spring mvc 的例子”表明这是一个关于使用Spring 3.0.5版本与JOTM(Java Open Transaction Manager)结合构建Spring MVC应用的示例项目。这个项目可能旨在演示如何在Spring ...
本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...
标题“spring-hibernate-jotm 例子”涉及的是一个整合Spring框架、Hibernate持久化框架以及JOTM(Java Open Transaction Manager)事务管理器的示例项目。这个项目旨在展示如何在Java应用程序中有效地管理和协调...
标题“Tomcat中使用JOTM2.14”指的是在Apache Tomcat服务器中集成并使用JOTM(Java Open Transaction Manager)版本2.14的过程。JOTM是一个开源的事务管理器,用于处理Java应用程序中的ACID(原子性、一致性、隔离性...