1. 程式人生 > >用 SSH 連線兩個資料庫

用 SSH 連線兩個資料庫

spring2+struts2+hibernate3實現連線兩個資料庫

jdbc.properties檔案,寫資料庫的連線資訊

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/destoon?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

sql.driverClassName=net.sourceforge.jtds.jdbc.Driver
sql.url=jdbc:jtds:sqlserver://127.0.0.1:1433/business
sql.username=sa
sql.password=sa

cpool.minPoolSize=1
cpool.maxPoolSize=5
cpool.maxIdleTime=7200
cpool.maxIdleTimeExcessConnections=18000
cpool.acquireIncrement=1

applicationContext.xml檔案配置兩個資料來源,兩個SessionFactory分別對應相應的資料來源

 <description>Spring公共配置</description>

 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
  <property name="ignoreResourceNotFound" value="true" />
  <property name="locations">
   <list>
    <value>classpath*:/jdbc.properties</value>
   </list>
  </property>
 </bean>  
 <bean id="sqlDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${sql.driverClassName}" />
  <property name="jdbcUrl" value="${sql.url}" />
  <property name="user" value="${sql.username}" />
  <property name="password" value="${sql.password}" />
  <property name="autoCommitOnClose" value="true"/>
  <property name="initialPoolSize" value="${cpool.minPoolSize}"/>
  <property name="minPoolSize" value="${cpool.minPoolSize}"/>
  <property name="maxPoolSize" value="${cpool.maxPoolSize}"/>
  <property name="maxIdleTime" value="${cpool.maxIdleTime}"/>
  <property name="acquireIncrement" value="${cpool.acquireIncrement}"/>
  <property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/>
 </bean> 


 <!-- SqlServer Hibernate配置 -->
 <bean id="sqlSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="sqlDataSource" />
  <property name="namingStrategy">
   <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
  </property> 
  <!-- --> 
  <property name="mappingLocations">
   <list>
    <value>classpath*:/com/search/bean/*.hbm.xml</value>
     </list>
  </property>

  <property name="hibernateProperties">
   <value>
   hibernate.dialect=org.hibernate.dialect.SQLServerDialect
   hibernate.show_sql=true 
   hibernate.format_sql=false
   hibernate.query.substitutions=true 1, false 0
   hibernate.jdbc.batch_size=20
   hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
   hibernate.cache.provider_configuration_file_resource_path=/ehcache-hibernate.xml
   </value>  
  </property>

 </bean>
 
 <!-- Mysql資料來源配置-->
 <bean id="mysqlDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${jdbc.driverClassName}" />
  <property name="jdbcUrl" value="${jdbc.url}" />
  <property name="user" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
  <property name="autoCommitOnClose" value="true"/>
  <property name="initialPoolSize" value="${cpool.minPoolSize}"/>
  <property name="minPoolSize" value="${cpool.minPoolSize}"/>
  <property name="maxPoolSize" value="${cpool.maxPoolSize}"/>
  <property name="maxIdleTime" value="${cpool.maxIdleTime}"/>
  <property name="acquireIncrement" value="${cpool.acquireIncrement}"/>
  <property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/>
 </bean> 
  
   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="mysqlDataSource" />
  <property name="namingStrategy">
   <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
  </property> 
  <property name="mappingLocations">
   <list>
    <value>classpath*:/com/search/bean/*.hbm.xml</value>
     </list>
  </property>

  <property name="hibernateProperties">
   <value>
   hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
   hibernate.show_sql=true 
   hibernate.format_sql=false
   hibernate.query.substitutions=true 1, false 0
   hibernate.jdbc.batch_size=20
   hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
   hibernate.cache.provider_configuration_file_resource_path=/ehcache-hibernate.xml
   </value>  
  </property>
 </bean>

DAO類,提供兩個sessionFactory,根據資料庫關鍵字而連線不同的資料庫

@Repository

public abstract class BaseDaoImpl<T extends Serializable> implements BaseDao<T>  {

 protected Logger log = LoggerFactory.getLogger(getClass());
 public static final String SQLSERVER="sqlserver";
 public static final String MYSQL="mysql";
 protected static SessionFactory sessionFactory;

 @Autowired
 @Resource(name="sessionFactory")
 public void setSessionFactory(SessionFactory sessionFactory) {
  this.sessionFactory = sessionFactory;
 }

 public Session getSession() {
  return sessionFactory.getCurrentSession();
 }
 protected static SessionFactory sqlSessionFactory;
 @Autowired
 @Resource(name="sqlSessionFactory")
 public  void setSqlSessionFactory(SessionFactory sqlSessionFactory) {
  this.sqlSessionFactory = sqlSessionFactory;
 }
 public  Session getSqlSession(String database) {
  if (database.equals(SQLSERVER)) {
   return sqlSessionFactory.getCurrentSession();
  }else if (database.equals(MYSQL)) {
   return sessionFactory.getCurrentSession();
  }
  return null; 
 }
 @SuppressWarnings("unchecked")
 public List searchListBySQL(String sql,String database) {
  return getSqlSession(database).createSQLQuery(sql).list();
 }

}

DAO實現類

@Repository
public class ProductDaoImpl  extends JeeCoreDaoImpl<Product> implements ProductDao { 

public List getAllProducts(){
  String hql="select * from table;

  return searchListBySQL(hql,"mysql");  
 } 

}

第二種方法

一、(在src下)寫兩個Hibernate.cfg.xml檔案: 
            hbn-mysql.cfg.xml和hbn-sqlserver.cfg.xml 
二、分別解析上面的兩個.cfg.xml檔案建兩個sessionFactory, 
三、使用session時哪個sessionFactory開啟的session就能訪問哪個資料庫。


詳細步驟:----------------------------------------- 
一、(在src下)建兩個Hibernate.cfg.xml檔案 

(1.)hbn-mysql.cfg.xml的內容: 

Java程式碼  收藏程式碼
  1. <?xml version='1.0' encoding='utf-8'?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">  
  4. <!--hibernate配置檔案,定義所使用的MySQL資料庫的配置資訊 -->  
  5. <hibernate-configuration>  
  6. <session-factory>  
  7. <property name="myeclipse.connection.profile">mysql</property>  
  8. <property name="connection.url">jdbc:mysql://localhost:3306/dataSource?characterEncoding=utf-8</property>  
  9. <property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.username">root</property>  
  10. <property name="connection.password">password</property>  
  11. <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  12. <mapping  
  13.    resource="com/fourstar/starTransport/daomain/orderIdStatus.hbm.xml" />  
  14. <mapping  
  15.    resource="com/fourstar/starTransport/daomain/freightCompany.hbm.xml" />  
  16. </session-factory>  
  17. </hibernate-configuration>  

(2.)hbn-sqlserver.cfg.xml的內容: 

Java程式碼  收藏程式碼
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC  
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5. <hibernate-configuration>  
  6. <session-factory>  
  7. <property name="show_sql">true</property>  
  8. <property name="connection.driver_class">  
  9.    com.microsoft.sqlserver.jdbc.SQLServerDriver  
  10. </property>  
  11. <property name="connection.url">  
  12.    jdbc:sqlserver://192.168.2.16:1433; DatabaseName=DB  
  13. </property>  
  14. <property name="connection.username">root</property>  
  15. <property name="connection.password">password</property>  
  16. <property name="connection.isolation">2</property>  
  17. <property name="dialect">  
  18.    org.hibernate.dialect.SQLServerDialect  
  19. </property>  
  20. <mapping  
  21.    resource="com/fourstar/starTransport/daomain/transactions.hbm.xml" />  
  22.    <mapping  
  23.    resource="com/fourstar/starTransport/daomain/transactionDetail.hbm.xml" />  
  24. </session-factory>  
  25. </hibernate-configuration>  


二、建一個類(HbnUtil)用於連線資料庫(用於建立sessionFactory和openSession()靜態方法) 

Java程式碼  收藏程式碼
  1. package com.fourstar.starTransport.dao.util;  
  2. import org.hibernate.Session;  
  3. import org.hibernate.SessionFactory;  
  4. import org.hibernate.cfg.Configuration;  
  5. public class HbnUtil {// 根據hibernate.cfg.xml建立一個靜態sessionFactory  
  6. private static SessionFactory sf;  
  7. private static SessionFactory MSsf;  
  8. static {  
  9.    sf = new Configuration().configure("/hbn-sqlserver.cfg.xml")  
  10.      .buildSessionFactory();  
  11.    MSsf = new Configuration().configure("/hbn-mysql.cfg.xml")  
  12.    .buildSessionFactory();  
  13. }  
  14. /**根據DBName判斷呼叫哪個sessionFactory的openSession()方法*/  
  15. public static Session getSessionByDB(String DBName) {  
  16.    Session s = null;  
  17.    if (DBName == "mysql") {  
  18.     if (!MSsf.isClosed())  
  19.      s = MSsf.openSession();  
  20.    } else if (DBName == "sqlserver") {  
  21.     if (!sf.isClosed())  
  22.      s = sf.openSession();  
  23.    } else {  
  24.     System.out.println("錯誤的 DBName!");  
  25.    }  
  26.    return s;  
  27. }  
  28. /**根據DBName判斷呼叫哪個sessionFactory的close()方法*/  
  29. public static void closeSessionFactoryByDB(String DBName) {  
  30.    if (DBName == "mysql") {  
  31.     if (!MSsf.isClosed()) {  
  32.      MSsf.close();  
  33.     }  
  34.    } else if (DBName == "sqlserver") {  
  35.     if (!sf.isClosed()) {  
  36.      sf.close();  
  37.     }  
  38.    } else {  
  39.     System.out.println("錯誤的 DBName!");  
  40.    }  
  41. }  
  42. }  

