当前位置: 首页 > 面试题库 >

实现一个AbstractMultiTenantConnectionProvider

翟弘
2023-03-14
问题内容

我正在尝试使用hibernate多租户(从第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
作为解释在这里。

使用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。您认为我可以以它为例吗?


问题答案:

我认为您可以使用以下类似的东西自己实现抽象类:

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

}

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



 类似资料:
  • 我有一个问题: 多个结构实现一个trait 都可以以相同的方式实现trait 我考虑过写这个(简短版本) 游戏场 这无法编译: 这里怎么了?或者有没有其他方法可以通用地实现此,而不必为和分别键入一次? 谢谢你们

  • 14.1.3.实现一个Parcel 进程间传递的Message也是个Java对象,在传递与接收之间我们需要额外进行编码/解码——也就是序列化/反序列化。在Android中,可以序列化/反序列化的对象就被称作Parcel,作为Parcelable接口的实例。 作为Parcel,对象必须知道如何处理自身的编码/解码。 例 14.4. Message.java package com.marakana.

  • 网页 https://www.stgeorges.edu.ar/quilmes/our-values/ 这种布局效果是怎么实现的? 我原先的代码是这样写的 效果不是很符合 然后我试了一下给每个li加了flex 图标为什么会有点往上偏移了?

  • https://www.stgeorges.edu.ar/quilmes/history 这种排版是怎么实现的? 如下三张图, 为什么文字和div覆盖区域会重叠?

  • 本文向大家介绍实现一个isNaN的方法相关面试题,主要包含被问及实现一个isNaN的方法时的应答技巧和注意事项,需要的朋友参考一下

  • 问题 你想记录程序执行多个任务所花费的时间 解决方案 time 模块包含很多函数来执行跟时间有关的函数。 尽管如此,通常我们会在此基础之上构造一个更高级的接口来模拟一个计时器。例如: import time class Timer: def __init__(self, func=time.perf_counter): self.elapsed = 0.0