單個工程中Spring+Mybatis連線多個數據庫的配置(個人分享版本)
上一篇部落格說到同一個問題,經過和朋友的研究已經參考網上的資料,現在給出一份更簡潔的配置。
情景:現在單個工程中需要連線兩個庫,這兩個庫在同一個mysql中,兩個庫都需要進行讀寫。
解決:
第一步:將spring和mybatis整合,這個過程就不具體演示了,在這個過程中建立了直接使用的五個配置檔案、兩個類、一個標識。
五個配置檔案:
jdbc.propertis(資料庫連線資訊)
applicationContext.xml(spring的核心配置檔案)
applicationContext-transaction.xml(spring事務管理配置檔案)
mybatis-config.xml(
applicationContext-mybatis.xml(spring和mybatis整合的配置檔案)
兩個類:
DataSourceContextHolder.java
DynamicDataSource.java
一個標識:
實體類和資料庫表的對應。
第二步:jdbc.properties資料連線資訊配置
#users使用者資訊對應的資料庫 users.jdbc.driver=com.mysql.jdbc.Driver users.jdbc.url=jdbc:mysql://127.0.0.1:3306/users?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true users.jdbc.username=root users.jdbc.password=123456 #product商品資訊對應的資料庫 product.jdbc.driver=com.mysql.jdbc.Driver product.jdbc.url=jdbc:mysql://127.0.0.1:3306/product?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true product.jdbc.username=root product.jdbc.password=123456
第三步:applicationContext.xml核心配置檔案內容如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 使用spring自帶的佔位符替換功能 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <!-- 允許JVM引數覆蓋 --> <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> <context:component-scan base-package="com.millery" /> <!-- 資料庫連線池 :usersDataSource --> <bean id="usersDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> <!-- 資料庫驅動 --> <property name="driverClass" value="${users.jdbc.driver}" /> <!-- 相應驅動的jdbcUrl --> <property name="jdbcUrl" value="${users.jdbc.url}" /> <!-- 資料庫的使用者名稱 --> <property name="username" value="${users.jdbc.username}" /> <!-- 資料庫的密碼 --> <property name="password" value="${users.jdbc.password}" /> <!-- 檢查資料庫連線池中空閒連線的間隔時間,單位是分,預設值:240,如果要取消則設定為0 --> <property name="idleConnectionTestPeriod" value="60" /> <!-- 連線池中未使用的連結最大存活時間,單位是分,預設值:60,如果要永遠存活設定為0 --> <property name="idleMaxAge" value="30" /> <!-- 每個分割槽最大的連線數 --> <property name="maxConnectionsPerPartition" value="150" /> <!-- 每個分割槽最小的連線數 --> <property name="minConnectionsPerPartition" value="5" /> </bean> <!-- 資料庫連線池 :productDataSource --> <bean id="productDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> <!-- 資料庫驅動 --> <property name="driverClass" value="${product.jdbc.driver}" /> <!-- 相應驅動的jdbcUrl --> <property name="jdbcUrl" value="${product.jdbc.url}" /> <!-- 資料庫的使用者名稱 --> <property name="username" value="${product.jdbc.username}" /> <!-- 資料庫的密碼 --> <property name="password" value="${product.jdbc.password}" /> <!-- 檢查資料庫連線池中空閒連線的間隔時間,單位是分,預設值:240,如果要取消則設定為0 --> <property name="idleConnectionTestPeriod" value="60" /> <!-- 連線池中未使用的連結最大存活時間,單位是分,預設值:60,如果要永遠存活設定為0 --> <property name="idleMaxAge" value="30" /> <!-- 每個分割槽最大的連線數 --> <property name="maxConnectionsPerPartition" value="150" /> <!-- 每個分割槽最小的連線數 --> <property name="minConnectionsPerPartition" value="5" /> </bean> <!-- 資料庫連線池 --> <bean id="dynamicDataSource" class="com.millery.utils.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="usersDataSource" key="usersDataSource" /> <entry value-ref="productDataSource" key="productDataSource" /> </map> </property> <!-- 預設使用productDataSource的資料來源 --> <property name="defaultTargetDataSource" ref="productDataSource" /> </bean>
第四步:application-transaction.xml,spring事務管理配置檔案
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 定義事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 使用動態的資料來源dynamicDataSource -->
<property name="dataSource" ref="dynamicDataSource" />
</bean>
<!-- 定義事務策略 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--所有以query開頭的方法都是隻讀的 -->
<tx:method name="query*" read-only="true" />
<!--其他方法使用預設事務策略 -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<!--pointcut元素定義一個切入點,execution中的第一個星號 用以匹配方法的返回型別, 這裡星號表明匹配所有返回型別。 com.abc.dao.*.*(..)表明匹配cn.millery.mybatis.service包下的所有類的所有
方法 -->
<aop:pointcut id="myPointcut"
expression="execution(* com.millery.service.*.*(..))" />
<!--將定義好的事務處理策略應用到上述的切入點 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
</aop:config>
</beans>
第五步:mybatis-config.xml,mybatis核心配置檔案
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 開啟駝峰自動對映 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
第六步:applicationContex-mybatis.xml,spring和mybatis整合配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 定義Mybatis的SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 定義資料來源,資料來源使用動態的資料來源dynamicDataSource -->
<property name="dataSource" ref="dynamicDataSource" />
<!-- 指定mybatis全域性配置檔案 -->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<!-- 掃描mappers目錄以及子目錄下的所有xml檔案 -->
<property name="mapperLocations" value="classpath:mybatis/mappers/**/*.xml" />
<!-- 別名掃描包 -->
<property name="typeAliasesPackage" value="com.millery.pojo" />
</bean>
<span style="white-space:pre"> </span><!-- 定義Mapper介面掃描器 -->
<span style="white-space:pre"> </span><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<span style="white-space:pre"> </span><property name="basePackage" value="com.millery.mapper" />
<span style="white-space:pre"> </span></bean>
</beans>
第七步:建立兩個類,放到com.millery.utils包中
DataSourceContextHolder類:
package com.millery.utils;
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setDbType(String dbType) {
contextHolder.set(dbType);
}
public static String getDbType() {
return ((String) contextHolder.get());
}
public static void clearDbType() {
contextHolder.remove();
}
}
DynamicDataSource類:
package com.millery.utils;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDbType();
}
}
第八步:關鍵的一步,一個標識,在設定動態資料來源的時候,連線了兩個庫,但是在怎 麼確定每次連線都是需要連線的資料庫呢,那就要這個標識了。
假設users資料庫中有一張表交user,這張表對應到java程式碼中有個實體類。在實體類中我們都要加註解@Table(name=”表名”),此時的表名不能再直接寫user,而是寫users.user(資料庫名.資料表),這裡的資料庫名就是關鍵的一個標識。如果現在product資料庫中有一個item資料表,此時同上面的一樣,加上product資料庫的標識即可。
最後一步:就是寫一個測試的類進行測試,這裡就偷個懶不寫,讀者根據自己的需求寫。
注意:
1、此配置是通過討論測試成功的方案,比之前的個人版本更優化,配置更簡潔,如果有更多的資料庫連線,只需要在spring核心配置檔案中新增一個數據源,然後配置到動態資料來源中即可;
2、配置僅供參考,直接複製,可能出現異常,畢竟每個人電腦的環境不是完全相同的。
鳴謝:此部落格是經過討論和參考朋友部落格完成,特此感謝在網上共享研究成果資源的朋 友。
相關推薦
單個工程中Spring+Mybatis連線多個數據庫的配置(個人分享版本)
上一篇部落格說到同一個問題,經過和朋友的研究已經參考網上的資料,現在給出一份更簡潔的配置。 情景:現在單個工程中需要連線兩個庫,這兩個庫在同一個mysql中,兩個庫都需要進行讀寫。 解決: 第一步:將spring和mybatis整合,這個過程就不具體演示了,在這個過程中建立
Mybatis連線多個數據庫配置方法
注意:本文配置不涉及Spring,僅限於Mybatis內。 思路: 1、configuration.xml配置檔案中environments內參數寫成動態傳參; 2、DBUtil類中構建SQLSessionFactory時讀取傳入的資料庫連線配置資訊動態生成。 案例如下: 1)c
ThinkPHP 3.2 連線多個數據庫使用(M、D)操作說明
<?php /** * 配置檔案 */ return array( // 預設連線資料庫 'DB_TYPE' => 'mysql', // 資料庫型別 'DB_H
Spring+jpa連線多個數據庫
1.persistence.xml<?xml version="1.0" encoding="UTF-8"?><persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="
用Spring管理Hibernate連線多個數據源配置檔案
在這個配置中第一個property屬性配置目標資料來源,<map key-type="java.lang.String">中的key-type必須要和靜態鍵值對照類DataSourceMap中的值的型別相同;<entry key="Yxh" value-ref="yxhDataSource"
Laravel框架實現同時連線多個數據庫
laravel4.2版本, 1.修改配置檔案:config/database.php 'pgsql' => array( 'driver' => 'pgsql', 'host' => '10.0.2.203', 'database'
grails3.0.9 連線多個數據庫
grails 連結多個數據庫的時候: 注意的地方: 1、格式要對齊 2、dialect必須寫正確 3、採用多個數據源,可以在最頂層寫,寫可以寫在environments裡,同時也可以在兩
使用Flask_SQLAlchemy連線多個數據庫
#!/usr/bin/env python #-*- coding: utf-8 -*- from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 配置多個數據庫連線 SQL
django配置連線多個數據庫,和把應用名字在admin後臺顯示為中文
在專案tt下新建兩個app,分別為app01、app02。配置app01使用default節點資料庫;app02使用hvdb節點資料庫(也可以配置app01下的model既使用default,也可以使用hvdb資料庫)1.編輯settings.py,新增多個數據庫:DATAB
springboot連線多個數據庫
今天借到一個新的需求,需要把自己資料庫某個表的資料遷移到別的資料庫中,於是百度,中間出現了一些細節的問題,解決花了點時間,在此記錄一下,下次避免出現過的錯誤 這裡把連線一個數據庫的情況也記錄一下,好做對比 一、連線一個數據庫 1.啟動類 @SpringBootAppl
ci高階用法篇之連線多個數據庫
在我們的專案中有時可能需要連線不止一個數據庫,在ci中如何實現呢? 我們在本地新建了兩個資料庫,如下截圖所示: 修改配置檔案database.php檔案為如下格式(讀者根據自己資料庫的情況修改相應引數的配置): <?php defined('BASEPATH')
phalcon 連線多個數據庫 phalcon multi-database
http://stackoverflow.com/questions/22197678/how-to-connect-multiple-database-in-phalcon-framework //This service returns a MySQL databa
spring + mybatis 同時連線多個數據源
本文所述是,在一個Spring+mybatis的工程內,需要連線oracle+sqlserver(兩個不同的sqlserver資料庫)。 直接提供配置檔案 <!--<!– 自動掃描 –>--> <context:component-sc
Spring Profile和Mybatis進行多個數據源(H2和Mysql)的切換
sql pda 開箱 https tails val 收集 sqlserver jpetstore 總結: 最近在做WebMagic的後臺,遇到一個問題:後臺用到了數據庫,本來理想情況下是用Mysql,但是為了做到開箱即用,也整合了一個嵌入式數據庫H2。這裏面就有個問題了,
使用Spring Profile和Mybatis進行多個數據源(H2和Mysql)的切換
轉載自:http://my.oschina.net/flashsword/blog/209872 最近在做WebMagic的後臺,遇到一個問題:後臺用到了資料庫,本來理想情況下是用Mysql,但是為了做到開箱即用,也整合了一個嵌入式資料庫H2。這裡面就有個問題了,如何用
Spring Boot實現多個數據源教程收集(待實踐)
get shu 多個 href eos net -c smi tar 先收集,後續實踐。 http://blog.csdn.net/catoop/article/details/50575038 http://blog.csdn.net/neosmith/article
MyBatis 配置多資料來源實現多個數據庫動態切換
1.配置properties路徑 我的配置檔案 2.配置mybatis資料來源 配置 第二套資料來源 3 動態資料來源的配置 兩個key分別引入了 兩套資料來源,預設使用jsdx_telecom 4.配置SqlSessionFa
Oracle中Union與Union All的區別(適用多個數據庫)
Union 將查詢到的結果集合並後進行重查,將其中相同的行去除。缺點:效率低; 對兩個結果集進行並集操作,不包括重複行,同時進行預設規則的排序; Union ALL 則只是合併查詢的結果集,並不重新查詢,效率高,但是可能會出現冗餘資料。
TP5 連線SQLServer資料庫及多個數據庫切換
phpstudy php版本5.5.38 TP5.0 1.配置database.php //db1 // 伺服器地址 'hostname' => '127.0.0.1', // 資料庫名 'databa
JAVA資料庫操作二(多個數據庫操作+Spring data + jpa)
本文我們將主要實現同時操作兩個資料庫,(oracle 和mysql) 當然為了展示技巧,本文將以java配置為主 首先是daoContext.xml的內容 <?xml version="1.0" encoding="UTF-8"?> <beans xml