有关db pool和connection.setReadOnly()方法的行为

时间:2013-03-29 08:23:10

标签: java hibernate connection-pooling database-replication c3p0

我有Java应用程序与Hibernate框架(没有弹簧)连接到MySQL DB,通过c3p0管理连接池

我尝试将我的apllication配置为从slave db读取并写入master db,我已经将此链接指向某个范围Master/Slave load balance

让我们假设应用程序是否已经在池中建立了连接会话,并且需要执行只读方法,例如

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


}

池是否创建了一个新连接以连接到db 2次以进行只读和写入操作(如果是这样,这将严重影响性能)或者它足够智能以将操作交换为已存在的只读和可写连接游泳池?

thx征求意见。

2 个答案:

答案 0 :(得分:0)

所以这与游泳池无关;它都在mysql驱动程序中。 c3p0会将您对setReadOnly的调用(无论是true还是false)传递给基础Connection,Connection将相应地路由到master或slave。

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

祝你好运!

答案 1 :(得分:0)

tl; dr:只要您切换ReplicationDriver().connect(url),它就会重复使用现有的连接。

当您执行setReadOnly()时,JDBC将连接到连接URL中列出的所有服务器。无论您切换com.mysql.jdbc.ReplicationDriver多少次,这些连接都将保持开放状态以供重复使用。

来源:我刚用{{1}}测试了Connector / J版本5.1.38。