1. 程式人生 > >hibernate配置多個數據源及事物(以兩個資料來源為例)

hibernate配置多個數據源及事物(以兩個資料來源為例)

在ssh專案中,需要連線兩個不同ip下的資料庫,所以必須要給hibernate配置兩個或多個數據源

因為我只有一臺電腦,所以我配置的是sqlserver+mysql兩個資料來源

首先hibernate配置是直接從myeclipse中新增的   右鍵----myeclipse-----add hibernate

之後會生成 hibernate.cfg.xml檔案,這個檔案是配置資料來源的,因為咱們需要連結兩個資料來源,所以將檔案拷貝一份重新命名mysql.cfg.xml

以下是部分程式碼

sqlserver資料來源配置

<property name="connection.url">
   jdbc:sqlserver://localhost:1433;databaseName=chdb
  </property>
  <property name="connection.username">sa</property>
  <property name="connection.password">123</property>

  <property name="dialect">
   org.hibernate.dialect.SQLServerDialect
  </property>
  <property name="myeclipse.connection.profile">testpro</property>
  <property name="connection.driver_class">
   com.microsoft.sqlserver.jdbc.SQLServerDriver
  </property>

mysql資料來源配置

<property name="connection.url">jdbc:mysql://localhost:3306/lenovo</property>
  <property name="connection.username">root</property>
  <property name="connection.password">123</property>

  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="myeclipse.connection.profile">mysql</property>
  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

修改HibernateSessionFactory

程式碼如下:

package com.changh.common;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

/**
 * Configures and provides access to Hibernate sessions, tied to the
 * current thread of execution.  Follows the Thread Local Session
 * pattern, see {@link http://hibernate.org/42.html }.
 */
public class HibernateSessionFactory {

    /**
     * Location of hibernate.cfg.xml file.
     * Location should be on the classpath as Hibernate uses 
     * #resourceAsStream style lookup for its configuration file.
     * The default classpath location of the hibernate config file is
     * in the default package. Use #setConfigFile() to update
     * the location of the configuration file for the current session.  
     */
 private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static String MYSQL_CONFIG_FILE_LOCATION = "/mysql.cfg.xml";
 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
 private static final ThreadLocal<Session> mythreadLocal = new ThreadLocal<Session>();//因為每一個threadLocal有一個id,所以如果同時使用兩個資料來源的話必須是兩個threadlocal
    private  static Configuration configuration = new Configuration();   
    private static org.hibernate.SessionFactory sessionFactory;
    private  static Configuration Myconfiguration = new Configuration();   
    private static org.hibernate.SessionFactory MysessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;
    private static String mysqlconfigFile = MYSQL_CONFIG_FILE_LOCATION;

 static {
     try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
   Myconfiguration.configure(mysqlconfigFile);
   MysessionFactory=Myconfiguration.buildSessionFactory();
  } catch (Exception e) {
   System.err
     .println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
    }
    private HibernateSessionFactory() {
    }
 
 /**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

  if (session == null || !session.isOpen()) {
   if (sessionFactory == null) {
    rebuildSessionFactory();
   }
   session = (sessionFactory != null) ? sessionFactory.openSession()
     : null;
   threadLocal.set(session);
  }

        return session;
    }
    public static Session getMySession() throws HibernateException {
        Session session = (Session) mythreadLocal.get();

  if (session == null || !session.isOpen()) {
   if (MysessionFactory == null) {
    rebuildSessionFactory();
   }
   session = (MysessionFactory != null) ? MysessionFactory.openSession()
     : null;
   threadLocal.set(session);
  }

        return session;
    }

 /**
     *  Rebuild hibernate session factory
     *
     */
 public static void rebuildSessionFactory() {
  try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err
     .println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
 }

 /**
     *  Close the single hibernate session instance.
     *
     *  @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

 /**
     *  return session factory
     *
     */
 public static org.hibernate.SessionFactory getSessionFactory() {
  return sessionFactory;
 }

 /**
     *  return session factory
     *
     * session factory will be rebuilded in the next call
     */
 public static void setConfigFile(String configFile) {
  HibernateSessionFactory.configFile = configFile;
  sessionFactory = null;
 }

 /**
     *  return hibernate configuration
     *
     */
 public static Configuration getConfiguration() {
  return configuration;
 }

}

basehibernatedao檔案程式碼如下:

import com.common.HibernateSessionFactory;

import org.hibernate.Session;


/**
 * Data access object (DAO) for domain model
 * @author MyEclipse Persistence Tools
 */
public class BaseHibernateDAO implements IBaseHibernateDAO {
 
 public Session getSession() {
  return HibernateSessionFactory.getSession();
 }
 public Session getMySession(){
  return HibernateSessionFactory.getMySession();
 }

自定義的事物編寫程式碼如下:

public void mergeUser(UserInfo userInfo) {
  Session session = getSession();
  Session mySession=getMySession();
  Transaction tx = session.beginTransaction();
  Transaction tx2 = mySession.beginTransaction();
  com.changh.mysql.vo.Userinfo myuser = new com.changh.mysql.vo.Userinfo();
  try {
   String queryString;
   myuser.setUsername(userInfo.getUserName());
   myuser.setPassword(userInfo.getPassword());
   mySession.merge(myuser);
   if (userInfo.getId()==null) {
    session.save(userInfo);
   }else {
    session.update(userInfo);
   }
    UserInfoRole userInfoRole = new UserInfoRole();
    userInfoRole.setRoleId(Integer.parseInt(userInfo.getRoleId()));
    userInfoRole.setUserInfoId(userInfo.getId());
    session.merge(userInfoRole);
   }else {
    
   }
   tx2.commit();
   tx.commit();
  } catch (RuntimeException re) {
   tx2.rollback();
   tx.rollback();
   log.error(re);// 記錄錯誤日誌
   throw re;
  } finally {
   session.close();
  }
 }
 



