当前位置:首页 > 开发 > 编程语言 > Spring > 正文

Hibernate结合Spring配置可动态切换的数据源

发表于: 2014-02-19   作者:bsr1983   来源:转载   浏览次数:
摘要: Hibernate结合Spring配置可动态切换的数据源,具体配置如下: (1)Spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:x

Hibernate结合Spring配置可动态切换的数据源,具体配置如下:

(1)Spring配置文件

<?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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	<!-- 数据源配置 -->
	<bean id="databaseServer1"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/database1" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>
	<bean id="databaseServer2"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/database2" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>
	<bean id="databaseServer3"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/database3" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>
	<bean id="databaseCenter"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/database_center" />
		<property name="username" value="username" />
		<property name="password" value="password" />
	</bean>
	<!-- 编写spring 配置文件的配置多数源映射关系 -->  
    <bean id="databaseSource" class="com.ibsrapp.database.datasource.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry key="APPSERVER1" value-ref="databaseServer1"></entry>  
                <entry key="APPSERVER2" value-ref="databaseServer2"></entry>  
                <entry key="APPSERVER3" value-ref="databaseServer3"></entry>  
                <entry key="APPCENTER" value-ref="databaseCenter"></entry>  
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="databaseServer1">  
        </property>  
    </bean>  
	<!--Ibsrapp数据库会话工厂配置 -->
	<bean id="databaseSessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="databaseSource"/>
		<property name="mappingResources">
		    <list>
			    <value>com/ibsrapp/domain/dbtable.hbm.xml</value>	
			</list>
		</property>
		<property name="hibernateProperties">
	        <props>
	            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
	            <prop key="hibernate.show_sql">false</prop>
	            <prop key="hibernate.format_sql">false</prop>
	            <prop key="hibernate.hbm2ddl.auto">true</prop>
	            <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> 
	            <!-- 最大连接数 -->
		        <prop key="hibernate.c3p0.max_size">30</prop>
		        <!-- 最小连接数 -->
		        <prop key="hibernate.c3p0.min_size">5</prop>
		        <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
		        <!-- <prop key="hibernate.c3p0.timeout">60000</prop> -->
		        <!-- 最大的PreparedStatement的数量 -->
		        <prop key="hibernate.c3p0.max_statements">100</prop>
		        <!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
		        <prop key="hibernate.c3p0.idle_test_period">120</prop>
		        <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
		        <prop key="hibernate.c3p0.acquire_increment">2</prop>
		        <!-- 每次都验证连接是否可用 -->
		        <prop key="hibernate.c3p0.validate">true</prop>
	        </props>
    	</property>
	</bean>
	<!-- database的template -->
	<bean id="databaseHibernateTemplate"
		class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory">
			<ref bean="databaseSessionFactory" />
		</property>
	</bean>
  	<bean id="databaseHibernateDao"
		class="com.ibsrapp.database.persistent.dao.impl.IbsrappHibernateDaoImol">
		<property name="hibernateTemplate" ref="databaseHibernateTemplate" />
		<property name="template" ref="databaseHibernateTemplate" />
	</bean>
	<bean id="databaseJdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="databaseSource" />
	</bean>
	<bean id="databaseJdbcDao" class="com.ibsrapp.database.persistent.dao.impl.IbsrappJdbcDaoImpl">
		<property name="jdbcTemplate" ref="databaseJdbcTemplate" />
		<property name="template" ref="databaseJdbcTemplate"/>
	</bean>
	<bean id="databaseJDBCCommonDao" class="com.ibsrapp.database.persistent.dao.IbsrappJDBCCommonDao">
		<property name="sessionFactory">
			<ref bean="databaseSessionFactory" />
		</property>
	</bean>
	
</beans>

 (2)涉及的Class

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override  
    protected Object determineCurrentLookupKey() {  
        return DynamicDataSourceHolder.getDataSourceType();  
    }

    /**
     * (non-Javadoc)
     * @see javax.sql.CommonDataSource#getParentLogger()
     */
    public Logger getParentLogger() throws SQLFeatureNotSupportedException
    {
        // TODO Auto-generated method stub
        return null;
    }  
}

 

public class DynamicDataSourceHolder
{
    // 线程本地环境  
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
      
    // 设置数据源类型  
    public static void setDataSourceType(String dataSourceType) {  
        contextHolder.set(dataSourceType);  
    }  
      
    // 获取数据源类型  
    public static String getDataSourceType() {  
        return (String) contextHolder.get();  
    }  
      
    // 清除数据源类型  
    public static void clearDataSourceType() {  
        contextHolder.remove();  
    }  
}

 (3)切换相关代码

DynamicDataSourceHolder.setDataSourceType("APPSERVER1");

 这里要使用的就是spring配置文件中所配置的key的字符串。

Hibernate结合Spring配置可动态切换的数据源

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
用spring 的AbstractRoutingDataSource解决了这个问题。 原理如图: 项目采用的是hibernate,直接在s
用spring 的AbstractRoutingDataSource解决了这个问题。 原理如图: 项目采用的是hibernate,直接在s
下面是转载的一个Spring动态切换数据源的实现,原网站评论给出了Spring已经对此进行实现了,可以参
原创不易,转载请注明出处:spring框架中多数据源创建加载并且实现动态切换的配置实例代码 代码下载
一、摘要 上两篇文章分别介绍了Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据
一、摘要 上两篇文章分别介绍了Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据
配置一个数据源 Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C
本文基于SPRING2.56,HIBERANTE3.25及Oracle10g classes14.jar驱动,介绍SPRING与HIBERNATE是如何配
1.核心思想: 思路 写道 通过spring对多数据源的管理,在dao中动态的指定相对应的datasource。 2.动
本节主要通过一个小例子来讲解spring,struts,hibernate的结合: 例:增删改查用户: 操作列表:保存
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号