弹簧连接池在物理级别如何工作?

时间:2018-06-22 16:25:14

标签: java spring

例如,我有一个设置:

spring.datasource.maxActive=5
  1. 这是否意味着在Spring启动之后,已在池中创建了5个活动的物理连接?还是只是对象?
  2. 在访问池之后是否会创建与数据库的物理连接?
  3. 如果所有5个连接都忙,连接池会创建新的连接并将其放入池吗?
  4. 中间立场在哪里?如何计算池的容量?

2 个答案:

答案 0 :(得分:1)

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

通常(但非常规):

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

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

答案 1 :(得分:0)

每个连接池都有其自己的配置选项。甚至连接池的不同版本也可能具有不同的选项。假设在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没有使用它。