如何在事务期间将只读的hibernate会话转换为写入(主/从DB)

时间:2012-01-01 16:51:47

标签: java mysql hibernate spring database-replication

使用spring + hibernate使用MySql复制,我有一个简单的问题;

打开的事务处于只读模式,即指向从DB。 如果我想在该交易期间保存/更新/删除任何东西,将它转换为写入模式的最佳方法是什么?

我不希望打开写模式事务,因为大多数时候我都想读取内容。

我是否需要覆盖复制驱动程序/ Hibernate模板?

1 个答案:

答案 0 :(得分:1)

我们以只读模式打开事务,然后将其转换为写入模式,因为只读连接不会像salve DB那样成为问题。

我们覆盖 HibernateTemplate 类并创建以写入模式进行会话的方法

 public final void writeEnabled(){
    getSession().doWork(jdbcWorkWriteEnabled);
}

public final void writeDisabled(boolean flush){
    if(flush)
        flush();
    getSession().doWork(jdbcWorkWriteDisabled);
}

public static final void writeEnabled(Session session){
    session.doWork(jdbcWorkWriteEnabled);
}

public static final void writeDisabled(boolean flush,Session session){
    if(flush)
        session.flush();
    session.doWork(jdbcWorkWriteDisabled);
}

final static Work jdbcWorkWriteEnabled = new Work(){
    public void execute(Connection connection) throws SQLException {
        connection.setReadOnly(false);
    }
};

final static Work jdbcWorkWriteDisabled = new Work(){
    public void execute(Connection connection) throws SQLException {
        connection.setReadOnly(true);
    }
};

在写入之前的应用程序逻辑中,我们检查
连接处于写入模式,然后简单地写入 否则,如果只读连接,则首先使其处于写入模式,执行写入操作并再次将其恢复为只读