使用hibernate和jdbc进行性能测试

fe_*_*jo_ 1 java testing performance hibernate jdbc

下午好,

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

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

嗯,这是我的工作简要,拥有两个方法,对数据库进行查询以寻求数据X,这些查询将在hibernate和jdbc中编写,并从中进行测试.

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

谢谢:]

jpk*_*ing 5

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

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

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

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

3)Java HotSpot VM对字节码进行了大量的内联,并且使用的越多,它就越优化.因此,在采取实际计时之前,您必须"预热"VM.如果您进行10分钟的性能测试,仅执行几千次操作,则最终可能无法以最佳性能测量软件.所以,运行它几个小时.或者更好的是,运行几个测试,每个测试的小时数不同:4小时,8小时和16小时将是很好的候选人.

4)仍然在"最佳性能"主题上,你应该根据你的用途微调Hibernate.例如,如果运行Hibernate的主机上有大量内存和快速CPU,并且您选择在单独的机器中使用数据库,则缓存选择可能有助于Hibernate获得性能.并且在这种情况下不使用缓存是不现实的;-)另外,根据场景,缓存可能实际上受到了伤害.因此,需要很好地了解Hibernate的二级缓存是如何工作的.

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

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

7)硬件:在本地计算机上运行与在真实服务器上运行完全不同.我个人建议使用亚马逊的Linux在Amazon EC2上的几种实例类型上运行它.通过这种方式,其他感兴趣的各方可以轻松再现.但请注意虚拟机固有的延迟.丢弃点1的20%顶部和底部应该处理这个问题.

祝好运!