java - 有关数据库池和 connection.setReadOnly() 方法的行为

标签 java hibernate connection-pooling database-replication c3p0

我有带有 Hibernate 框架(无 spring)的 Java 应用程序连接到 MySQL DB,通过 c3p0 管理连接池

我尝试将我的应用程序配置为从从属数据库读取并写入主数据库,我在某种程度上遵循此链接Master/Slave load balance

假设应用程序已经在池中获得了一个带有连接的 session ,并且需要执行一个只读方法,如下所示

public someReadOnlyMethod()
{
    Session session = (get session from current Thread)

            //set read-only so that it read from slave db
            session.connection().setReadOnly(true);

            (...connect to db to do something...)

            //set it back in case of this method is followed by write method so that it go to master db
            session.connection().setReadOnly(false);


}

池是否创建一个新连接来连接数据库两次以进行只读和写入操作(如果是这样,这将严重影响性能),或者它足够智能地将操作交换到已经存在的只读和可写连接池?

感谢您的建议。

最佳答案

所以这与池无关;这一切都在 mysql 驱动程序中。 c3p0 会将您对 setReadOnly(无论 true 或 false)的调用传递给底层 Connection,并且 Connection 将相应地路由到主站或从站。

如果您不喜欢连接的默认设置(可能默认情况下它们不是只读的),您可以在 c3p0 ConnectionCustomizer 的 onAcquire 方法中设置只读属性,并使用设置的值(true 或 false ) 将成为 c3p0 将连接重置为的默认值。

祝你好运!

关于java - 有关数据库池和 connection.setReadOnly() 方法的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15699758/

相关文章:

Eclipse 中的 Java 程序

java - 返回 JPA 实体导致内部服务器错误

hibernate - 即使使用 jandex 插件和空的 META-INF/beans.xml,Quarkus 也无法找到 Jandex 索引的第三方类

java - Java 中的 MariaDB 动态列集成

java - Wildfly hibernate 无法创建数据库连接

spring - Tomcat 在 Spring Boot 应用程序中挂起

Java:如何在 JFrame/JPanel 中打开 Google 之类的网页?

java - 如何从磁盘添加新文件夹到 Eclipse 项目中?

java - 如何在 Hibernate 中禁用连接池

Java 连接池 - 垃圾收集或调用 close()?