我有一个带有Hibernate框架的Java应用程序(没有spring)连接到MySQL DB,通过c3p0管理连接池
我尝试将我的应用程序配置为从数据库读取并向主数据库写入,我已经在某种程度上扩展了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);
}池是创建一个新的连接来连接到数据库两次进行只读和写操作(如果是,这将严重影响性能),还是足够智能地将操作交换到已经存在的只读和可写连接池?
谢谢你的建议。
发布于 2013-03-30 17:24:46
因此,这与池无关;它都在mysql驱动程序中。c3p0会将您对setReadOnly的调用(无论是真是假)传递给底层连接,连接将相应地路由到主节点或从节点。
如果您不喜欢连接的默认方式(可能在默认情况下它们不是只读的),可以在c3p0 ConnectionCustomizer的onAcquire方法中设置只读属性,值use set (true或false)将成为c3p0重置连接的默认值。
祝好运!
发布于 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。
https://stackoverflow.com/questions/15699758
复制相似问题