问题描述
现有一个项目,采用sping+struts2+hibernate开发。有多个数据库,数据库中的表的结构完全相同。不同的用户登录后,连接到相应的数据库。现在有一问题,就是如何在hibernate中配置数据库链接?如果在hibernate中配置多数据库链接,该怎么配置?
解决方案
如果你用spring的话,可以用下面的饿配置: <code> <!-- 配置多数据源 --><bean id="dataSource" class="com.xeranx.common.db.DynamicDataSource"><property name="targetDataSources"><map key-type="java.lang.String"><entry key="0" value-ref="dataSource0" /><entry key="1" value-ref="dataSource1" /></map></property><property name="defaultTargetDataSource" ref="dataSource0" /></bean><bean id="dataSource0" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${db.default.jdbc.driverClassName}" /><property name="url" value="${db.default.jdbc.url}" /><property name="username" value="${db.default.jdbc.username}" /><property name="password" value="${db.default.jdbc.password}" /><property name="initialSize" value="${db.default.dbcp.initialSize}" /><property name="maxIdle" value="${db.default.dbcp.maxIdle}" /><property name="minIdle" value="${db.default.dbcp.minIdle}" /><property name="maxActive" value="${db.default.dbcp.maxActive}" /><property name="logAbandoned" value="${db.default.dbcp.logAbandoned}" /><property name="removeAbandoned" value="${db.default.dbcp.removeAbandoned}" /><property name="removeAbandonedTimeout" value="${db.default.dbcp.removeAbandonedTimeout}" /><property name="maxWait" value="${db.default.dbcp.maxWait}" /><property name="validationQuery" value="${db.default.dbcp.validationQuery}" /><property name="testOnBorrow" value="${db.default.dbcp.testOnBorrow}" /><property name="testOnReturn" value="${db.default.dbcp.testOnReturn}" /><property name="testWhileIdle" value="${db.default.dbcp.testWhileIdle}" /><property name="timeBetweenEvictionRunsMillis"value="${db.default.dbcp.timeBetweenEvictionRunsMillis}" /><property name="numTestsPerEvictionRun" value="${db.default.dbcp.numTestsPerEvictionRun}" /><property name="minEvictableIdleTimeMillis"value="${db.default.dbcp.minEvictableIdleTimeMillis}" /></bean><bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${db.default.jdbc.driverClassName}" /><property name="url" value="${db.default.jdbc.url}" /><property name="username" value="${db.zs.jdbc.username}" /><property name="password" value="${db.zs.jdbc.password}" /><property name="initialSize" value="${db.default.dbcp.initialSize}" /><property name="maxIdle" value="${db.default.dbcp.maxIdle}" /><property name="minIdle" value="${db.default.dbcp.minIdle}" /><property name="maxActive" value="${db.default.dbcp.maxActive}" /><property name="logAbandoned" value="${db.default.dbcp.logAbandoned}" /><property name="removeAbandoned" value="${db.default.dbcp.removeAbandoned}" /><property name="removeAbandonedTimeout" value="${db.default.dbcp.removeAbandonedTimeout}" /><property name="maxWait" value="${db.default.dbcp.maxWait}" /><property name="validationQuery" value="${db.default.dbcp.validationQuery}" /><property name="testOnBorrow" value="${db.default.dbcp.testOnBorrow}" /><property name="testOnReturn" value="${db.default.dbcp.testOnReturn}" /><property name="testWhileIdle" value="${db.default.dbcp.testWhileIdle}" /><property name="timeBetweenEvictionRunsMillis"value="${db.default.dbcp.timeBetweenEvictionRunsMillis}" /><property name="numTestsPerEvictionRun" value="${db.default.dbcp.numTestsPerEvictionRun}" /><property name="minEvictableIdleTimeMillis"value="${db.default.dbcp.minEvictableIdleTimeMillis}" /></bean> </code> //动态数据源的代码 <code>public class DynamicDataSource extends AbstractRoutingDataSource {/** * log4j 记录器 */private static final Logger log = Logger.getLogger(DynamicDataSource.class);/** * 决定返回那个数据源 */protected Object determineCurrentLookupKey() {String dataSourceId = ParameterCache.getDatasourceProp(ThreadLocalContext.getUserId());log.debug("使用数据源" + (dataSourceId == null ? "0" : dataSourceId));return dataSourceId;}} </code>//线程局部变量用来持久当前登录用户<code>public class ThreadLocalContext {/** * 线程局部变量,用来保存当前用户id */public static ThreadLocal userThreadLocal;static {userThreadLocal = new ThreadLocal();}public static String getUserId() {return (String) userThreadLocal.get();}public static void setUserId(String userId) {userThreadLocal.set(userId);}}</code> 你可以参考下代码,具体不清楚的在根据以上内容到网上找找答案,相关资料非常多。不过以上配置不支持同一个方法连接多个数据源的事物。
解决方案二:
一份代码,配置2套spring的dao实现(templatesupport中注入不同的sessionfactory)业务层注入2个dao(接口相同)即可
解决方案三:
1、配置两个数据源aDataSoruce(连接A数据库)和bDataSource(连接B数据库) 2、让aDAO使用aDataSoruce,bDAO使用bDataSoruce 3、建立一个service,让它包括两个DAO
解决方案四:
多数据源问题,每个数据源对应一个SessionFactory.