HikariCP - 在连接签入和从连接池签出时动态设置连接数据库

时间:2014-11-14 14:48:00

标签: java jdbc datasource c3p0 hikaricp

我需要在签入连接并从池中签出时切换数据库。例如,会话X需要接收到数据库A的连接,而会话Y需要接收到数据库B的连接。

我可以使用连接自定义程序使用C3P0进行此操作。它调用onCheckIn的方法onCheckOutAbstractConnectionCustomizer,因此我可以执行以下操作:

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}}方法一次。那么,我该如何设法实现这样的功能呢?

2 个答案:

答案 0 :(得分:2)

我试图理解这个用例?如果会话X确实需要连接到数据库A,并且会话Y需要连接到数据库B,为什么不使用单独的池?

HikariCP可能永远不会支持这样的功能(我可以说作为作者之一)。连接池应该提供对应用程序完全透明的DataSource,这样如果删除了池并且使用了本机DataSource,则应用程序将以相同的方式运行(尽管效率较低)。

您可以在C3P0中执行此类操作,但不能在HikariCP,Vibur或Apache DBCP中执行此操作,这应该是一个红旗。使用这样的功能可以将您锁定到特定的池实现中,这绝不是一件好事。

抱歉,我无法提供满意的答复。如果我是你,我会考虑编写一个应用程序级别的助手类来获取/返回提供您正在寻找的语义的连接。

答案 1 :(得分:2)

一个用例是多租户,其中有一个具有多个模式的数据库。根据登录到应用程序的租户,我们需要动态切换架构