【问题标题】:How does spring connection pool work at the physical level?Spring连接池在物理层面是如何工作的?
【发布时间】:2018-06-23 04:04:41
【问题描述】:

例如,我有一个设置:

spring.datasource.maxActive=5
  1. 是不是说Spring启动后,池中已经创建了5个活动物理连接?还是它们只是对象?
  2. 访问池后是否会创建与数据库的物理连接?
  3. 如果 5 个连接都忙,连接池是否会创建新连接并将其放入池中?
  4. 中间立场在哪里?如何计算池的体积?

【问题讨论】:

  • 你使用DBCP连接池吗?
  • 我在 Spring Boot 2.0 中默认使用 HikariCP。
  • com.zaxxer.hikari.HikariDataSource?
  • 是的!它的 com.zaxxer.hikari.HikariDataSource。
  • 感谢 Martin 接受答案!我希望你有一天能理解连接池是如何工作的,并写一个新的实现!

标签: java spring


【解决方案1】:

每个连接池以不同的方式管理连接。他们有不同的策略来增加池或抛出没有可用连接的异常。

通常(但不是规则):

  1. 当 Spring 启动时,没有活动连接。
  2. 是的,第一次访问池时会创建第一个物理连接。使用后,会以空闲状态留在池中。
  3. 只要有空闲连接,池就会重用它们。空闲连接将被重新用于新请求。
  4. 如果请求到来并且没有空闲连接并且达到最大限制,则有两种策略:无限增长池或抛出异常。抛出异常是处理这种情况的常用方法。当前由活动连接处理的请求不会受到影响。
  5. 空闲连接可以在一段时间后销毁以避免资源使用。

要了解适当的池大小是统计数据和可用资源的问题。同样,最大池大小可以根据服务器上的使用模式和连接可用性增加或减少。

【讨论】:

    【解决方案2】:

    每个连接池都有自己的配置选项。甚至不同版本的连接池也可能有不同的选择。比如说,在 DBCP 1.x 中使用了 maxActive,在 DBCP 2.x 中它被重命名为 maxTotal

    了解您正在使用的连接池对于正确配置它至关重要。某些设置的工作方式可能不同,这个问题没有统一的答案。

    对于您的特定情况,您正在使用 HikariCP 连接池。 HikariCP 有以下可用设置:

    https://github.com/brettwooldridge/HikariCP/blob/dev/src/main/java/com/zaxxer/hikari/HikariConfig.java

    https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby

    来自源代码:

       // Properties changeable at runtime through the HikariConfigMXBean
       //
       private volatile String catalog;
       private volatile long connectionTimeout;
       private volatile long validationTimeout;
       private volatile long idleTimeout;
       private volatile long leakDetectionThreshold;
       private volatile long maxLifetime;
       private volatile int maxPoolSize;
       private volatile int minIdle;
       private volatile String username;
       private volatile String password;
    
       // Properties NOT changeable at runtime
       //
       private long initializationFailTimeout;
       private String connectionInitSql;
       private String connectionTestQuery;
       private String dataSourceClassName;
       private String dataSourceJndiName;
       private String driverClassName;
       private String jdbcUrl;
       private String poolName;
       private String schema;
       private String transactionIsolationName;
       private boolean isAutoCommit;
       private boolean isReadOnly;
       private boolean isIsolateInternalQueries;
       private boolean isRegisterMbeans;
       private boolean isAllowPoolSuspension;
       private DataSource dataSource;
       private Properties dataSourceProperties;
       private ThreadFactory threadFactory;
       private ScheduledExecutorService scheduledExecutor;
       private MetricsTrackerFactory metricsTrackerFactory;
       private Object metricRegistry;
       private Object healthCheckRegistry;
       private Properties healthCheckProperties;
    

    它不使用 maxActive 属性,所以你的问题不适用于这个连接池。

    在您的情况下,您可以删除此属性,因为 com.zaxxer.hikari.HikariDataSource 没有使用它。

    【讨论】:

    • 感谢您的回答!但这个问题更笼统地涉及池的基本架构。看看我的问题。还有:女贞 iz Moskvi:)
    • tomcat 的 pool 架构与 Hikaru 的架构或 DBCP 有那么大的不同吗?(例如)
    • 是的,它是完全不同的源代码和实现。唯一的共同点是接口。但是接口不是实现 :( 实现是不同的,你可以查看两者的源代码。这是了解它如何工作的最好方法。最终的真相来源 :) 但请注意,主要版本之间的实现可能会发生根本变化。 DBCP 2.x 的实现方式与 DBCP 1.x 不同。
    • 我现在在纽约 :) 但是谢谢你的 'Privet' :) 来自纽约的 Privet :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2020-07-10
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多