当前位置:首页>开发>正文

如何在spring框架中解决多数据源的问题 怎样用Hibernate配置多个数据源

2023-04-26 01:55:57 互联网 未知 开发

 如何在spring框架中解决多数据源的问题 怎样用Hibernate配置多个数据源

如何在spring框架中解决多数据源的问题

我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往 在 spring 和 hibernate 框架中总是配置一个数据源在 我们的项目中遇到这样一个问题:如何让 sessionFactory 在执 行数据持久化的时候,更准确说是实例变量, sessionFactory 在整个项目中只有一 个对象.springframework,通过它来动态切换数据源 。同时在配置文件中将sessionFactory的dataSource属性由原来的某个具体的dataSource改为MultiDataSource,根据客户的需求能够动态切换不同的数据源,同时,我们又希望使用 dataSource 的 sessionFactory 根本就感觉不到这样的变 化。 Decorator 模式就正是解决这个问题的设计模式。
首先写一个 Decorator 类,我取名叫 MultiDataSource.commons。当我们使用 Decorator 的时候与原类完全一样,当 Decorator 的某些功能却已经修改为了我们需要修改的功 能。如图:

怎样用Hibernate配置多个数据源?

如果用xml配置的话,那就写两个配置文件,可以不再用“hibernate.cfg.xml”做文件名,随便什么都可以,像“mysql.cfg.xml”或“sqlserver.xml”都行。用Configuration类获取SessionFactory的代码:
SessionFactory mysqlFactory = new Configuration().configure("mysql.cfg.xml").buildSessionFactory()

SessionFactory sqlserverFactory = new Configuration().configure("sqlserver.xml").buildSessionFactory()

如果你用spring,多数据库就更简单了,像这段代码可以完成所有配置:

<beans>
<bean id="mysqlDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>

<bean id="mysqlFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="mysqlDS"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>test.hbm.xml</value>
</list>
</property>
</bean>

<bean id="sqlserverDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>jdbc:odbc:test</value>
</property>
<property name="driverClassName">
<value>sun.jdbc.odbc.JdbcOdbcDriver</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>

<bean id="sqlserverFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="sqlserverDS"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>test.hbm.xml</value>
</list>
</property>
</bean>

.......

</beans>

hibernate和spring还有很多可行的配置,可以参考他们的references,有很详细地说明的。

spring使用Hibernate配置双数据源事务问题怎么解决

在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难。最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难搞。在上一篇中,我探讨了SpringSide 3 中的数据访问层,在这一篇中,我立志要解决多数据源配置的难题,我的思路是这样的:

第一步、测试能否配置多个DataSource
第二步、测试能否配置多个SessionFactory
第三步、测试能否配置多个TransactionManager
第四步、测试能否使用多个TransactionManager,也就是看能否配置多个

基本上到第四步就应该走不通了,因为Spring中似乎不能配置多个,而且@transactional注解也无法让用户选择具体使用哪个TransactionManager。也就是说,在SpringSide的应用中,不能让不同的数据源分别属于不同的事务管理器,多数据源只能使用分布式事务管理器,那么测试思路继续如下进行:

第五步、测试能否配置JTATransactionManager

如果到这一步,项目还能顺利在Tomcat中运行的话,我们就算大功告成了。但我总认为事情不会那么顺利,我总觉得JTATransactionManager需要应用服务器的支持,而且需要和JNDI配合使用,具体是不是这样,那只有等测试后才知道。如果被我不幸言中,那么进行下一步:

第六步、更换Tomcat为GlassFish,更换JDBC的DataSource为JNDI查找的DataSource,然后配置JTATransactionManager

下面测试开始,先假设场景,还是继续用上一篇中提到的简单的文章发布系统,假设该系统运行一段时间后非常火爆,单靠一台服务器已经无法支持巨大的用户数, 这时候,站长想到了把数据进行水平划分,于是,需要建立一个索引数据库,该索引数据库需保存每一篇文章的Subject及其内容所在的Web服务器,而每 一个Web服务器上运行的项目,需要同时访问索引数据库和内容数据库。所以,需要创建索引数据库,如下:

[java] view plain copy print?
create database puretext_index

use puretext_index

create table articles(
id int primary key auto_increment,
subject varchar(256),
webserver varchar(30)
)
create database puretext_index

use puretext_index

create table articles(
id int primary key auto_increment,
subject varchar(256),
webserver varchar(30)
)
第一步测试,配置多个DataSource,配置文件如下:
application.properties

Spring3 Hibernate3怎么 配置同一种数据库 多个数据源

参考以下代码,配置一个dataSource2,然后再配置一个SessionFactory引用dataSource2,或是动态更改SessionFactory的数据源。
多个数据源,会不会存在跨数据库事务的情况,楼主要注意啊。
XML/HTML code?

spring c3p0多数据源怎么配置

首先配置多个datasource
  
destroy-method="close">

destroy-method="close">
  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. 配置动态数据源
  


  4.使用动态数据源(hibernate)
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> org.hibernate.dialect.Oracle10gDialect true auto true false org.hibernate.cache.EhCacheProvider false

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

  < property name="sessionFactory" ref="sessionFactory" /> bean>   6.动态数据源的管理控制