windowXpdddd 2010-08-06 13:51
浏览 310
已采纳

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

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

  • 写回答

4条回答

  • iteye_15772 2010-08-06 15:58
    关注

    如果你用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);
    }
    

    }

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突