三、測試:使用getSessionByDB(String DBName)獲得不同資料庫的session 

Java程式碼  收藏程式碼
  1. package com.fourstar.starTransport.dao.util;  
  2. import org.hibernate.HibernateException;  
  3. import org.hibernate.Query;  
  4. import org.hibernate.Session;  
  5. public class Test1{  
  6. public static void main(String[] args) {  
  7.    String DBName = "mysql";  
  8. // String DBName = "sqlservrer";  
  9.    Session s = HbnUtil.getSessionByDB(DBName);  
  10.    try {   
  11.     String sql = " from freightCompany";  
  12.     Query query = s.createQuery(sql);   
  13.    } catch (HibernateException e) {  
  14.     e.printStackTrace();  
  15.    }finally{  
  16.     s.close();  
  17.     HbnUtil.closeSessionFactoryByDB(DBName);  
  18.    }   
  19. }  
  20. }  



———————————————————————————————————————— 

———————————————————————————————————————— 

做完這些之後我再介紹下hibernate連線兩個資料庫的原理:  
—————————————————————————————————————— 

一、Hibernate訪問資料庫時載入的過程 

            對於大多數使用Hibernate的朋友來說,通常使用一下方式來獲得Configuration例項: Configuration 
            configure = new Configuration().configure(); 

            在Hibernate中,Configuration是hibernate的入口。在例項化一個Configuration的時候,Hibernate會自動在環境變數(classpath)裡面查詢Hibernate配置檔案hibernate.properties。如果該檔案存在,則將該檔案的內容載入到一個Properties的例項GLOBAL_PROPERTIES裡面,如果不存在,將列印資訊 
            hibernate.properties not found; 

            接下來Hibernate將所有系統環境變數(System.getProperties())也新增到GLOBAL_PROPERTIES裡面。如果配置檔案hibernate.properties存在,系統還會進一步驗證這個檔案配置的有效性,對於一些已經不支援的配置引數,系統將打印出警告資訊。 


