0

下午好,

我正在大学开发我的 serach,比较 Hibernate 和 JDBC,工作的主要重点是性能。

我也被指控的一个问题与我将如何进行这些性能测试有关。

好吧,这就是我的工作,拥有两种对数据库进行查询以查找数据 X 的方法,这些查询将用 hibernate 和 jdbc 编写,并由此对两者进行测试。

你能告诉我这些测试的执行频率和评估方式吗?使用什么工具?搜索我发现了一个名为 JConsole 的 jdk 附带的工具,你认为这个工具可以解决我的问题吗?

谢谢:]

4

2 回答 2

6

出于几个原因,我会投票结束这个问题。但这是一个经常被提起的话题,所以,我觉得有必要回答一下,特别是因为作为我日常工作的一部分,我花了一些时间思考并为 Hibernate 做一些性能测量。

对 Hibernate 或任何涉及数据库的东西进行性能测试和/或基准测试是非常棘手的,并且应该只在需要解决现实世界问题的环境中进行(即:现有应用程序)。综合基准​​通常几乎没有用,因为它无法为更广泛的受众提供足够好的答案。我知道这是一次学术经历,应该被视为这样:-) 我将尝试列出我遇到的主要问题:

1)休眠速度太快而无法准确测量。由于大部分时间都花在网络和数据库本身上,因此很难衡量花在 Hibernate 上的时间。我使用了一组技巧来提取它,包括使用 ByteMan ( http://jboss.org/byteman ) 来增强字节码以提取确切的时间。我测量的大多数操作只需要几毫秒。这意味着即使是机器上最轻微的干扰也会导致结果发生重大变化。因此,请注意标准偏差,并丢弃很大一部分“最佳结果”和“最差结果”(我建议各取 20%,最后以中间的 60% 结束)。

2)很难在本地数据库和另一台机器上的数据库之间做出选择。原因是,如果您决定使用本地数据库,您最终不会测量 Hibernate,而是操作系统的调度程序和 IO,或者如果您决定在单独的机器上使用数据库,那么您最终会测量网络性能。

3) Java HotSpot VM 对字节码做了很多内联,使用得越多就会优化它。因此,您必须在进行实际计时之前“预热”虚拟机。如果您进行 10 分钟的性能测试,只进行几千次操作,您最终可能无法测量软件的最佳性能。所以,运行它几个小时。或者更好的是,运行多个测试,每个测试的小时数不同:4 小时、8 小时和 16 小时将是不错的候选。

4)仍然在“最佳性能”主题上,您应该根据您的使用微调 Hibernate。例如,如果您在运行 Hibernate 的主机上有大量内存和快速 CPU,并且您选择在单独的机器上使用数据库,则缓存选择可能有助于 Hibernate 获得性能。在这种情况下不使用缓存是不现实的;-) 此外,根据具体情况,缓存实际上可能会受到伤害。因此,需要深入了解 Hibernate 的 2 级缓存如何工作。

5)谈缓存:Hibernate有一级缓存和二级缓存。是否使用缓存的选择也会影响最终结果。连接池也是如此:Hibernate 确实带有内部连接池机制,不应该用于生产。因此,您最终会测量一个根本不应该使用的组件。另一方面,您可能不会为 JDBC 测试实现自己的缓存或连接池机制。旁注:在现实世界中,在 Java EE 应用程序中,应将 Hibernate 配置为使用 Application Server 的连接池。

6) 您还应该了解 Hibernate 在现实世界中可能使用的 JDBC 功能,例如批处理查询(例如,如果您执行大量插入操作)。对于此选项,您可能需要调整 Hibernate 以对其进行调整。您还应该在“纯 JDBC”测试中实现这一点。请注意,对于某些 RDMBS,有些选项可能比其他选项更好。

7) 硬件:在本地机器上运行与在真实服务器上运行完全不同。我个人建议使用 Amazon 的 Linux 在 Amazon EC2 上的几种实例类型上运行它。这样,其他相关方很容易复制它。但也要注意虚拟机固有的延迟。从第 1 点丢弃 20% 的顶部和底部应该注意这一点。

祝你好运!

于 2013-05-24T20:28:18.633 回答
1

jConsole 将使您能够查看应用程序正在使用的资源,例如 cpu 使用情况和内存使用情况。您尝试使用哪些指标来测试这些调用?您是想查看使用的资源量还是只是想测试整体速度?

于 2013-05-24T19:00:07.320 回答