当前位置: 首页 > 知识库问答 >
问题:

hibernate性能与许多实体

须捷
2023-03-14

我有以下代码行:

log4net。后勤经理。GetLogger(“m”)。调试(DateTime.Now.ToString(“hh:mm:ss.fff”)“Check-1”);

设置=会话。CreateQuery(“来自设置s”)。UniqueResult

Log4net. LogManager. GetLogger("m"). Debug(DateTime. Now. ToString("hh: mm:ss.fff")"Chec-2");

上面的代码在不到毫秒的时间内执行(Check-1和Check-2中的时间相同,它以毫秒为单位测量时间,代码中未显示使用的标准)。

但在这种情况下:

伊利斯特

foreach(Ticket t in tickets)
{
t.Dosomething=5;
log4net.LogManager.GetLogger(“m”).Debug(DateTime.Now.ToString(“hh:mm:ss.fff”)“Check-1”);Setting=session.CreateQuery(“from Setting s”).UniqueResult

上面的代码是处理大量数据的大型处理代码的简化版本,我需要在foreach循环中进行另一个查询。forech循环中的查询将在500毫秒内执行。票集合包含15000行。

我已经重新分析了代码(foreach中没有查询),但我感兴趣的是,为什么单独执行相同的查询不需要时间来执行,但如果在首先加载大量实体之后执行,它会变得如此缓慢?

但在上面相同的场景中,如果我对第二个查询使用不同的会话,它会立即执行。

当我需要在大量实体的foreach循环中执行另一个查询时,有没有建议如何处理这种情况?

共有3个答案

公孙辰龙
2023-03-14

连接两个表并获得结果总是比获取第一个表记录、迭代然后获取第二个表记录更好。

给你更多的要求

顾亦
2023-03-14

尝试在迭代之前使用投影将票证加载到DTO中。HiberNate跟踪会话中所有加载的对象,直到它刷新,使用投影加载您需要的数据将意味着HiberNate不需要加载和跟踪对象。

冷夜洛
2023-03-14

默认情况下,NHibernate跟踪会话中加载的对象(一级缓存)。进行查询时,NHibernate会检查某些加载的对象是否有可能影响查询结果的更改——这些更改必须刷新到数据库中,以便查询返回正确的结果。加载的对象越多,此过程所需的时间就越长。

NHibernate和ISession针对加载的对象数量相对较少而进行了优化,这不是问题。

以下是一些提高批量场景性能的技巧:

>

如果您已经将工作分成更小的部分,您可以使用会话。Flush()会话。在策略点(每个独立部分之后)清除()以刷新更改并将跟踪对象的数量保持在合理水平。使用此策略,所有部分都可以在同一事务中运行。

查看会话。FlushMode禁用自动刷新查询。使用刷新模式。提交或从不并显式调用Flush()。但是,查询的结果可能不会反映同一工作单元早些时候执行的更改。

 类似资料:
  • 我正在比较旧方式和使用Hibernate之间的数据库“更新”性能。 这是我的数据库结构:document->code->code_details。父表和子表之间存在一对多的关系。 我对其进行了分解,并注意到在Hibernate版本中,大多数时间都在占用“query.executeUpdate()”->954毫秒和“hibernateTransaction.commit()”->750毫秒。 如何在

  • 问题内容: 从MySQL中的多个表中选择时,以下两个查询均返回相同的结果集。 这些查询中的一个比另一个查询 更好 或更有效吗?根据我在一个小的数据集(每个表中约有2000行)的测试中,它们都在大约相同的执行时间上返回了相同的结果集。 查询1: 查询2: 问题答案: 它们是相同的,但是语法不同。因此,您不应该期望这两种语法之间的性能差异。但是,建议使用最后一种语法(ANS SQL-92语法),有关更

  • 问题内容: 我的项目是一个网络移动应用程序,它使用对服务器的大量调用来刷新和检索数据,我正在使用php脚本从服务器获取数据。 我注意到,并且用户也告诉我,有时应用程序性能非常慢。我认为这是由于调用导致的,我检查了服务器,并在发生此问题时没有任何性能问题。 这很奇怪,因为当问题发生时,应用程序将请求发送到服务器,并被卡住,直到出现超时错误为止;再次发送时,它运行良好并在不到一秒钟的时间内给出了答案。

  • 问题内容: 另一个hibernate问题…:P 使用Hibernate的Annotations框架,我有一个实体。每个人都可以有一个朋友的集合:其他的集合。但是,我还无法弄清楚如何在由s 列表组成的类中创建多对多关联(使用用户友好中间表)。 这是User类及其注释: 用户- 朋友映射表只有两列,这两列都是该表列的外键。两列是(应映射到当前用户)和(指定当前用户的朋友的ID)。 问题是,即使我已经预

  • 我有一个基于Java8 Spring Boot 2.3.3的应用程序(使用Hibernate5.4.20),我有一个Postgreql。我想最终了解使用数据库视图和@Sub选择是否更好(对于性能)。 简单概述一下:我有一个实体“Book”和3个实体“BookRank”(用户给书打1到10颗星)、“BookComment”(用户对书的评论)、“BookLike”(用户把书的评论放在一起),每个实体都

  • 概览 首先我们了解一下 YODAOS 的运行时:YODAOS 基于 ShadowNode 它采用事件驱动、非阻塞I/O模型;在设计之初,ShadowNode 的接口与 Node.js 兼容,因此在大部分场景下,开发者可以像 Node.js 一样使用 ShadowNode,了解这些有利于开发者更快速的进行 YODAOS 上的应用开发。 YODAOS 开发应用时,需要关注应用的性能与稳定性,包括但不限