之前数据源经常断,总之有时候一个请求会等比较久的时间才会响应,还以为是Druid有BUG,感觉应该不至于啊,记得几年前搭建过一个项目,当时也是数据源经常断,是因为mysql8小时机制,当时的原因是,连接池中的部分连接没有有效释放,这次吸取上次教训,特地每隔五分钟,刷新一下连接,可还是存在断连的情况,为此很崩溃,起初我还以为是数据库连接池设置的太小导致。后不甘心,查看了mysql的配置,才发现,我们的运维是“神”一样的队友啊,交互式连接超时竟然设置为两分钟。。。。
故为同道中人提供解决问题的思路,别像我似的趟这么多坑:
1.mysql8小时断连
2.数据库连接池过小
3.数据库连接没有释放,连接泄露
4.配置连接池中连接存在时长,配置每隔一段时间激活一下连接,保持连接活性
5.看看是否有像我们运维一样的人才,查看数据库配置
6.是否启用慢查询
提供Druid配置指南:注意,不同数据库中,sql语句不一样,mysql是select 1
Druid 参数
配置参数 | 缺省值 | 游戏服设置的值 | 参数说明 |
initialSize | 0 | 4 | 初始化连接数量 |
minIdle | 0 | 4 | 最小空闲连接数 |
maxActive | 8 | 8 | 最大并发连接数 |
maxWait | -1L | 60000 | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后, 缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 |
timeBetweenEvictionRunsMillis | 60000 | 60000 | 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 Destroy线程会检测连接的间隔时间 |
minEvictableIdleTimeMillis | 1800000 | 1800000 | 配置一个连接在池中最小生存的时间,单位是毫秒 |
validationQuery | null | select 1 | 用来检测连接是否有效的sql,要求是一个查询语句 |
testOnBorrow | FALSE | FALSE | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
testOnReturn | FALSE | FALSE | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
testWhileIdle | TRUE | TRUE | 建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果 空闲时间大于 timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。 |
poolPreparedStatements | FALSE | TRUE | false 是否缓存preparedStatement,也就是PSCache。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。 在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。 5.5及以上版本有PSCache,建议开启。 |
maxPoolPreparedStatementPerConnectionSize | 10 | 100 | 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true。 单个connnection独享一个statement cache,也就是说maxOpenPreparedStatements是针对单个 |