hibernate对多数据源的支持

hibernate最新版本(3.3)是否支持如下需求:

后台有多个物理数据库, master database 和 slave database1, slave database2, .....

数据库服务器自身负责完成master database和slave databases的数据同步。

我的问题是, 能否定义多个数据源, 通过配置或简单编码hibernate实现将所有的insert, update, delete等改变数据的操作都在master database中完成, 所有select操作分配在slave databases中完成。
[b]问题补充:[/b]
我想将单数据库系统升级为Master-Slave模式(Master写,Slave读)。

原系统简介:使用Struts+Hibernate架构;数据库连接池。

计划使用ReplicationDriver,考虑了一下。大致需要做以下三处改动。
1 用新的驱动程序替换旧驱动程序

2 修改连接池配置文件如下

3 修改DAO, 增加如下代码
session.connection().setReadOnly(true/false);

不知是否考虑完全,有哪些更好的建议?
[b]问题补充:[/b]
补充问题:

  1. ReplicationDriver对MySQL数据库的版本有要求吗? 我理解应该是没有要求。

  2. ReplicationDriver定义Master-Slave服务器就是通过排列顺序是吗? 排在第一的是Master,从第二个开始是Slave?

[b]问题补充:[/b]
做了简单测试,数据写入Master没有问题, 但读出数据为什么是从Master,而不是Slave。

连接池配置文件见第一次问题补充

CustomerDAO 测试代码如下:
[code="java"]
public class CustomerDAO {

private String DTO_NAME = "CustomerDTO";

public List find() {
    List result = null;
    try {
        final Session session = HibernateUtil.currentSession();
        session.connection().setReadOnly(true);
        result = session.createCriteria(CustomerDTO.class).add(Restrictions.eq("deleted", false)).add(Restrictions.eq("disabled", false)).list();

    } catch (HibernateException e) {
        e.printStackTrace();
    } catch (SQLException se) {
        se.printStackTrace();
    }
    return result;
}

public void add(final CustomerDTO obj) {
    try {
        final Session session = HibernateUtil.currentSession();
        session.connection().setReadOnly(false);
        obj.setCreationDate(new Date());
        obj.setLastEditDate(new Date());
        session.save(obj);                        
    } catch (HibernateException e) {
        e.printStackTrace();
    } catch (SQLException se) {
        se.printStackTrace();
    }
}

}

[/code]

HibernateUtil部分测试代码如下:
[code="java"]
public class HibernateUtil {

private static SessionFactory sessionFactory;
public static final String HIBERNATE_CONF_FILE = "hibernate.cfg.xml";

public static final ThreadLocal session = new ThreadLocal();
public static final ThreadLocal userTran = new ThreadLocal();   
public static String dialect;
static {
    try {           
        sessionFactory = getHibernateConfiguration().buildSessionFactory();

    } catch (Exception ex) {

    }
}

public static Configuration getHibernateConfiguration() {
Configuration config = new Configuration();
try {

        String path = null;

        path = "/hibernate_mapping/" + HIBERNATE_CONF_FILE;

        dialect = "org.hibernate.dialect." + "MySQL" + "Dialect";
        final Properties hibProperties = new Properties();
        hibProperties.setProperty(Environment.DIALECT, dialect);

         config.configure(path).addProperties(hibProperties);           
    } catch (Exception ex) {

    }   
    return config;
}

public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();

        session.set(s);
    }
    s.setFlushMode(FlushMode.AUTO);
    return s;
}

}
[/code]

请帮忙看一下问题所在.

这个问题我详细的分析过,多数据源和多connection是两个选择,如果是多数据源,那么请求中应该包含一个信息,那就是数据是否是select or not,否则很难判断一个请求是用哪个数据源。多数据源如果不考虑这个问题混用的话很容易出现问题,因为master-slave之间是有延迟的,而且有很大的延迟。1分钟很正常。

关于多connection,我也分析过,多connection情况在spring+hibernate的环境中有bug。

第一次分析:
http://ahuaxuan.iteye.com/blog/205926

第二次分析(该文中包含了我对多数据源方式的看法)
http://ahuaxuan.iteye.com/blog/323370

不支持,但是你可以结合spring来解决这个问题.多数据源是老生常谈了

[url]http://www.iteye.com/topic/78432[/url]
[url]http://www.iteye.com/topic/21122[/url]
[url]http://forum.springside.org.cn/viewthread.php?tid=1947[/url]
[url]http://blog.csdn.net/wangdonghua2261/archive/2009/02/10/3872975.aspx[/url]

基于Master-Slave数据库模式的J2EE开发的框架选择
http://www.iteye.com/topic/143714

这个不支持,楼主的问题应该是牵扯到数据库集群的概念了吧,hibernate只能在同一时间内加载一个数据源,至于同步啊,至于管理啊,hibernate里面好像没有吧。不知道楼主想干什么,一般是加载一个数据源,然后数据源连接一个数据库,数据库有多个用户,用户又有不同的权限,应该是这样吧,但是加载多个数据源,不知道要干什么。个人觉得楼主的意思跟数据库集群有点像,不妨在数据库集群这方面找找,也许能找到楼主想要的方案来。

不支持,可以参考国内开源项目springside3组合框架。