Hibernate3.2+JOTM2.0+Tomcat 5.5 整合

来源:互联网 发布:汉语智能发音软件 编辑:程序博客网 时间:2024/05/17 04:11

最近单位有一个网站的数据库负载过重,考虑进行数据库拆分,问题就来了,拆分以后数据库的事务处理咋办?因为以前写的java程序没有考虑到分布式事务。正好前两天接触了JOTM,这是个好东西。废话少说,马上开工。

网上查了好多关于3者的整合,但大都是Spring+Hibernate+JTOM的,很少有直接Hibernate+JOTM的(有,但很少),还是自己动手吧。

一.所需组件

  •  Hibernate3.2
  • JOTM2.0              http://jotm.objectweb.org
  • Tomcat5.5
  • Carol 2.0.5     http://download.forge.objectweb.org/carol/carol-2.0.5-src.tgz

二.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 forLocal Method Invocation (it's a "fake" RMI)

carol.protocols=lmi

# do not useCAROL JNDI wrapper

carol.start.jndi=false

# do not start aname server

carol.start.ns=false

       4JOTM安装完成。


三.在Tomcat下建立两个数据源和一个事务处理

  1.         <Resource 
  2.               name="zhang/jta1" 
  3.               auth="Container" 
  4.               description="DB Connection jat1"
  5.               factory="org.objectweb.jndi.DataSourceFactory"
  6.               type="javax.sql.DataSource"
  7.               driverClassName="com.mysql.jdbc.Driver"
  8.               url="jdbc:mysql://localhost:3306/jta1?autoReconnect=true"
  9.               username="root" 
  10.               password=""
  11.               />

  12.             <Resource 
  13.               name="zhang/jta2" 
  14.               auth="Container" 
  15.               description="DB Connection jat2"
  16.               factory="org.objectweb.jndi.DataSourceFactory"
  17.               type="javax.sql.DataSource"
  18.               driverClassName="com.mysql.jdbc.Driver"
  19.               url="jdbc:mysql://localhost:3306/jta2?autoReconnect=true"
  20.               username="root" 
  21.               password=""
  22.               />
  23. <Resource name="UserTransaction" auth="Container"
  24. type="javax.transaction.UserTransaction"
  25. factory = "org.objectweb.jotm.UserTransactionFactory"
  26. jotm.timeout = "60"/>
网上的事务部分一般采用<Transaction>…..</Transaction>配置,但是我测了一下,就是不成,也不知是哪里出了问题,所以改用数据源的形式,效果一样

注意:

上面配置数据源的时候参数名字一定要写对,开始的时候我的配置文件里面是c3p0的配置,当时没注意,就直接把factory后面类名改了一下,别的参数都没动,结果调了一天半也没弄好,后来,driverClass改成driverClassNamejdbcUrl改成urluser改成username搞定,郁闷坏了……


四.配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.4" 
  3.     xmlns="http://java.sun.com/xml/ns/j2ee" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  7.     <resource-ref>
  8.         <description>jta1</description>
  9.         <res-ref-name>zhang/jta1</res-ref-name>
  10.         <res-type>javax.sql.DataSource</res-type>
  11.         <res-auth>Container</res-auth>
  12.     </resource-ref>
  13.     
  14.     <resource-ref>
  15.         <description>jt2</description>
  16.         <res-ref-name>zhang/jta2</res-ref-name>
  17.         <res-type>javax.sql.DataSource</res-type>
  18.         <res-auth>Container</res-auth>
  19.     </resource-ref>
  20.     
  21.     <resource-ref>
  22.         <description>UserTransaction description</description>
  23.         <res-ref-name>UserTransaction</res-ref-name>
  24.         <res-type>javax.transaction.UserTransaction</res-type>
  25.         <res-auth>Container</res-auth>
  26.     </resource-ref>
  27.     
  28.     <welcome-file-list>
  29.     <welcome-file>index.jsp</welcome-file>
  30.   </welcome-file-list>
  31. </web-app>

五.数据源配好了,下面改Hibernate


因为是多数据库操作,需要建立两个HibernateSessionFactory和两个Hibernate配置文件。工厂部分代码直接拷贝一份,修改一下其中的CONFIG_FILE_LOCATION就可以了
hibernate.cfg.xml
  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

  5. <!-- Generated by MyEclipse Hibernate Tools.                   -->
  6. <hibernate-configuration>
  7.     
  8.     <session-factory>
  9.         <property name="transaction.factory_class">
  10.             org.hibernate.transaction.JTATransactionFactory
  11.         </property>
  12.         <property name="connection.datasource">java:comp/env/zhang/jta1</property>
  13.         <property name="jta.UserTransaction">java:comp/env/UserTransaction</property>
  14.         <property name="transaction.manager_lookup_class">org.hibernate.transaction.JOTMTransactionManagerLookup</property>
  15.         <property name="show_sql">
  16.             true
  17.         </property>
  18.         
  19.         <property name="dialect">
  20.             org.hibernate.dialect.MySQLDialect
  21.         </property>
  22.         <mapping resource="com/zhang/pojos/Users.hbm.xml"/>
  23.         
  24.     </session-factory>
  25. </hibernate-configuration>
hibernate2.cfg.xml
  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

  5. <!-- Generated by MyEclipse Hibernate Tools.                   -->
  6. <hibernate-configuration>
  7.     
  8.     <session-factory>
  9.         <property name="transaction.factory_class">
  10.             org.hibernate.transaction.JTATransactionFactory
  11.         </property>
  12.         <property name="connection.datasource">java:comp/env/zhang/jta2</property>
  13.         <property name="jta.UserTransaction">java:comp/env/UserTransaction</property>
  14.         <property name="show_sql">
  15.             true
  16.         </property>
  17.         
  18.         <property name="dialect">
  19.             org.hibernate.dialect.MySQLDialect
  20.         </property>
  21.         <mapping resource="com/zhang/pojos/Address.hbm.xml"/>
  22.         
  23.     </session-factory>
  24. </hibernate-configuration>
六.
测试代码
  1. package com.zhang.test;
  2. import javax.naming.InitialContext;
  3. import javax.naming.NamingException;
  4. import javax.transaction.SystemException;
  5. import javax.transaction.UserTransaction;
  6. import org.hibernate.Session;
  7. import com.zhang.factory.HibernateSessionFactory;
  8. import com.zhang.factory.HibernateSessionFactory2;
  9. import com.zhang.pojos.Address;
  10. import com.zhang.pojos.Users;
  11. public class Test {
  12.     public void insertinto() {
  13.         UserTransaction tx = null;
  14.         try {
  15.             tx = (UserTransaction) new InitialContext().lookup("java:comp/env/UserTransaction");
  16.             
  17.         } catch (NamingException e1) {
  18.             e1.printStackTrace();
  19.         }
  20.         try {
  21.             tx.begin();
  22.             Session session = HibernateSessionFactory.getSession();
  23. //          
  24.             Users user = new Users();
  25.             user.setUsername("SSSSS");
  26.             user.setPassword("123");
  27.             session.save(user);
  28.             
  29.             Session session2 = HibernateSessionFactory2.getSession();
  30.             Address address = new Address();
  31.             address.setUsersId(1);
  32.             address.setAddress("XXXXXXX");
  33.             session2.save(address);
  34.             tx.commit();
  35.         } catch (Exception e) {
  36.             e.printStackTrace();
  37.             try {
  38.                 tx.rollback();
  39.             } catch (IllegalStateException e1) {
  40.                 e1.printStackTrace();
  41.             } catch (SecurityException e1) {
  42.                 e1.printStackTrace();
  43.             } catch (SystemException e1) {
  44.                 e1.printStackTrace();
  45.             }
  46.         }
  47.     }
  48. }
以上配置本家调试通过,如果有什么问题希望大家留言~共同进步~~
原创粉丝点击