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

 

 

相关文章
|
2月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
441 0
|
5月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
616 2
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
502 10
|
6月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
640 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
7月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
471 26
|
6月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
815 0
|
6月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
87 0
|
6月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
547 0
|
2月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
666 1
|
2月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
214 0