`
zc4530
  • 浏览: 85537 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

动态切换多数据源

阅读更多

正在作的项目有以下需求:
在用户登陆介面有选择框,可以让用户选择使用哪个数据库,每个用户的选择也许不同,也就是说当前服务器上同时存在多个数据源的引用.
数据库的个数是可变的,但在系统运行后就固定了,如果需要增加,必须停止服务进行添加.

以往在另一个使用hibernate项目中,也实现了上面的功能,当时是注册多个sessionFactroy到jboss的不同的jndi,然后根据用户的选择,就可以选择使用哪个数据库.而且由于所有的事务都由自己控制,所以基本上是可行的.

现在采用spring+hibernate,事务由spring管理,不知是否可行.另外不知如何根据用户选择来切换到他要用的数据库上,而不影响别人.
以下是部分设置

application-context.xml

代码
  1. <bean id="dataSource"  
  2.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  3.         <property name="driverClassName"  
  4.             value="${jdbc.driverClassName}" />  
  5.         <property name="url" value="${jdbc.url}" />  
  6.         <property name="username" value="${jdbc.username}" />  
  7.         <property name="password" value="${jdbc.password}" />  
  8.     </bean>  
  9.   
  10.     <bean id="sessionFactory"  
  11.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  12.         <property name="dataSource" ref="dataSource" />  
  13. <!--        <property name="mappingResources">  
  14.             <value>petclinic.hbm.xml</value>  
  15.         </property>-->  
  16.         <property name="hibernateProperties">  
  17.             <props>  
  18.                 <prop key="hibernate.dialect">  
  19.                     ${hibernate.dialect}  
  20.                 </prop>  
  21.                 <prop key="hibernate.show_sql">true</prop>  
  22.                 <prop key="hibernate.generate_statistics">true</prop>  
  23.             </props>  
  24.         </property>  
  25.         <property name="eventListeners">  
  26.             <map>  
  27.                 <entry key="merge">  
  28.                     <bean  
  29.                         class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />  
  30.                 </entry>  
  31.             </map>  
  32.         </property>  
  33.     </bean>  
  34.   
  35.     <bean id="transactionManager"  
  36.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  37.         <property name="sessionFactory" ref="sessionFactory" />  
  38.     </bean>  
  39.   
  40. <bean id="dataSource1"  
  41.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  42.         <property name="driverClassName"  
  43.             value="${jdbc.driverClassName}" />  
  44.         <property name="url" value="${jdbc.url}" />  
  45.         <property name="username" value="${jdbc.username}" />  
  46.         <property name="password" value="${jdbc.password}" />  
  47.     </bean>  
  48.   
  49.     <bean id="sessionFactory1"  
  50.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  51.         <property name="dataSource1" ref="dataSource" />  
  52. <!--        <property name="mappingResources">  
  53.             <value>petclinic.hbm.xml</value>  
  54.         </property>-->  
  55.         <property name="hibernateProperties">  
  56.             <props>  
  57.                 <prop key="hibernate.dialect">  
  58.                     ${hibernate.dialect}  
  59.                 </prop>  
  60.                 <prop key="hibernate.show_sql">true</prop>  
  61.                 <prop key="hibernate.generate_statistics">true</prop>  
  62.             </props>  
  63.         </property>  
  64.         <property name="eventListeners">  
  65.             <map>  
  66.                 <entry key="merge">  
  67.                     <bean  
  68.                         class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />  
  69.                 </entry>  
  70.             </map>  
  71.         </property>  
  72.     </bean>  
  73.   
  74.     <bean id="transactionManager1"  
  75.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  76.         <property name="sessionFactory1" ref="sessionFactory" />  
  77.     </bean>  
  78.   
  79.     <bean id="asyuserDAO" class="xxx.dao.hibernate.AsymodDAOImpl">  
  80.         <property name="sessionFactory" ref="sessionFactory" />  
  81.     </bean>      
<script type="text/javascript">render_code();</script>
AsymodDAOImpl.java
代码
  1. public class AsyuserDAOImpl extends HibernateDaoSupport implements AsyuserDAO {  
  2. public Asyuser getUserById(String userNo) {  
  3.         return (Asyuser) getHibernateTemplate().get(Asyuser.class, userNo);  
  4.     }  
  5. }  
<script type="text/javascript">render_code();</script>
以上DAO实现中的sessionFactroy是由xml中动态注入的,但写死了,我如果想这个DAO从另一个数据库取资料,基本不可能.
能否去掉<property name="sessionFactory" ref="sessionFactory"/>
而在程序中根据用户选择而注入不同sessionFactory.
不过说到这里,又考虑到另一个问题,AsyuserDAOImpl 是单例,非线程安全的,sessionFactory这个属性也许会冲突,如果是这样,那么是不是让dao非单例呢.但这样创建对象的性能消耗是否很大.


分享到:
评论

相关推荐

    Spring动态切换多数据源Demo

    此外,为了在代码中切换数据源,通常会有一个数据源路由的策略,例如在Service层根据业务逻辑决定使用哪个数据源。这可能涉及到AOP(面向切面编程)的使用,通过注解或配置来切换数据源。 在实际开发中,多数据源的...

    spring boot动态切换多数据源

    动态切换数据源意味着程序可以根据运行时的需求,灵活地选择要使用的数据源。这对于处理复杂业务逻辑和优化系统性能至关重要。例如,读操作可能指向一个只读的数据源,而写操作则连接到主数据库。 4. **实现方式**...

    java动态切换多数据源

    动态切换多数据源则意味着程序可以根据需求在运行时灵活地选择要使用的数据库,而无需重启或修改代码。这种技术能够极大地提高系统的灵活性和可扩展性。 在Java中实现动态切换多数据源,通常会涉及以下几个关键知识...

    数据库动态切换多数据源SDK、Redis多数据源SDK、全链路日志追踪SDK

    数据库动态切换多数据源SDK、Redis多数据源SDK、全链路日志追踪SDK、RabbitMQ多虚拟_spring-parent

    SpringBoot配置多数据源实现动态切换数据源

    接下来是动态切换数据源的关键,这通常通过AOP(面向切面编程)和ThreadLocal来实现。创建一个自定义的`Aspect`,并在方法执行前根据业务逻辑选择合适的数据源: ```java @Aspect @Component public class ...

    mybatis+spring实现动态切换数据源

    在本项目中,我们将探讨如何利用MyBatis与Spring框架实现动态切换数据源的功能。首先,我们需要理解MyBatis和Spring的基本概念以及它们如何协同工作。 MyBatis是一个优秀的持久层框架,它简化了Java与数据库之间的...

    springboot-AOP实现多数据源动态切换(Druid连接池)

    在Spring Boot项目中实现多数据源动态切换是一项高级特性,能够使应用根据不同业务需求访问不同的数据库,从而实现服务的解耦和数据库操作的优化。该技术的关键在于如何在同一个应用中配置和使用多个数据源,以及...

    Spring实现动态切换多数据源的解决方案

    Spring 实现动态切换多数据源的解决方案是针对大型应用程序中数据切分的需求,通过使用多个数据库实例提升系统的可扩展性。在这样的架构中,程序需要根据请求和系统状态动态选择数据存储和读取的数据库。Spring 从 2...

    ssm动态切换数据源

    本文将深入探讨如何在基于SSM(Spring、Spring MVC、MyBatis)的项目中实现“动态切换数据源”,这是一个在多数据库环境下非常重要的功能。 首先,我们来理解“动态切换数据源”的概念。在大型应用中,通常会根据...

    SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式

    本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...

    使用springboot + JPA / MyBatis 实现多数据源动态切换

    在现代企业级应用开发...总的来说,Spring Boot结合JPA或MyBatis实现多数据源动态切换,不仅提高了系统的灵活性,还便于进行数据库扩展和管理。理解和掌握这一技术,对于提升系统设计能力和解决复杂问题具有重要意义。

    SpringBoot实现动态切换数据源(含源码)

    在Spring Boot应用中,动态切换数据源是一项关键功能,尤其在多数据库环境或者读写分离的架构中。这里我们将深入探讨如何使用`ThreadLocal`和`AbstractRoutingDataSource`来实现这一目标。 `ThreadLocal`是Java提供...

    Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源

    本项目“Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源”正是针对这一需求提供的一种解决方案。下面将详细介绍这个项目中的关键技术点和实现原理。 首先,Spring框架是Java企业级应用开发的核心...

    SSH动态切换数据源

    SSH动态切换数据源是一种在Java Web开发中处理多数据库连接切换的技术,主要应用于Spring、Struts和Hibernate(SSH)这三大框架集成的项目。SSH框架是企业级应用开发的常用组合,提供了强大的业务逻辑处理和数据持久...

    根据用户动态切换数据源java代码 dynamicds

    动态数据源是指在运行时能够根据业务逻辑或用户需求动态地选择和切换数据源的技术。在SpringBoot中,我们可以利用`AbstractRoutingDataSource`来实现这一功能。`AbstractRoutingDataSource`是Spring提供的一个抽象类...

    quarzt定时任务(包含动态切换数据源)

    在标题和描述中提到的“动态切换数据源”是Quartz在企业级应用中的一个重要应用场景,它允许在任务执行时根据需求动态地改变数据源连接,从而适应多数据库环境或者数据库故障转移的需求。 首先,我们来了解Quartz的...

    动态数据源之分库解析1(固定N数据源,切换多数据源)

    1. **动态数据源**:动态数据源是在运行时能够根据业务需求或特定条件切换数据源的机制。与静态数据源相比,它提供更大的灵活性,可以在不修改代码的情况下更改数据源配置。 2. **分库**:分库是数据库水平扩展的一...

    SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询.pdf

    在SpringBoot项目中,整合Mybatis-Plus并实现多数据...以上就是SpringBoot整合Mybatis-Plus实现多数据源动态切换并支持分页查询的详细过程。这个实现方案能够有效地应对复杂的数据库环境,提高系统的灵活性和可扩展性。

    SpringBoot+Atomikos分布式事务及多数据源动态切换,两种demo

    接下来,我们讨论如何实现多数据源动态切换。在Spring Boot中,通常有两种方式: 1. 使用AbstractRoutingDataSource:这是一种基于数据源路由的实现,通过动态设置当前线程绑定的数据源,从而达到切换数据源的效果。...

Global site tag (gtag.js) - Google Analytics