1. 程式人生 > >單個工程中Spring+Mybatis連線多個數據庫的配置(個人分享版本)

單個工程中Spring+Mybatis連線多個數據庫的配置(個人分享版本)

上一篇部落格說到同一個問題,經過和朋友的研究已經參考網上的資料,現在給出一份更簡潔的配置。

情景:現在單個工程中需要連線兩個庫,這兩個庫在同一個mysql中,兩個庫都需要進行讀寫。

解決:

第一步:將springmybatis整合,這個過程就不具體演示了,在這個過程中建立了直接使用的五個配置檔案、兩個類、一個標識。

五個配置檔案:

jdbc.propertis(資料庫連線資訊)

applicationContext.xmlspring的核心配置檔案)

applicationContext-transaction.xmlspring事務管理配置檔案)

mybatis-config.xml

mybatis的核心配置檔案)

applicationContext-mybatis.xmlspringmybatis整合的配置檔案)

兩個類:

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.xmlspring事務管理配置檔案 

<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.xmlmybatis核心配置檔案
<?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.xmlspringmybatis整合配置檔案

<?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

OracleUnion與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