Java spring连接池在物理级别上是如何工作的?

Java spring连接池在物理级别上是如何工作的?,java,spring,Java,Spring,例如,我有一个设置: spring.datasource.maxActive=5 这是否意味着Spring启动后,池中已经创建了5个活动物理连接?或者它们只是物体 访问池后是否会创建与数据库的物理连接 如果所有5个连接都忙,连接池是否会创建新连接并将其放入池中 中间立场在哪里?如何计算游泳池的体积 每个连接池都有自己的配置选项。即使不同版本的连接池也可能有不同的选项。比如说,maxActive在DBCP 1.x中使用,在DBCP 2.x中被重命名为maxTotal 了解您正在使用的连接池对于正

例如,我有一个设置:

spring.datasource.maxActive=5
  • 这是否意味着Spring启动后,池中已经创建了5个活动物理连接?或者它们只是物体
  • 访问池后是否会创建与数据库的物理连接
  • 如果所有5个连接都忙,连接池是否会创建新连接并将其放入池中
  • 中间立场在哪里?如何计算游泳池的体积

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

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

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

    从源代码:

       // 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未使用它。

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

    通常(但不是规则):

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

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

    是否使用DBCP连接池?我在Spring Boot 2.0.com.zaxxer.hikari.HikariDataSource中默认使用HIKARIP?是!它是com.zaxxer.hikari.HikariDataSource。感谢Martin接受答案!我希望您能理解连接池是如何工作的,并有一天编写一个新的实现!谢谢你的回答!但这个问题更一般地涉及池的基本架构。看看我的问题。还有:Privet iz Moskvi:)tomcat的池架构是否与Hikaru的架构或DBCP如此不同?(例如)是的,它的源代码和实现完全不同。唯一常见的是接口。但接口不是实现:(实现是不同的,您可以检查两者的源代码。这是了解其工作原理的最佳方式。事实的最终来源:)但请注意,在主要版本之间,实现可能会发生根本性的变化。DBCP 2.x的实现方式与DBCP 1.x不同。我现在在纽约:)但感谢您的“女贞子”:)来自纽约的女贞子:)