我有一个使用Hibernate和HSQLDB进行持久化的开源Java应用程序。在我的所有玩具测试中,事情都很快,一切都很好。我有一个客户连续几个月运行该软件,他们的数据库在那段时间内显着增长,并且性能逐渐下降。我终于想到数据库可能是问题所在。据我在日志语句中可以看出,服务器中的所有计算都很快发生,因此这与DB可能出错的假设是一致的。
我知道如何对程序进行常规分析,以确定热点的位置以及占用大量时间的内容。但是我所知道的所有分析器都监视程序内的执行时间,并且不会给你任何有关外部资源调用的帮助。人们使用什么工具来分析使用外部数据库调用的程序来找出优化性能的位置?
一个小小的盲目搜索已经找到了一些热点 - 我注意到一个电话,我在列举特定类的所有对象,以便找出是否有。标准[.setMaxResults(1)]的一行更改将该调用从半秒更改为几乎瞬时。我还看到在单个事务中多次向db询问相同问题的地方。我还没有弄清楚如何缓存答案,但我真正想要的是一个工具来帮助我更系统地寻找这些东西。答案 0 :(得分:3)
不幸的是,据我所知,没有这方面的工具。
但是你可能想要检查一些事情:
答案 1 :(得分:0)
您在HSQLDB中存储了多少数据?我不认为它在管理大量数据时表现良好,因为它只是将所有内容存储在文件中......
答案 2 :(得分:0)
曾经有一个名为IronGrid / IronEye / IronTrackSql的工具完全符合您的要求。不幸的是,他们破产了。他们在最后一分钟确实开源了他们的产品,但是我已经有一段时间没能找到源码或二进制文件了。
我最近一直在使用YourKit进行性能分析,部分原因是因为您可以使用它来查找SQL时间来查找最常调用的语句和运行时间最长的语句。它没有IronGrid那么详细,但它确实为您提供了有价值的信息。在我最新的数据库/ hibernate调优会话中,问题变成了休眠以及它是如何以及何时进行预测和延迟加载,以及在选择大量项目时添加一些明智的默认覆盖。
答案 3 :(得分:0)
这里有很多报道。我有一些结果,我仍在寻找好的答案。
我找到了一些有用的工具:
VisualVM(带BTrace或内置Trace)声称有助于跟踪,但我找不到任何显示方法调用时间的工具。
YourKit被认为是有用的;我已经要求获得开源许可证。
我找到的最有用的东西是Hibernate内置的统计数据。如果你设置
在您的属性中hibernate.generate_statistics true
,您可以发送sessionFactory.getStatistics()
,并查看有关已存储和检索的对象以及缓存对其产生的影响的详细统计信息。我在qeuryStatistics中找到了我想要的答案之一,它报告了每个编译的查询,缓存命中和未命中,查询运行的次数,返回的行数以及平均,最大和最小执行时间。这些时间使人们清楚地知道时间在哪里。
然后我做了一些关于缓存的阅读。 Razenha的建议是正确的。 [我现在将其答案标记为正确。]我向我的媒体资源添加了hibernate.cache.use_query_cache true
,并在我的大多数查询中添加了query.setCacheable(true);
。我还在我的几个.hbm.xml文件中添加了<cache usage="read-write"/>
。现在我的大部分统计数据显示了缓存命中率的巨大优势,而且性能要好得多。
我仍然喜欢一些工具来帮助我跟踪执行时间,因此我可以解决最严重的问题,而不是最明显的问题,但这是一个很大的帮助。也许上面的一个跟踪工具会得到帮助。
答案 4 :(得分:0)
在Terracotta 3.1中,您可以使用Terracotta Developer Console实时监控所有这些统计数据。您可以查看缓存统计信息的历史图表,并查看群集范围内的hibernate统计信息或缓存统计信息,或基于每个节点。
Terracotta是开源的。更多详情和下载位于Terracotta for Hibernate。