1

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

我可以C3P0使用连接定制器来做到这一点。它调用方法onCheckInonCheckOutof 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方法。IConnectionCustomizer那么,我怎样才能实现这样的功能呢?

4

2 回答 2

4

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

于 2014-12-05T11:09:20.037 回答
1

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

HikariCP 可能永远不会支持这样的功能(作为作者之一,我可以这么说)。一个连接池应该提供一个对应用程序完全透明的数据源,这样如果连接池被移除而使用本地数据源,应用程序的功能将相同(尽管效率较低)。

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

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

于 2014-11-15T03:55:24.833 回答