相關推薦

hibernate配置個數事物資料來源

在ssh專案中,需要連線兩個不同ip下的資料庫,所以必須要給hibernate配置兩個或多個數據源 因為我只有一臺電腦,所以我配置的是sqlserver+mysql兩個資料來源 首先hibernate配置是直接從myeclipse中新增的   右鍵----myeclipse

Maven工程搭建測試淘淘商城

目錄 一、maven工程搭建 1、Maven的工程型別:      (1) war包工程(web工程)      (2) Jar包工程(java工程)      (3) Pom工程(聚合工程

用Spring管理Hibernate連線個數配置檔案

在這個配置中第一個property屬性配置目標資料來源,<map key-type="java.lang.String">中的key-type必須要和靜態鍵值對照類DataSourceMap中的值的型別相同;<entry key="Yxh" value-ref="yxhDataSource"

EJB 配置個數

name XML cti kong 添加 local ima 不能 transacti 1.修改jboss-6.simple\server\default\deploy\transaction-jboss-beans.xml 配置文件 <bean name="Co

mybatis+druid+springboot 註解方式配置個數

pat nts println service ssp bsp manager 打開 iba 1\數據庫配置 #test數據源 spring.datasource.test.url=jdbc:mysql://*:3306/db?useUnicode=true&ch

Spring cloud整合Reids 配置個數

首先是連線池的選擇 一般有兩種 lettuce ,jedis Jedis  執行緒不安全,方法同步 Lettuce  基於Netty.nio, 方法非同步 執行緒 安全 letture通過引入spring-boot-starter-redis就可以使用 <

Mybatis配置個數

1.編寫2個以上資料來源 <bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">         <property n

Spring配置個數,並實現資料來源的動態切換

1.首先在config.properties檔案中配置兩個資料庫連線的基本資料。這個省略了 2.在spring配置檔案中配置這兩個資料來源: 資料來源1 <!-- initialSize初始化時建立物理連線的個數0 maxActive最大

Springboot 配置個數(AOP實現分庫)

//因為DynamicDataSource是繼承與AbstractRoutingDataSource,而AbstractRoutingDataSource又是繼承於AbstractDataSource,AbstractDataSource實現了統一的DataSource介面,

一個程式配置個數,並進行資料來源切換

1>.在資料庫連接配置檔案中配置,資料庫連線資訊,資料來源選擇器,多個數據源資訊,sql會話工廠 <!-- 在applicationContext-dao.xml引入資料庫資訊配置檔案db.properties --> <bean id="prope

tomcat配置個數

應用場景:                公司tomcat伺服器中執行著多個工程,工程連結的mysql資料庫不同,所以每個工程的Spring總配置檔案中都配置了資料來源。 需求:   將資料來源統一拿到tomcat中配置。              本來指派給本人,由於開發

AngularJS $q 和 $q.all 單個數個數合並promise的說明

獲取 lar debug let index 被拒 可用 第一個 brush 這篇文章講的不錯, angular $q 和 promise!! -------------------------------------------------------------- 通

Spring Boot實現個數教程收集待實踐

get shu 多個 href eos net -c smi tar 先收集,後續實踐。 http://blog.csdn.net/catoop/article/details/50575038 http://blog.csdn.net/neosmith/article

SpringMVC動態切換個數解決方案自測可用

SpringMVC動態切換多個數據源解決方案 1.資料來源配置 <!-- 事務 --> <bean id="transactionManager"

Python——爬取人口遷徙數騰訊遷徙

map car img all spa ima tps .sh compile 說明: 1.遷徙量是騰訊修改後的數值,無法確認真實性。 2.代碼運行期間,騰訊遷徙未設置IP屏蔽和瀏覽器檢測,因此下段代碼僅能保證發布近期有效。 3.代碼功能:爬取指定一天的四十個城市左右的遷徙

Ubuntu中安裝和配置 Java JDK,並解除安裝自帶OpenJDKUbuntu 12.04

1.下載jdk-7u25-linux-i586.tar.gz 2.修改jdk-7u25-linux-i586.tar.gz的可執行許可權,最簡單的方法是賦予許可權,即: chmod 755 jdk

scrapy爬取相似頁面回撥爬取問題慕課網

以爬取慕課網資料為例   慕課網的資料很簡單,就是通過get方式獲取的 連線地址為 https://www.imooc.com/course/list?page=2 根據page引數來分頁     這個時

信用評分模型原理解析P2P網貸

    最近投簡歷的時候遇到要求應聘者掌握信用評分模型,所以就學習了一下。注意這篇博文的分析是以P2P網貸為例,這篇博文轉載:http://www.weiyangx.com/108743.html,是作者翻譯的外國的一篇文章,為了照顧中文閱讀習慣,對其做了小小的編輯。

NSDate的使用方法步驟比較日期的前後

NSDate這個類接觸的時候很像Java中Date,所以很多方法似乎都是一樣,只是名字不同而已。 下面是幾個典型時間操作: 1、系統時間按照設定的格式以字串形式輸出: // 建立一個時間物件 NSDate *date = [NSDated

mybatis如何配置使用個數environment

mybatis如何配置使用多個數據源? 一、資料庫連線properties配置檔案,兩個資料來源的地址: hd.jdbc.driverClassName=com.mysql.jdbc.Driver hd.jdbc.url=jdbc:mysql:/