我知道关于这种情况也有类似的问题,但我发现没有一个与我的情况相符,我希望有一个不影响性能的解决方案。我必须与不同的数据库(所有 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/