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]
补充问题:
ReplicationDriver对MySQL数据库的版本有要求吗? 我理解应该是没有要求。
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组合框架。