我需要在签入连接并从池中签出时切换数据库。例如,会话X需要接收到数据库A的连接,而会话Y需要接收到数据库B的连接。
我可以使用连接自定义程序使用C3P0
进行此操作。它调用onCheckIn
的方法onCheckOut
和AbstractConnectionCustomizer
,因此我可以执行以下操作:
public class MyConnectionCustomizer extends AbstractConnectionCustomizer {
@Override
public void onCheckOut(Connection c, String parentDataSourceIdentityToken) throws Exception {
if (something) {
c.setCatalog("some database name");
}
}
@Override
public void onCheckIn(Connection c, String parentDataSourceIdentityToken) throws Exception {
c.setCatalog("some other database name");
}
}
我正在尝试切换到 HikariCP ,但在创建连接时,它仅调用customize
的{{1}}方法一次。那么,我该如何设法实现这样的功能呢?
答案 0 :(得分:2)
我试图理解这个用例?如果会话X确实需要连接到数据库A,并且会话Y需要连接到数据库B,为什么不使用单独的池?
HikariCP可能永远不会支持这样的功能(我可以说作为作者之一)。连接池应该提供对应用程序完全透明的DataSource,这样如果删除了池并且使用了本机DataSource,则应用程序将以相同的方式运行(尽管效率较低)。
您可以在C3P0中执行此类操作,但不能在HikariCP,Vibur或Apache DBCP中执行此操作,这应该是一个红旗。使用这样的功能可以将您锁定到特定的池实现中,这绝不是一件好事。
抱歉,我无法提供满意的答复。如果我是你,我会考虑编写一个应用程序级别的助手类来获取/返回提供您正在寻找的语义的连接。
答案 1 :(得分:2)
一个用例是多租户,其中有一个具有多个模式的数据库。根据登录到应用程序的租户,我们需要动态切换架构