有时通常几乎没有时间运行的查询突然开始花费2秒钟来运行。 (查询为select count(*) from calendars
,返回数字10)。这仅在通过我们的应用程序运行查询时发生,而不是在直接针对数据库服务器运行查询时发生。当我们重新启动应用程序服务器软件(Tomcat)时,突然性能恢复正常。通常我会责怪网络,但对我来说没有任何意义,重启应用程序服务器会使它突然表现得更快。
我的怀疑落在连接池上,但我尝试了各种不同的设置和多个不同的连接池,我仍然有相同的结果。我目前正在使用HikariCP。
有谁知道可能导致这样的事情,或者我如何诊断问题?
答案 0 :(得分:2)
您是使用存储过程还是即席查询?关于在运行查询时获得不同执行的原因,让我们说在管理工作室中使用存储过程在您的应用程序中可能是低效的缓存执行计划,这可能是由于参数嗅探而生成的。你可以阅读更多关于它的here,你可以尝试多种解决方案(比如用局部变量替换参数)。如果重新启动整个计算机(并且SQL Server也在其上运行),那么这可以解释为什么在重新启动后在开始时获得快速查询的原因 - 因为执行计划在重新启动后会被清除。
答案 1 :(得分:0)
事实证明,我们有一个流氓进程,它同时抓取了64个与数据库的连接,并将所有这些连接用于激烈而低效的工作。我们能够使用jstack进行诊断。当我们注意到系统减速了一吨时,我们运行了jstack,它向我们展示了应用程序的工作原理。我们在同一个流氓进程中看到了64个堆栈跟踪,我们得到了答案!