做外贸有哪些好的网站有哪些内容,三网合一网站建设费用,南京建设网站的公司,一个普通的网站做线上交易好吗问题描述
如题所述#xff0c;我们每新增一个数据源并且往 etcd 去生产的时候#xff0c;etcd 消费者收到监听到的内容去消费#xff0c;产生大量的数据库连接#xff08;通过 SHOW PROCESSLIST 查到#xff09; 原因分析
故事是因为项目本身有一个多租户功能#xff0…问题描述
如题所述我们每新增一个数据源并且往 etcd 去生产的时候etcd 消费者收到监听到的内容去消费产生大量的数据库连接通过 SHOW PROCESSLIST 查到 原因分析
故事是因为项目本身有一个多租户功能每个租户独立动态生成一个数据库那么这里就会牵扯到动态数据源的话题配置最小连接数是 10
TenantInfo tenantInfo new Gson().fromJson(multiTenantStr, TenantInfo.class);
log.info(tenantInfo.toString());
HikariDataSource dataSource new HikariDataSource(hikariConfig);
dataSource.setDriverClassName(tenantInfo.getDatasourceDriver());
dataSource.setJdbcUrl(tenantInfo.getDatasourceUrl());
dataSource.setUsername(tenantInfo.getDatasourceUsername());
dataSource.setPassword(tenantInfo.getDatasourcePassword());
handleHikariConfig(hikariConfig, dataSource);
一开始有 2 个很奇怪的现象下面会一一解释
1、Etcd 明明只生产一次为什么会反复的收到很多条一模一样的消息
经排查发现是因为 Etcd 报错导致反复重复的消费本条消息但是呢我们没在后台看到报错日志是因为异步监听所以后来我们也给它加了 try...catch... 来捕获异常发现异常来自于以下第 2 点会说明
2、理论上是新生产的连接池应该是新租户对应的数据库信息为什么老是生产默认的数据库连接池
HikariDataSource dataSource new HikariDataSource(hikariConfig);
dataSource.setDriverClassName(tenantInfo.getDatasourceDriver());
首先hikariConfig 因为拿的是默认的 application.yml 配置的连接池配置信息拿肯定里面包含了默认的 JDBC-URL然后一旦 new 成功后就会自动连接到数据库新增至少 10 条连接数。紧接着在 setXxx 属性的时候因为这个是连接好了的连接池信息这逻辑本身这么顺序颠倒着写就是不对的。虽然 HikariPoolMXBean 是支持动态修改配置信息但也是部分属性支持修改其余一旦动了就会抛异常抛异常抛异常……那么再感谢第 1 点说的 Etcd 报错没有 ACK 的问题引起的重试机制完美配合下你说这个数据库你不爆谁爆
其实主要就是以上两点加起来导致把数据库连接数干爆按一个最小 10 来算的话Etcd 如果没成功 ACK 的话就会启动重试机制重试 N 次那就会 N*10 条数据库连接数这能不打爆吗 解决方案
HikariConfig config buildConfig(hikariConfig, tenantInfo);
HikariDataSource dataSource new HikariDataSource(config);
那通过我们的分析就很好解决这个问题毕竟知道问题产生的缘由。
首先将默认配置拿到然后通过新租户对应的数据库配置信息来覆盖默认的配置信息。完事后再去生成新的 HikariDataSource 即可完美解决~ 温馨提示
new HikariDataSource(); // 无参构造: 使用懒加载模式第一次调用的时候才会连接数据库new HikariDataSource(config); // 有参构造在 new 的时候就会连接到数据库