休眠动态更改的多个连接

2022-09-03 08:10:56

我知道关于这种情况有类似的问题,但是我发现它们都与我的情况不符,我希望有一个不影响性能的解决方案。我必须对不同的数据库(都是postgresql)进行多个连接,问题是数据库可以很多,因为它们正在不断创建。

目前,我将只有一个已知的数据库,该数据库将用于存储来自其他数据库的连接字符串。这些数据库可以是1,2,5,10或N,棘手的部分是,从我的角度来看,我永远不会知道它们会有多少,以及它们的位置和凭据会是什么(都存储在我的中央数据库中)。该用例的工作方式是,为了在其中一个数据库上执行操作,我必须首先从中央数据库中获取我们需要的数据库的位置,然后执行该操作。

目前,我已经能够通过唱SessionFactory来执行该操作,但是即使对于简单的选择/更新,该操作也太慢了,我担心的是,当发出多个请求时,我们可能会从Hibernate获得内存不足异常。

关于本案的最佳方法的任何想法?


答案 1

我们有类似的东西:1..N数据库作为不同的客户。每个客户都有相同的架构,因此我们只有 1 个实体经理。因此,您需要通过 spi 2 实现类提供休眠,并通过属性进行 handen:

hibernate.multi_tenant_connection_provider org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider

hibernate.tenant_identifier_resolver org.hibernate.context.spi.CurrentTenantIdentifierResolver

“hibernate.multiTenancy”, “SCHEMA”

这是如何使用弹簧框架的示例

  LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setJpaVendorAdapter(jpaVendorAdapter());
    emf.setPersistenceUnitName("security");
    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.cache.use_second_level_cache", "true");
    hibernateProperties.put("hibernate.multiTenancy", "SCHEMA");
    // do not load all metadata from standard db speadup startup
    hibernateProperties.put("hibernate.temp.use_jdbc_metadata_defaults", "false");
    hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQL9Dialect");
    hibernateProperties.put("hibernate.multi_tenant_connection_provider", multiTenantConnectionProvider());
    hibernateProperties.put("hibernate.tenant_identifier_resolver", currentTenantIdentifierResolver(tenant));
    hibernateProperties.put("hibernate.show_sql", true);
    emf.setJpaProperties(hibernateProperties);
    emf.setJpaDialect(new HibernateJpaDialect());
    LOG.info("LocalContainerEntityManagerFactoryBean bean created");
    return emf;

答案 2

根据我的经验,我使用单个数据库中的许多模式。Hibernate需要为每个架构以及每个数据库创建一个多EntityManagerFactory。

您需要一个 EntityManagerFactory 用于您正在使用的每个模式或每个数据库。
而且您知道,获得EntityManagerFactory在资源和时间方面非常非常昂贵。
在那之后,获得一个实体管理器是非常便宜的。

因此,在您的情况下,您必须创建一个N EntityManagerFactory,其中一个用于每个不同的数据库或来自相同数据库的不同架构。

由于创建EntityManagerFactory的成本很高,因此您必须仅在必要时和必要时才创建它们,并且您知道您必须等待近30秒或更长时间才能获得其中的每个人。

为了避免内存不足异常,您可以尝试测试从1到N创建EntityManagerFactory的最大数量,并查看您的资源是否可以支持此功能。

如果你看到当你到达一个X号码,并且这总是系统崩溃,所以你可以限制EntityManagerFactory的同时数量到这个X限制号码。

尝试让我知道您的结果,或者如果您需要一些代码示例


推荐