java - 如何在事务期间将只读 hibernate session 转换为写入(主/从数据库)

标签 java mysql hibernate spring database-replication

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

打开的事务处于只读模式,即指向从数据库。 如果我想在事务期间保存/更新/删除任何内容,将其转换为写入模式的最佳方法是什么?

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

我需要覆盖这个东西的复制驱动程序/Hibernate 模板吗?

最佳答案

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

我们重写HibernateTemplate类并创建方法以使 session 处于写入模式

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

在写入之前我们检查应用程序逻辑
连接处于写入模式,然后只需写入即可。
否则,如果连接是只读的,则首先将其设置为写入模式,执行写入操作,然后再次将其恢复为只读

关于java - 如何在事务期间将只读 hibernate session 转换为写入(主/从数据库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694254/

相关文章:

javassist.CannotCompileException : [source error] ) is missing what is this?

java - 如何在对话框中自动换行

java - Android有 "onInstall"方法吗?

hibernate - Grails 2.2.2未为参数2指定值

java - 在同一项目中切换 MongoDB 和 JPA (Postgres)

java - Hibernate 拦截器中的方法 post Flush 出错

Java:新枚举是旧枚举的子集

mysql 使用 leftjoin 选择两个匹配行的最新时间戳

php - 内连接 MYSQL 查询不起作用

javascript - 使用xml2js的xml解析问题