使用了spring jpa 作为数据管理插件,主要是因为前人留下,使用方便。
在使用的时候发现了一个奇怪的问题,只要项目一启动,数据库线程池连接就耗尽。
不用多想是线程池管理出问题了,工程里使用了多个数据库。
查找了下质料,spring jpa 使用的是Hikari作为线程池管理的,在默认的情况下是启动10个线程池连接。
问题就在这里,我这里大概有5个库,并且都分读写,那么启动后就是100个线程池。大概这样,启动了其他服务就容易出现了线程池不足。
查询了很多的资料,可以通过配置进行修改控制,可是怎么修改yml的配置,就是不生效,不知为何?
跟了下代码发现配置读取有要求,也懒得新增了。
public HikariConfig() { this.dataSourceProperties = new Properties(); this.healthCheckProperties = new Properties(); this.minIdle = -1; this.maxPoolSize = -1; this.maxLifetime = MAX_LIFETIME; this.connectionTimeout = CONNECTION_TIMEOUT; this.validationTimeout = VALIDATION_TIMEOUT; this.idleTimeout = IDLE_TIMEOUT; this.initializationFailTimeout = 1L; this.isAutoCommit = true;
// 通过环境变量来读取配置 String systemProp = System.getProperty("hikaricp.configurationFile"); if (systemProp != null) { this.loadProperties(systemProp); } }
通过配置文件的设置
public HikariConfig(Properties properties) { this(); PropertyElf.setTargetFromProperties(this, properties); } public HikariConfig(String propertyFileName) { this(); this.loadProperties(propertyFileName); }
无赖之下,只能是代码手动配置了。
public DataSource dataSourceRead() { HikariConfig config = getReadConfig(); HikariDataSource ds = new HikariDataSource(config); return ds; }
public HikariConfig getReadConfig(){
HikariConfig config = new HikariConfig(); DbUtils.initDbPool(config); config.setPoolName("Hikari read Db"); return config; } public static void initDbPool(HikariConfig config) { long timeOut = 60L * 1000L; config.setIdleTimeout(timeOut); config.setMinimumIdle(0); config.setMaximumPoolSize(5); }
代码内容很简单。