相關推薦

SSH 連線資料庫

spring2+struts2+hibernate3實現連線兩個資料庫 jdbc.properties檔案,寫資料庫的連線資訊 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.

ruby on rails同時連線資料庫

使用 ruby on rails 做專案開發時,有時候需要同時連線兩個資料庫,沒有這樣做過的開發人員可能有點困難,其實方法很簡單,在這裡簡單介紹一下,希望能給大家帶來幫助。 本次使用的資料庫分別為 Mysql DB 和 Oracle DB (兩個資料庫可以為同

SpringMVC配置雙資料來源,一個java專案同時連線資料庫

資料來源在配置檔案中的配置 [java] view plain copy  print? <pre name=“code”class=“java”><?xml version=“1.0” encoding=“UTF-8”?>   <beans xml

DbForge Data Compare for SQL Server入門教程:連線資料庫、快速同步資料庫

在連線到資料庫之前,必須建立伺服器連線。 要建立連線: 1. 在資料庫選單上,單擊新建連線。將開啟“ 資料庫連線屬性” 對話方塊。 2. 在“ 伺服器” 組合框中,單擊“ <瀏覽...>” 。將開啟“ 瀏覽伺服器” 視窗。 3. 在“ 本地伺服器” 選

如何使用springboot同時連線不同的資料來源操縱資料庫

     建立一個springboot專案,在pom.xml檔案中匯入一些基本的依賴並匯入需要連線的兩個資料庫postgresql,和sqlserver的依賴。在application-dev.properties配置檔案中配置兩個資料庫的連線資訊。             

windowsssh連線linux(資料庫)碰到的問題和解決方法

1.window下面用ssh連線linux 必須在linux中安裝ssh伺服器 安裝命令:sudo apt-get install openssh-server

SSM專案實現連線mysql資料庫

最近做專案需要用到另一個數據庫的內容,多方查詢終於實現了功能。 我們都知道,在SSM框架中,我們在applicationContext.xml配置檔案中新增資料來源就可以實現資料庫增刪改查,但是隻能連線一個數據庫,這個時候我們就要從spring提供的原始碼下手看看有沒有有關

正則表示式中的邏輯運算子或(怎麼邏輯運算子或連線正則表示式)

今天使用正則表示式是遇到一個問題, 磨了半天, 發現犯了個低階錯誤, 因此記錄下來加深印象 問題描述:  我需要把 ^drawable(-[a-zA-Z0-9]+)*$  和  ^mipmap(-[a-zA-Z0-9]+)*$ 這兩個正則表示式用或的關係連線起來 我嘗試了

SSH時幾增刪查改操作後跳轉不回列表頁面(原因在連線池)

一開始在配置hibernate.cfg.xml時我忘了註釋掉下面連線池的程式碼,所以在兩個任意增刪查改操作後便不能跳轉回頁面,註釋掉後就可以了。不過這些小細節以後要注意一下就好<property name="hibernate.connection.provider_c

Spring+Hibernate+Proxool資料庫連線池配置

1,配置兩個proxool.xml檔案,proxool.first.xml配置 <proxool> <alias>Proxool.First</alias> <proxool> <ali

python比較文件中內容的不同之處, 並輸出行號和內容.

exist file diff pre ffline += == list cmp 代碼部分: ‘‘‘cmpfile.py - 比對兩個文件, 如果有不同之處, 打印內容和行號‘‘‘ import os class cmpFile: def __init__(

ssh小知識

試圖 display 處理 ble 執行 一分鐘 小知識 keep 服務 ssh的兩個小知識 1、 在ssh客戶端啟動遠程服務器的圖形界面程序。 如果你試圖在ssh客戶端運行遠程服務器的一個圖形界面程序,比如說執行firefox,此時可能會提示,can not conn

update連線

1、update 連線兩個表 UPDATE ask_way a SET way_addr = ( SELECT q.ans_txt FROM pos_ques q WHERE a.hos_id = q.hos_id AND a.w

mybatis連線資料來源

1.db.properties配置檔案設定 driver:com.mysql.jdbc.Driverf_url:jdbc:mysql://**:3306/**?useUnicode=true&amp;characterEncoding=UTF-8&am

mysql比對資料庫表結構的方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

資料庫找不到直接的唯一值

遇到問題: CRM資料庫和PMS資料庫找不到唯一值 具體情況: CRM新上的HAOKE產品線,需要找到在PMS中找到該hotel以前的產品線, 但是CRM上的酒店ID與PMS id 號不一致; 並且酒店名稱也不是完全相同的; CW號只能查現在的合同以及現在的產品線 所以不能用CW號。 但是就

如何在電腦上連線 Bose 藍芽音箱

轉自 https://www.bose.cn/zh_cn/support/article/pairing-multiple-speakers-together.html 立體聲和派對模式 適用於:  SoundLink Revolve

mysql update語句set中用and條件連線操作

原來的資料如下 執行的SQL語句如下 update sys_area set create_by = '2' and update_by = '2' where id = '1'; 執行結果為 原因 正常情況update的set中應該用逗號(,)連線,但是上面用了邏

實現資料庫之間的資料同步

不同伺服器資料庫之間的資料操作   --建立連結伺服器  exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '遠

SSH連線伺服器PG資料庫並提取資料

利用SSH連線伺服器並從伺服器上的PG資料庫提取資料,儲存為excel檔案。 Python程式碼如下: ## connectted to postgresql DB in the local PC import psycopg2 import paramiko from sshtunnel