##1. 问题
最近,公司的 web 应用,查询数据有些慢,数据库使用的是 oracle,连接池采用了阿里巴巴温少开源的 Druid 连接池,于是开始寻找解决办法。
2. 方法
- 首先我们需要做的应该是通过 Druid 来监控我们应用中的慢 SQL,然后对其进行优化。从 SQL 监控和 SQL 防火墙中,我发现我们的 SQL 并没有多少慢 SQL。于是排除了慢 SQL 导致查询变慢的原因。
- Druid 中支持配置 PSCache。我们的 web 程序并没有开启这个选项,我们将其开启,发现查询返回的结果速度快了
20%
左右。
3. 原理
oracle 支持游标,一个 PreparedStatement 对应服务器一个游标,如果 PreparedStatement 被缓存起来重复执行,PreparedStatement 没有被关闭,服务器端的游标就不会被关闭,性能提高非常显著。在类似 SELECT * FROM T WHERE ID = ?
这样的场景,启用 PSCache 和不启用 PSCache 的性能可能是相差一个数量级的。
连接 oracle 数据库,打开 PSCache,但是其他的数据库连接池都会存在内存占用过多的问题,Druid 是唯一解决这个问题的连接池。