正在作的项目有以下需求:
在用户登陆介面有选择框,可以让用户选择使用哪个数据库,每个用户的选择也许不同,也就是说当前服务器上同时存在多个数据源的引用.
数据库的个数是可变的,但在系统运行后就固定了,如果需要增加,必须停止服务进行添加.
以往在另一个使用hibernate项目中,也实现了上面的功能,当时是注册多个sessionFactroy到jboss的不同的jndi,然后根据用户的选择,就可以选择使用哪个数据库.而且由于所有的事务都由自己控制,所以基本上是可行的.
现在采用spring+hibernate,事务由spring管理,不知是否可行.另外不知如何根据用户选择来切换到他要用的数据库上,而不影响别人.
以下是部分设置
application-context.xml
代码
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName"
- value="${jdbc.driverClassName}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </bean>
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <!-- <property name="mappingResources">
- <value>petclinic.hbm.xml</value>
- </property>-->
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- ${hibernate.dialect}
- </prop>
- <prop key="hibernate.show_sql">true</prop>
- <prop key="hibernate.generate_statistics">true</prop>
- </props>
- </property>
- <property name="eventListeners">
- <map>
- <entry key="merge">
- <bean
- class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
- </entry>
- </map>
- </property>
- </bean>
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- <bean id="dataSource1"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName"
- value="${jdbc.driverClassName}" />
- <property name="url" value="${jdbc.url}" />
- <property name="username" value="${jdbc.username}" />
- <property name="password" value="${jdbc.password}" />
- </bean>
- <bean id="sessionFactory1"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource1" ref="dataSource" />
- <!-- <property name="mappingResources">
- <value>petclinic.hbm.xml</value>
- </property>-->
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- ${hibernate.dialect}
- </prop>
- <prop key="hibernate.show_sql">true</prop>
- <prop key="hibernate.generate_statistics">true</prop>
- </props>
- </property>
- <property name="eventListeners">
- <map>
- <entry key="merge">
- <bean
- class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
- </entry>
- </map>
- </property>
- </bean>
- <bean id="transactionManager1"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory1" ref="sessionFactory" />
- </bean>
- <bean id="asyuserDAO" class="xxx.dao.hibernate.AsymodDAOImpl">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
AsymodDAOImpl.java
代码
- public class AsyuserDAOImpl extends HibernateDaoSupport implements AsyuserDAO {
- public Asyuser getUserById(String userNo) {
- return (Asyuser) getHibernateTemplate().get(Asyuser.class, userNo);
- }
- }
以上DAO实现中的sessionFactroy是由xml中动态注入的,但写死了,我如果想这个DAO从另一个数据库取资料,基本不可能.
能否去掉<property name="sessionFactory" ref="sessionFactory"/>
而在程序中根据用户选择而注入不同sessionFactory.
不过说到这里,又考虑到另一个问题,AsyuserDAOImpl 是单例,非线程安全的,sessionFactory这个属性也许会冲突,如果是这样,那么是不是让dao非单例呢.但这样创建对象的性能消耗是否很大.