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=1048576
1MB 的缓存大小。
效果
有一个数据库的 SQL 执行引擎系统。
涉及到的数据库源较多,定时执行以下 SQL,有些 SQL 一分钟左右执行一次。
近期,发现 oracle 数据库备库切换 ip 的时候,已经切换完成了,但是系统还是长时间会出现异常。
且有多台机器存在这个问题,重启后问题解决。
排查过程
首先下流量, jstack 获取堆栈信息,然后服务重启。
发现堆栈日志在 getConnection 时等待,同时观察 CAT 发现等待了 20 分钟才释放资源。
初步猜测,原因是 getConnection 超时时间过长。