`

Hibernate的多数据源多数据库

    博客分类:
阅读更多

基于SPRING+HIBERNATE的数据库的实现多租户的数据库选择和数据源路由

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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:task="http://www.springframework.org/schema/task"

	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd">

	<!-- 加载jdbc.property,hibenrate.properties -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
				<value>classpath:hibernate.properties</value>
			</list>
		</property>
		<!-- 容许多次加载属性文件 -->
		<property name="ignoreUnresolvablePlaceholders" value="true" />
	</bean>

	<!-- 连接池 -->
	<bean id="dataSource1" name="dataSource1"
		class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="initialPoolSize" value="5"></property>
		<property name="minPoolSize" value="1"></property>
		<property name="maxPoolSize" value="100"></property>
		<property name="checkoutTimeout" value="5000"></property>
		<property name="maxIdleTime" value="1800"></property>
		<property name="idleConnectionTestPeriod" value="60"></property>
		<property name="acquireIncrement" value="5"></property>
		<!-- mysql连接超时,默认8小时,解决方案1 -->
		<property name="preferredTestQuery" value="SELECT 1"></property>
		<property name="testConnectionOnCheckin" value="true"></property>
		<property name="testConnectionOnCheckout" value="true"></property>
				 
	</bean>
	<bean id="dataSource2" name="dataSource2"
		class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl_1}"></property>
		<property name="user" value="${jdbc.user_1}"></property>
		<property name="password" value="${jdbc.password_1}"></property>
		<property name="initialPoolSize" value="5"></property>
		<property name="minPoolSize" value="1"></property>
		<property name="maxPoolSize" value="100"></property>
		<property name="checkoutTimeout" value="5000"></property>
		<property name="maxIdleTime" value="1800"></property>
		<property name="idleConnectionTestPeriod" value="60"></property>
		<property name="acquireIncrement" value="5"></property>
		<!-- mysql连接超时,默认8小时,解决方案1 -->
		<property name="preferredTestQuery" value="SELECT 1"></property>
		<property name="testConnectionOnCheckin" value="true"></property>
		<property name="testConnectionOnCheckout" value="true"></property>
				
	</bean>
		
	<bean id="dynamicDataSource" class="com.zhenjw.db.DynamicDataSource"  >
		<property name="targetDataSources">
		 <!--标识符类型-->
		 <map key-type="java.lang.String"> 
		 	<entry key="kdataSource1" value-ref="dataSource1"/>
		 	<entry key="kdataSource2" value-ref="dataSource2"/>
		 </map>
		 
		 </property>
		 
		 <property name="defaultTargetDataSource" ref="dataSource1" />
		 
	</bean>
		
	<!-- hibernate4的sessionFacotry,hibernate4没有模版对象,直接使用sessionFactory,hibenrate4默认支持注解 -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		
		<property name="dataSource" ref="dynamicDataSource"></property>
		
		<!-- hibernate注解搜索路径 * 指定有注解的Hibenrate实体类的包 -->
		<property name="packagesToScan">
			<list>
				<value>com.zhenjw.oa.**.entity</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<!-- 设置方言、显示等 -->
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
				<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
				<prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>
				<prop key="hibernate.autoReconnect">${hibernate.autoreconnect}</prop>
				<!-- 设置数据库批量查询最大数量 -->
				<prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
				<!-- 设置数据库批量更新、添加、删除最大数量 -->
				<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
				
				<!-- 二级缓存配置 -->
				<!-- 是否开启二级缓存 -->
				<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
				<!-- 是否开启查询时的二级缓存,由于命中率很低,通常关闭 -->
				<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
				<!-- 设置二级缓存实现类 -->
				<prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
				
				<!-- 如果是oracle 11g,需要制定默认schema <prop key="hibernate.default_schema">${hibernate.default_schema}</prop> -->
			</props>
		</property>
	</bean>
	<!-- 多数据源 -->
	 

	<!-- hibernate4的sessionFacotry,hibernate4没有模版对象,直接使用sessionFactory,hibenrate4默认支持注解 -->
	  
	<!-- 注解搜索路径 -->
	<context:component-scan base-package="com.zhenjw" />
		
	<!-- 支持注解依赖注入 -->
	<context:annotation-config />	
	 
</beans>

 

java源代码

 

package com.zhenjw.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource{

	private Map dataSourceMap=new HashMap();
	
	@Override
	protected Object determineCurrentLookupKey() {
		// TODO Auto-generated method stub
		//数据源的选择,根据自己的业务修改具体的实现,是返回数据源的key
		String sp = SpObserver.getSp();
		
		return sp;
	}

	@Override
	public Connection getConnection() throws SQLException {
		// TODO Auto-generated method stub
		Connection a= super.getConnection();
		//用于选择数据库的逻辑,基于自己的业务规则进行修改
		a.prepareStatement("use oa_2 ").executeUpdate();
		return a;
	}
	
	
}

 

package com.zhenjw.db;

public class SpObserver {

	 private static ThreadLocal local = new ThreadLocal();
	 
	 private static String sp;
	 
	 public static void putSp(String sp) {

		 local.set(sp);

	 } 

	 public static String getSp() { 

		 return (String)local.get();    

	 } 
	 
}

 

package test.db;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zhenjw.db.BaseDaoImpl;
import com.zhenjw.db.SpObserver;
import com.zhenjw.oa.wzaccount.entity.WzAccount;

public class TestDataSource {

	//private static ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext-base.xml");
	
	private static ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext-base2.xml");
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		SpObserver.putSp("kdataSource2");
		
		BaseDaoImpl baseDao=ac.getBean(BaseDaoImpl.class);
		
		System.out.println(baseDao);
		WzAccount account=new WzAccount("zhenjw3");
		baseDao.create(account);
		
		System.out.println("Over");

	}

}

 

DAO层按hibernate的普通调用方式就可以了。结合具体的项目具体的实现有时间再细化,已经测试过可以向不同的数据源不同的数据库中增加数据。其它的功能应该也没有问题。

分享到:
评论

相关推荐

    spring3+springmvc+jpa+hibernate多数据源

    在多数据源场景下,Hibernate可以配置为连接不同的数据库,使得应用可以根据业务需求灵活切换数据源。 **多数据源** 是指在一个应用中管理多个独立的数据库连接。在本项目中,数据源被配置为Hibernate和Datastore,...

    hibernate多数据库配置

    Hibernate 多数据库配置 在 Hibernate 中配置多数据库,并自由切换,可以使用 Spring 框架来实现。...使用 Spring 框架和 Hibernate,我们可以轻松地配置多数据库连接信息,并自由切换不同的数据源。

    java+hibernate双数据源配置

    总的来说,Java+Hibernate双数据源配置是一项关键技能,它使得开发者能够在同一个应用中管理和操作多个数据库,实现读写分离、负载均衡等高级功能。结合SpringBoot的自动化配置和AOP特性,能够简化配置过程,提升...

    spring boot 2多数据源,里面有hibernate和mybatis的多数据源代码

    在多数据源的场景下,Hibernate提供了灵活的数据源配置,可以在同一个应用中管理多个数据库连接。这通常通过定义不同的SessionFactory配置和DataSource实例来实现。 **MyBatis** 则是一个轻量级的ORM框架,它比...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO层使用`HibernateDaoSupport`进行操作,而非使用JPA(Java Persistence API)。 首先,让我们了解Spring Boot 2.0的...

    Spring+Hibernate多数据源

    当项目涉及到多个数据源时,如业务数据、审计数据分别存储在不同的数据库中,就需要进行多数据源的整合。本示例将探讨如何在Spring和Hibernate环境中实现多数据源的配置与管理。 首先,我们来看标题"Spring+...

    spring集合hibernate多数据切换

    本知识点主要探讨如何在Spring中集成Hibernate来实现多数据源的动态切换功能,这对于需要处理多种数据源的应用来说至关重要。 首先,我们需要理解什么是多数据源。多数据源意味着一个应用程序可以连接并操作多个...

    spring+hibernate解决多数据源问题3.pdf

    本文主要介绍在Spring与Hibernate框架下解决多数据源配置的问题。在企业级应用开发中,因为业务需求的不同,往往需要同时操作多个数据库,这就需要配置多数据源来满足这样的需求。 知识点一:数据源与会话工厂 在...

    java hibernate不同数据库之间的动态切换

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。然而,在某些情况下,我们可能需要在运行时根据不同的条件或需求动态地切换...

    Hibernate配置数据源.

    ### Hibernate配置数据源详解 #### 一、引言 在软件开发过程中,特别是涉及大量数据库交互的应用场景下,选择合适的数据源配置对于提高系统性能、稳定性具有重要意义。Hibernate作为Java领域内广泛使用的对象关系...

    spring3+hibernate4+maven+junit 多库多数据源实现

    总的来说,"Spring3+Hibernate4+Maven+jUnit 多库多数据源实现"是一个综合性的技术实践,它涉及到多个关键组件的集成,通过灵活的配置和编程,可以有效地处理企业级应用中复杂的数据库管理需求。这样的配置不仅提高...

    配置hibernate数据源

    配置Hibernate数据源是一项基础而重要的任务,涉及在Java应用程序中集成和使用Hibernate框架以及MySQL数据库。以下内容旨在详细介绍如何在MyEclipse开发环境中配置Hibernate数据源,同时解释相关概念和步骤。 首先...

    hibernate数据源

    Hibernate 数据源是 Hibernate 框架中连接数据库的关键组件,它是 Hibernate 与底层数据库进行交互的桥梁。在 Hibernate 应用程序中,数据源扮演着存储数据库连接信息的角色,包括数据库URL、用户名、密码等,使得 ...

    spring+hibernate+atomikos多数据源

    在IT行业中,构建一个能够处理多个数据库的数据源架构是常见的需求,特别是在大型企业级应用中。Spring、Hibernate和Atomikos的组合就是一种强大的解决方案,它们可以协同工作以支持多数据源的分布式事务处理。接...

    Hibernate配置各种数据源详解

    Hibernate配置各种数据源 &lt;hibernate-configuration&gt; &lt;!– 各属性的配置–&gt; &lt;!—为true表示将Hibernate发送给数据库的sql显示出来 –&gt; ”show_sql”&gt;true &lt;!– SQL方言,这边设定的是MySQL –&gt; ”dialect”&gt;...

    SpringBoot+hibernate+mysql+sqlserver双数据源

    总的来说,"SpringBoot+Hibernate+MySQL+SQLServer双数据源"项目展示了如何在Java环境中灵活处理多数据库的需求,为复杂的企业级应用提供了可靠的解决方案。通过理解并掌握这些技术,开发者可以提升自己的技能,应对...

    spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目

    "spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目"是针对这种需求的一个解决方案,旨在提供一种灵活且动态的数据源切换机制。 首先,Spring框架作为Java领域中最受欢迎的应用框架之一,其强大...

    HIbernate与oracle数据库应用例子

    Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为开发者提供了在Java应用中操作数据库的强大工具。通过ORM,开发者可以使用面向对象的方式来处理数据,而无需直接编写SQL语句。这大大提高了开发效率并降低...

    hibernate同时配置多个数据库连接

    - **使用DataSource**:如果使用Java的JNDI数据源,可以将多个数据库的连接信息配置在应用服务器中,然后在Hibernate配置文件中引用这些数据源。 6. **性能优化** - **连接池管理**:为了提高性能,建议为每个...

    spring 3.29+struts2.3.15.1+hibernate3 动态切换数据源

    总结起来,这个项目展示了如何在Spring 3.29、Struts2.3.15.1和Hibernate3的环境下,通过`DynamicDBDemo`实现数据源的动态切换,这对于多租户应用或者其他需要根据条件选择不同数据库环境的系统具有很高的参考价值。...

Global site tag (gtag.js) - Google Analytics