首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有关数据库池和connection.setReadOnly()方法的行为

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

Stack Overflow用户
提问于 2013-03-29 16:23:10
回答 2查看 1.4K关注 0票数 3

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

我尝试将我的应用程序配置为从数据库读取并向主数据库写入,我已经在某种程度上扩展了Master/Slave load balance的链接

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

代码语言:javascript
复制
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);


}

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

谢谢你的建议。

EN

回答 2

Stack Overflow用户

发布于 2013-03-30 17:24:46

因此,这与池无关;它都在mysql驱动程序中。c3p0会将您对setReadOnly的调用(无论是真是假)传递给底层连接,连接将相应地路由到主节点或从节点。

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

祝好运!

票数 0
EN

Stack Overflow用户

发布于 2016-03-19 08:06:49

tl;dr:无论何时切换setReadOnly(true/false),它都会重用现有的连接。

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

来源:我刚刚在com.mysql.jdbc.ReplicationDriver上测试了Connector/J版本5.1.38。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15699758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档