hibernate连接多数据库,同样表结构的问题

现有一个项目,采用sping+struts2+hibernate开发。有多个数据库,数据库中的表的结构完全相同。不同的用户登录后,连接到相应的数据库。现在有一问题,就是如何在hibernate中配置数据库链接?
如果在hibernate中配置多数据库链接,该怎么配置?

4个回答

如果你用spring的话,可以用下面的饿配置:


<!-- 配置多数据源 -->








<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>

//动态数据源的代码


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;
}

}

//线程局部变量用来持久当前登录用户

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);
}

}

你可以参考下代码,具体不清楚的在根据以上内容到网上找找答案,相关资料非常多。

不过以上配置不支持同一个方法连接多个数据源的事物。

多数据源问题,每个数据源对应一个SessionFactory.

1、配置两个数据源aDataSoruce(连接A数据库)和bDataSource(连接B数据库)
2、让aDAO使用aDataSoruce,bDAO使用bDataSoruce
3、建立一个service,让它包括两个DAO

一份代码,配置2套spring的dao实现(templatesupport中注入不同的sessionfactory)

业务层注入2个dao(接口相同)

即可

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问