【问题标题】:Multi-tenant migration to work with quarkus多租户迁移以使用 quarkus
【发布时间】:2019-08-17 21:37:00
【问题描述】:

我正在迁移一个应用程序以使用最新版本的 quarkus。该应用使用 hibernate 接口 中的数据库策略实现多租户。 Quarkus 建议(如果可能) 避免使用 persistence.xml,对于这种多租户的情况,考虑到 quarkus 上下文,正确的方法是什么> ?保留 persistence.xml 还是只使用 quarkus 推荐的 application.properties

@Singleton
public class HibernateConnectionProviderFactory implements ConnectionProviderFactory {
    private Logger logger = Logger.getLogger(getClass().getName());

    private static final String TENANT_ID_PLACEHOLDER = "{tenant.id}";

    @Inject
    @SystemProperty("multitenant.hibernate.connection.url")
    private Optional<String> dbUrl;

    @Inject
    @SystemProperty("multitenant.hibernate.connection.driver_class")
    private Optional<String> dbDriverClass;

    @Inject
    @SystemProperty("multitenant.hibernate.dialect")
    private Optional<String> dbDialect;

    @Inject
    @SystemProperty("multitenant.hibernate.connection.username")
    private Optional<String> dbUsername;

    @Inject
    @SystemProperty("multitenant.hibernate.connection.password")
    private Optional<String> dbPassword;

    @Inject
    @SystemProperty(value = "multitenant.hibernate.schema.generation", defaultValue = "false")
    private boolean generateSchema;

    @Inject
    @SystemProperty("multitenant.default.tenant.id")
    private Optional<String> defaultTenantId;

    @Inject
    private PersistenceUnitDescriptorFactory persistenceUnitDescriptorFactory;

    @Inject
    private SchemaGenerator schemaGenerator;

    private final ConcurrentHashMap<String, ConnectionProvider> providers = new ConcurrentHashMap<>();


    @Override
    public Optional<ConnectionProvider> getDefaultConnectionProvider() {
        return defaultTenantId.map(this::getConnectionProvider);
    }

    @Override
    public ConnectionProvider getConnectionProvider(String tenantId) {
        return providers.computeIfAbsent(tenantId, this::createDriverManagerConnectionProvider);
    }


    private ConnectionProvider createDriverManagerConnectionProvider(String tenantId) {
        final PersistenceUnitDescriptor persistenceUnit = persistenceUnitDescriptorFactory.getPersistenceUnitDescriptor(tenantId);
        final Map<Object, Object> persistenceProperties = getPersistenceProperties(tenantId, persistenceUnit.getProperties());
        final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(persistenceProperties).build();

        if (generateSchema) {
            schemaGenerator.updateSchema(serviceRegistry, persistenceUnit);
        }

        final ConnectionProvider connectionProvider = serviceRegistry.getService(ConnectionProvider.class);


        return connectionProvider;
}
//...
}

【问题讨论】:

    标签: java hibernate multi-tenant quarkus


    【解决方案1】:

    目前我们不支持使用 Quarkus application.properties 设置 Hibernate ORM 多租户,因此您应该使用 persistence.xml 方式。

    话虽如此,如果有足够的吸引力,我们可能会考虑在未来支持它。您能否在 GitHub 上打开一个问题,以便我们收集有关此功能的反馈?

    谢谢!

    【讨论】:

    猜你喜欢
    • 2021-06-07
    • 2013-12-23
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多