2014-11-14 100 views
0

当连接从池中检入和检出时,需要切换数据库。例如,会话X需要接收到数据库A的连接,而会话Y需要接收到数据库B的连接。HikariCP - 在连接检入和从连接池检出时动态设置连接的数据库

我可以使用连接自定义程序与C3P0一起执行此操作。它调用方法onCheckInAbstractConnectionCustomizeronCheckOut,所以我可以这样做:

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,但它调用IConnectionCustomizercustomize方法只有一次,在连接被创建时, 。那么,我怎样才能实现这样的功能呢?

回答

2

我想了解这个用例吗?如果会话X确实需要连接到数据库A,并且会话Y需要连接到数据库B,为什么不使用单独的池? HikariCP可能永远不会支持这样的功能(我可以说作为作者之一)。连接池应该提供对应用程序完全透明的数据源,例如,如果池被移除并且使用本地DataSource,则应用程序将以相同的方式运行(尽管效率较低)。

事实上,你可以在C3P0中做这样的事情,但不是在HikariCP,Vibur或Apache DBCP中应该是红旗。使用这样的功能将您锁定到特定的池实施中,这从来就不是好事。

对不起,我无法提供一个快乐的答案。如果我是你,我会考虑编写一个应用程序级别的助手类来获取/返回提供你正在寻找的语义的连接。

+0

您可能会发现很多用例,特别是SaaS市场产品方面的用例。你可以看看: https://docs.microsoft.com/en-us/azure/sql-database/saas-tenancy-app-design-patterns – 2018-01-29 07:52:37

2

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