Java 实现一个抽象的MultitenantConnectionProvider

Java 实现一个抽象的MultitenantConnectionProvider,java,hibernate,database-connection,Java,Hibernate,Database Connection,我正在尝试使用hibernate多租户(从) 现在,我的ExtendedStorageManager使用此方法启动多租户会话: public Session getClabSession(int serverId, String customerSchema) { if (!clabFactories.containsKey(serverId)) { DbServers d = databaseConfigurations.get(serverId); c

我正在尝试使用hibernate多租户(从)

现在,我的ExtendedStorageManager使用此方法启动多租户会话:

public Session getClabSession(int serverId, String customerSchema) {
    if (!clabFactories.containsKey(serverId)) {
        DbServers d = databaseConfigurations.get(serverId);
        clabCustomerConfig.setProperty(
            "hibernate.connection.url",
            ResourceBundleService.getInstance().decorateBundle(
                "database.connection.pattern", d.getHost(),
                d.getPort()));
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
            .applySettings(clabCustomerConfig.getProperties())
            .buildServiceRegistry();
        SessionFactory factory = clabCustomerConfig
            .buildSessionFactory(serviceRegistry);
        clabFactories.put(d.getId(), factory);
        serviceRegistry = null;
        factory = null;
    }
    Session session = clabFactories.get(serverId).withOptions()
        .tenantIdentifier(customerSchema).openSession();
    session.setDefaultReadOnly(false);
    return session;

}
显然,我在测试时出现了第一个错误,因为我完全没有实现前面解释的MultiTenantConnectionProvider

使用grepcode,我发现这看起来像我想要使用的。所以我创建了我的类来扩展它:

public class XMLDMultiTenantConnectionProvider extends
    AbstractMultiTenantConnectionProvider {

    /**
     * 
     */
    private static final long serialVersionUID = -6679645015449636823L;

    @Override
    protected ConnectionProvider getAnyConnectionProvider() {
    return null;
    }

    @Override
    protected ConnectionProvider selectConnectionProvider(
        String tenantIdentifier) {
    // TODO Auto-generated method stub
    return null;
    }

}
但我现在有点不知道在这两种情况下如何使用连接提供者。你能帮我吗


附言:我找到了。你认为我可以用它作为一个例子吗?

我认为你可以用下面这样的东西来实现抽象类:

public class XMLDMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {


      private final ConnectionProvider xml1 = ConnectionProviderBuilder.buildConnectionProvider("xml1DataSource");
      private final ConnectionProvider xml2 = ConnectionProviderBuilder.buildConnectionProvider("xml2DataSource");

    /**
     * 
     */
    private static final long serialVersionUID = -6679645015449636823L;

    @Override
    protected ConnectionProvider getAnyConnectionProvider() {
         //Default Datasource (in this case i chose the first one as default)
         return xml1;
    }

    @Override
    protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {

    if( "xml1".equals(tenantIdentifier) ) 
        return xml1;

    if( "xml2".equals(tenantIdentifier) ) 
        return xml2;

    return null;
    }

}
我认为这可能是一个好的、可以理解的例子……

两个问题:1)ConnectionBuilderProvider是hibernate测试包中的一个类。我应该在生产中使用它吗?2) 既然我有1000个模式,那么像使用映射一样保存所有连接提供程序,并在创建会话时传递其中一个连接提供程序是否正确?两个不同的会话是否可以使用相同的连接提供程序?1)可以使用connectionBuilderProvider类,也可以直接从ConnectionProvider类的构造函数构造实例。2) 是的,在这种情况下,使用地图当然是最好的选择。