`
zc4530
  • 浏览: 84451 次
  • 性别: 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非单例呢.但这样创建对象的性能消耗是否很大.


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics