微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Springboot 和 Quartz Scheduler 是否使用相同的 HikariCP?

如何解决Springboot 和 Quartz Scheduler 是否使用相同的 HikariCP?

我有一个关于 springboot、quartz 调度器和 HikariCP 的问题。我对这个领域比较陌生,并试图了解关系和工作。 我已经解决了许多与使用 HikariCP 的 Springboot HikariCP 或 Quartz 调度程序相关的问题,但没有一个能够回答我的问题。

我有一个具有以下配置的应用程序

#Database properties

spring.datasource.url = jdbc:MysqL://localhost:3306/demo?user=root&password=root&useSSL=false&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MysqL5InnoDBDialect

#Hikari

spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20

#quartz settings

spring.quartz.properties.org.quartz.jobStore.dataSource = quartzDataSource
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.driver = com.MysqL.cj.jdbc.Driver
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.provider=hikaricp
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.URL = jdbc:MysqL://localhost:3306/demo?user=root&password=root&useSSL=false&serverTimezone=UTC
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.user = root
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.password = root
spring.quartz.job-store-type = jdbc
spring.quartz.properties.org.quartz.threadPool.threadCount=20

认情况下,springboot2 使用 HikariCP。我已将池大小设置为 20。 在石英调度程序中,我也将其设置为使用 HikariCP。 现在我的问题是

  1. springboot 和quartz 使用同一个连接池还是quartz 创建一个新的连接池?
  2. 如果quartz 正在创建一个新池,有没有什么办法可以配置两者,使两者都使用springboot 创建的相同连接池。
  3. 对于 1k、10k、50k 用户来说,最佳连接池应该是什么?

提前致谢。

解决方法

抱歉,没有足够的时间回复完整的答案,但也许这会有所帮助:

  1. 您在 2 个不同的地方提供了连接详细信息,可以假设您正在使用不同的池创建 2 个数据源。
  2. 发现这个:https://www.candidjava.com/tutorial/quartz-reuse-existing-data-source-connection-pool/
  3. 用户数量不能与连接池大小直接相关。您应该查看您想要支持的并发请求数:对于 100 req/sec,每个 req 需要 100 ms -> 您需要 10 个连接。这是一种非常简化的计算方式,但它是一个起点,之后:监控和调整应该对您有所帮助。
,

在 Quartz 中重用 Spring 的数据源是可能的,并且自 Spring 框架 4.x 以来一直如此。

默认情况下,Quartz 根据提供的数据源属性创建一个新的连接池。 即使你指示 Quartz 使用连接池提供者(因为它支持 c3p0 和 HikariCP 开箱即用),它仍然会使用提供者创建一个新的连接池。这一切都归结为 Quartz 的 JobStoreCMT 类的实现细节,它通常是 Spring 应用程序中默认使用的 JobStore 实现。 JobStoreCMT 将始终创建自己的池。

在 Quartz 中重用 Spring 的数据源非常简单,在 Spring 中使用 SchedulerFactoryBean。它通过 setDataSource 接受 Spring 管理的数据源,如下面的代码片段

@Configuration
public class SchedulerConfig {

    @Autowired private DataSource dataSource;

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);
        // ... set other properties
        return factory;
    }
   

在内部,当数据源提供给 SchedulerFactoryBean 时,Spring Framework 指示 Quartz 使用 LocalDataSourceJobStore(Spring 提供的作业存储,扩展 Quartz 的 JobStoreCMT)来管理作业。 LocalDataSourceJobStore 有一个自定义 Quartz 连接提供程序,它重用提供的数据源,而不是创建新连接。

在 Spring Boot 2 中,这更简单,因为它使用应用程序的默认数据源进行所有自动装配。一个只需要配置 Quartz 使用 JDBC 存储类型:

spring.quartz.job-store-type=jdbc

在属性文件中将 Quartz 配置为再次使用数据源,可能会干扰这种自动装配行为,并导致使用新的连接池创建 Quartz 管理的数据源。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。