java - hibernate 多个连接动态变化

标签 java database postgresql hibernate

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

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

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

对于这种情况的最佳方法有什么想法吗?

最佳答案

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

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

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

"hibernate.multiTenancy", "SCHEMA"

下面是如何使用 spring 框架实现的例子

  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;

关于java - hibernate 多个连接动态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40686710/

相关文章:

java - LazyInitializationException - ManyToOne 包含 Eager,无法添加到 OneToMany

android - 如何从 Android 手机与服务器的数据库通信?

mysql - 对百万行表,MySQL 的 LIKE 查询的性能

postgresql 简单选择很慢

sql - 检查 SELECT 子句中的另一个表中是否存在值

java - 看不到数据库mysql的内容

java - Android 与 Java 更新

sql - 从 PostgreSql 中的多个选择中获取数据(使用 DBeaver)

java - 将字符串转换为多维数组

Java 客户端应用程序通过 Internet 与远程数据库服务器通信