spring多数据源的配置(转)

简介: C3P0和DBCP的区别   C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

 

C3P0和DBCP的区别

 

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。   
dbcp简介:   
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。   
c3p0与dbcp区别:   
dbcp没有自动的去回收空闲连接的功能  c3p0有自动回收空闲连接功能  
两者主要是对数据连接的处理方式不同!C3P0提供最大空闲时间,DBCP提供最大连接数。 
前者当连接超过最大空闲连接时间时,当前连接就会被断掉。DBCP当连接数超过最大连接数时,所有连接都会被断开

 

1、首先配置多个datasource

 

复制代码
    <!-- 主数据库的数据据源 -->
    <bean id="masterDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@192.168.10.11:1521:trew" /> <property name="username" value="poi" /> <property name="password" value="poi" /> </bean> <!-- 备份库的数据据源 --> <bean id="slaveDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@192.168.10.12:1521:trew" /> <property name="username" value="poi2" /> <property name="password" value="poi2" /> </bean>
复制代码

 

2、写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法

?
public class DynamicDataSource extends AbstractRoutingDataSource {
     @SuppressWarnings ( "unused" )
     private Log logger = LogFactory.getLog(getClass());
  
     @Override
     protected Object determineCurrentLookupKey() {
         return DbContextHolder.getDbType();
     }
}
  
public class DbContextHolder {
     @SuppressWarnings ( "rawtypes" )
  
     private static final ThreadLocal contextHolder = new ThreadLocal();
  
     @SuppressWarnings ( "unchecked" )
     public static void setDbType(String dbType) {
         contextHolder.set(dbType);
     }
  
     public static String getDbType() {
         return (String) contextHolder.get();
     }
  
     public static void clearDbType() {
         contextHolder.remove();
     }
}

 

  

3. 配置动态数据源

 

复制代码
 <!--将DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同时配置DynamicDataSource的targetDataSources(多数据源目标)属性的Map映射。-->

    <bean id="dataSource" class="cn.com.core.datasource.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry key="masterDataSource" value-ref="masterDataSource" /> <entry key="slaveDataSource" value-ref="slaveDataSource" /> </map> </property> <property name="defaultTargetDataSource" ref="masterDataSource"/> </bean>
复制代码

 

4.使用动态数据源(hibernate)

 

复制代码
<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="lobHandler" ref="lobHandler"/> <property name="eventListeners"> <map> <entry key="post-insert"> <ref bean="logListener"/> </entry> <entry key="post-update"> <ref bean="logListener"/> </entry> <entry key="post-delete"> <ref bean="logListener"/> </entry> </map> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle10gDialect <!-- org.hibernate.dialect.OracleDerbyDialect --> </prop> <prop key="hibernate.show_sql">true</prop> <!-- <prop key="hibernate.generate_statistics">true</prop> --> <prop key="hibernate.connection.release_mode"> auto </prop> <prop key="hibernate.autoReconnect">true</prop> <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> <prop key="hibernate.cache.use_second_level_cache">false</prop> <prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.cache.use_query_cache">false</prop> </props> </property> </bean>
复制代码

 

 

 

 

使用Hibernate时的事务管理配置示例:

 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">   < property name="sessionFactory" ref="sessionFactory" />   bean> 

 

6.动态数据源的管理控制

 

 1.可以根据不同的DAO注入目标sessionfactory

复制代码
<bean id="demoDao"
class="cn.com.dao.impl.demoDaoImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="demoDao1" class="cn.com.dao.impl.demoDao1Impl"> <property name="sessionFactory" ref="sessionFactory1"/> </bean>
复制代码

 

 

 2.可以采用代码手动控制

 

DBContextHolder.setCustomerType(DBContextHolder.masterDataSource);
DBContextHolder.setCustomerType(DBContextHolder.slaveDataSource);

 

 

3.可以采用AOP的控制方式

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@Aspect  
  public  class  DynamicDataSourceAspect {  
      @Pointcut ( "execution (public service.impl..*.*(..))" )  
      public  void  serviceExecution(){}  
         
      @Before ( "serviceExecution()" )  
      public  void  setDynamicDataSource(JoinPoint jp) {  
          for (Object o : jp.getArgs()) {  
              //处理具体的逻辑 ,根据具体的境况
                DBContextHolder.setCustomerType()选取DataSource  
          }  
      }  
  }  

 

  

 

 

 7.总结

 

   通过扩展SpringAbstractRoutingDataSource可以很好的实现多数据源的rout效果,而且对扩展更多的数据源有良好的伸缩 性,只要增加数据源和修改DynamicDataSourcetargetDataSources属性配置就好。

http://www.cnblogs.com/xiaoblog/p/4720160.html

 

 

相关文章
|
25天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
38 4
|
22天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
32 0
|
15天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
8天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
20 1
|
24天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
110 1
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
200 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
204 1
|
29天前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
45 0
|
29天前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
76 0
|
1月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
37 0
下一篇
无影云桌面