【问题标题】:Implement an AbstractMultiTenantConnectionProvider实现一个 AbstractMultiTenantConnectionProvider
【发布时间】:2012-09-03 07:43:20
【问题描述】:

我正在尝试使用休眠多租户(来自chapter 16)。

现在我的 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 的实现,正如 here 所解释的那样。

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

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;
    }

}

但是我现在对在这两种情况下使用什么来获取 ConnectionProvider 有点无能为力。你能帮帮我吗?

PS:我找到了ConnectionProviderBuilder。你觉得我可以以此为榜样效仿吗?

【问题讨论】:

    标签: java hibernate database-connection


    【解决方案1】:

    我认为您可以通过以下方式实现自己的抽象类:

    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) 是的,在这种情况下使用地图当然是最好的选择。
    猜你喜欢
    • 2012-09-22
    • 2011-08-25
    • 2011-05-07
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多