问题描述
因此,我正在运行用于查询MysqL数据库的Spring Boot服务器。到目前为止,我一直在使用带有JOOQ的自动配置的HikariCP连接池,因此我几乎与连接池无关。但是现在我需要查询两个不同的模式(在同一台服务器上),并且似乎无法自动配置两个连接池,因此我必须自己修改DataSource
。我想保留连接的本机行为,即具有一组持久连接,以便服务器可以调度查询,并且一旦查询解决,连接仍然存在并且可以再次使用。我发现连接池有多种实现方式,可以使用多个DataSource
来查询多个服务器,但是我不知道它们中的每个服务器是否都在使用我刚才描述的行为。
实施#1: https://www.ru-rocker.com/2018/01/28/configure-multiple-data-source-spring-boot/
实施#2: https://www.stubbornjava.com/posts/database-connection-pooling-in-java-with-hikaricp
我觉得#2是最直接的解决方案,但我对每次查询时创建一个新的DataSource
的想法表示怀疑。如果我不关闭它,是否只是一次又一次地打开连接?所以很明显,一旦完成,我将不得不关闭它们,但实际上它不再是一个连接池了。 (还是我误会了?)
虽然#1似乎更可靠,但我还是会每次都打电话给new HikariDataSource
,所以我在找什么吗?
(或者是否有一个更简单的解决方案,我错过了,因为我需要查询两个不同的模式,但仍在同一服务器和方言上)
解决方法
好吧,事实证明,我不必设置多个连接。当我使用相同的凭据查询同一台服务器时,我不必为每个shema设置连接。我刚刚删除了在我的jdbc url配置中指定的架构:
spring.datasource.url=jdbc:mysql://localhost:5656/db_name?useUnicode=true&serverTimezone=UTC
成为
spring.datasource.url=jdbc:mysql://localhost:5656/?useUnicode=true&serverTimezone=UTC
然后,因为我已经使用JOOQ生成器生成了POJO,所以我可以从模式对象引用我的表,即:Client.CLIENT.ID.as("idClient")
变成ClientSchema.CLIENTSCHEMA.CLIENT.ID.as("idClient")
。这样,我可以查询多个架构而无需设置任何新的附加连接。
如何配置MAVEN和JOOQ以从多个模式生成源:
https://www.jooq.org/doc/3.13/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-catalog-and-schema-mapping/