discard long time none received connection
maven 引入
com.alibaba
druid-spring-boot-starter
${alibaba-druid.version}
详细介绍一下 druid password 的加解密
Druid 提供了对数据库连接密码的加密和解密功能,以提高安全性,防止数据库密码在配置文件中以明文形式暴露。
这种加密方式是通过 Druid 的内置功能实现的。
一、加密密码
Druid 使用 DruidPasswordCallback 进行密码的加密和解密。加密密码的步骤如下:
-
生成密钥文件
首先,你需要生成一个用于加密和解密的密钥文件。这个文件会用来加密数据库密码。
java -cp druid-x.x.x.jar com.alibaba.druid.filter.config.ConfigTools运行上述命令后,输出结果会包括三个部分:
- privateKey: 私钥
- publicKey: 公钥
- password: 加密后的密码
例如:
privateKey: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMl1ryLz9ZfLbUI... publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL9sBkwHY... password: Dv7cWQk1jVc7K/zNFFN2asU5Cn... -
保存公钥和加密密码
- 将公钥保存到一个文件中,比如
publicKey.txt。 - 在配置文件中使用加密后的密码。
- 将公钥保存到一个文件中,比如
机器在定时跑批执行大量 SQL 时,发现系统触发大量的 FULL-GC。
配置信息
应用中配置了的 druid 大概如下:
-->
-->
实时链路,同时支持多个 oracle/mysql 的数据源配置
然后,发现 oracle dump 大量的内存数据信息,导致频繁的 GC。
怀疑可能1-PreparedStatementCache
说明
怀疑是 jdbc 的 PreparedStatementCache,导致的缓存占用过多的内存。
修改方式
禁用 psCache
将 druid 的 psCache 禁用
DruidDataSource dataSource = new DruidDataSource();
// 是否启用池化 ps
dataSource.setPoolPreparedStatements(false);
实时链路,同时支持多个 oracle/mysql 的数据源配置
然后,发现 oracle dump 大量的内存数据信息,导致频繁的 GC。
其中占比比较大的一个对象就是 oracle.jdbc.driver.BufferCache
个人解决方式
-
移除 fetchSize 设置
-
druid 添加连接属性
oracle.jdbc.maxCachedBufferSize=10485761MB 的缓存大小。
效果
有一个数据库的 SQL 执行引擎系统。
涉及到的数据库源较多,定时执行以下 SQL,有些 SQL 一分钟左右执行一次。
近期,发现 oracle 数据库备库切换 ip 的时候,已经切换完成了,但是系统还是长时间会出现异常。
且有多台机器存在这个问题,重启后问题解决。
排查过程
首先下流量, jstack 获取堆栈信息,然后服务重启。
发现堆栈日志在 getConnection 时等待,同时观察 CAT 发现等待了 20 分钟才释放资源。
初步猜测,原因是 getConnection 超时时间过长。
