当前位置: 首页 > 网络应用技术

实际的战斗测试告诉您哪种性能更好

时间:2023-03-09 01:37:51 网络应用技术

  由于编程思想和数据库的设计模式不同,因此给出了一些ORM框架。

  核心是将关系数据库和数据转换为对象类型。当前的流行方案包括Hibernate和Mybatis。

  两者具有自己的优势和缺点。竞争是激烈的,更重要的考虑因素之一是表现。

  因此,通过各种实验,作者在同一情况下测量了与性能有关的两个索引以供参考。

  友好的提醒:如果您怀疑这篇文章太长了,则可以将文本的结尾拉到以查看结论。

  需要确定以下测试:

  性能差异的场景;

  在同一场景中的性能没有什么不同。

  找到每个框架的优势和缺点,各种情况下的性能以及应用场景。

  测试整体划分:单个表插入,关联的插入,单表查询,多表格查询。

  测试分为两轮。在同一场景中,默认参数进行了一轮。

  确保测试中的输入和输出一致性。

  样品体积尽可能大,达到100,000个水平,并减少了统计误差。

  在特定场景中

  插入测试100万记录插入。

  查询测试1:100万个数据中表通过ID查询100,000次,没有连接的字段。

  查询测试2:100万个数据中表通过ID查询100,000次,并输出关联的对象字段。

  查询测试3:100万*500,000相关数据查询100,000次,两者输出相同的字段。

  数据库:MySQL 5.6

  表设计:

  Twitter:Twitter

  用户:用户

  测试数据准备:

  表1:Twitter

  没有数据。

  表2:用户

  500,000个随机用户名。

  随机内容Twitter表(材料_twitter)

  没有ID,只有随机字符串内容,总计100,000。

  用于插入控制表。

  生成数据代码,相关100用户:

  生成数据代码,相关500,000用户:

  物理代码

  插入测试1

  代码操作:

  将随机内容Twitter表的数据加载到内存中,然后将其添加到Twitter表中,总计100,000。

  关键代码:

  冬眠:

  mybatis:

  twittermapper.xml,插入代码片段:

  查询测试1

  从ID到100,000的1到100,000次,查询Twitter内容仅导出微博内容。

  关键代码:

  冬眠:

  mybatis:

  查询测试2

  像查询测试1一样,添加了微博的创始人的名称字段,需要在此关联。

  其中,有100,000个用户可能会重复使用。这里相应的用户数量可能会影响懒洋洋的Hibernate加载的状况。

  这是一个方便的休眠场所,您可以直接通过getAdduser()直接获得与用户相关的字段。

  但是,Mybatis需要编写一个新的VO,因此在测试Batis时,将CreateUsername直接添加到Twitter实体中。

  这里的Hibernate将测试懒惰和懒惰的装载。

  Mybatis将测试默认情况和缓存情况。

  其中,Mybatis的缓存机制更难配置,并且不适合真实业务(可能具有肮脏的数据),这仅适用于参考。

  在测试期间,与Twitter关联的用户数量造成了两种情况。一个是Twitter共有100个用户,即不同的Twitter,即在100个用户中,此处的相关关系是随机生成的。

  另一个是Twitter共有500,000名用户,将发现50个用户的信息。

  您可以在上面的“准备”中看到相关的数据生成方法。

  关键代码:

  冬眠:

  无声加载配置更改,twitter.java:

  mybatis:

  twittermapper.xml配置:

  检测结果

  测试分析

  测试分为插入,单个表查询,相关查询。相关查询中的三种情况分为三种情况。

  其中,在相关的字段查询中,在两种情况下,Hibernate具有较大的性能差异。在懒惰加载的情况下,如果有很多用户与Twitter相对应,则性能将比只有100个用户的情况差得多。

  换句话说,如果用户数量很少(与之关联的用户总数),也就是说,当将重复查询相同的用户时,则无需在用户表上进行过多查询。

  查询文档后,证明在使用懒惰加载时,该对象将使用ID作为缓存的关键,也就是说,在查询100个用户后,随后的用户信息使用缓存来从根本上改善性能。甚至高于mybatis。

  如果与500,000用户有关,Hibernate需要查询500,000个用户信息并组装这500,000个用户。在此时间。

  其中,Hibernate的非懒惰负载也与Mybatis的其他测试相对较大,平均值小于1ms。

  造成这种差异的主要原因是,由Mybatis加载的字段非常干净,并且没有太多直接反射到协会中的字段。相反,Hibernate将整个表将整个表加载到对象,还包括关联的对象用户字段。

  在这种情况下,冬眠是好是坏。这取决于特定场景。对于管理平台,信息需要更多信息。当并发要求不高时,Hibernate具有优势。

  但是,在一些小型活动中,在Internet网站上,在高组合下,Hibernate的解决方案不合适,Mybatis+VO是首选。

  此外,请注意公共帐户Java Technology Stack,在背景中回复:采访,您可以获得MYBATIS系列的面部测试问题和答案,这是非常完整的。

  通常,在所有情况下,在所有情况下,尤其是插入和单表可查询,它们都会比冬眠略好。但是,差异并不明显,并且基本上可以忽略差异。

  区别在于,为了确保POJO在关联查询期间的数据完整性,Hibernate需要加载相关数据并需要其他数据。Hibernate不提供相应的灵活性。

  关联的很大差异是懒惰的加载特性。在它们的情况下,Hibernate可以特别使用POJO完整性来缓存,并且可以在第一和第二级缓存中保存对象。如果对单个对象进行更多查询,将会有明显的性能好处。

  将来,当关联单个对象时,可以通过懒惰加载并添加第二级高速缓存来提高性能。

  最后,数据查询的性能与ORM框架没有太多关系,因为ORM主要帮助开发人员将关系数据转换为对象型数据模型。根据代码的分析,Hibernate设计为更重量级。它可以被视为数据库的重新开发,以防止数据库过多关注的特征的发展。它是根据冬眠直接开发的。它分为SQL生成,数据包装和其他过程。这里需要很多时间。但是,Mybatis更直接,主要是关联和输出字段之间的映射。在它们中,SQL基本上是编写的,可以直接替换它。您不需要动态生成整个SQL语句,例如Hibernate。

  幸运的是,在此阶段已经优化了Hibernate。它的性能没有太大的差异,而在发展效率方面,可伸缩性比Mybatis好得多。

  最后,关于Mybatis缓存,缓慢的冬眠查询等,然后进行测试。

  与Hibernate和其他封装相比,Mybatis的ORM实施方面,由于Hibernate的数据对象的操作已实现了严格的包装,这可以确保在其角色范围内的高速缓存同步,并且IBATIS提供了半公开的包装实现是的,因此对于半公开的包装实现,因此,出于原因,对于半公开的包装实现,因此对于半透明的包装实现,因此,对于半插入包装实现的原因,因此,出于原因,提供了半公开的包装实现,因此对于半盖的软件包实现,缓存的SOTHE操作很难完成完整的自动化同步。

  上述缓存配置测试仅在性能中进行分析。它不会添加可用性,因为Mybatis直接配置了缓存,可能会显示脏数据。

  在相关查询数据的情况下,Hiberntae的懒惰负载和次要缓存是一个更好的解决方案(没有脏数据),与Mybatis相比,它也是一个相对明显的优势。在这种情况下,性能与Mybatis相同。

  在实际情况下,Mybatis可能不会在此位置配置缓存,并且会发生肮脏的数据,因此在这里,冬眠性能很可能会更好。

  作者:Zheng Muxing