- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们的开发团队最近开始担心标准和 HQL 太慢。我运行了一些基准测试来了解缓慢的原因。
我每个运行以下查询 1001 次。我第一次运行查询时, session 不会缓存实体,但此后每次都会缓存实体。
Entity e = (Entity) session.get(Entity.class, new EntityID("Composite key value 1", "Composite key value 2"));
First call:
80.505875
Average of next 1000 calls:
0.045958 ms
Entity e = (Entity) session.createCriteria(Entity.class)
.add(Restrictions.eq("id", new EntityID("Composite key value 1", "Composite key value 2")))
.uniqueResult();
First call:
91.489098 ms
Average of next 1000 calls:
0.847434 ms
顺便说一句,HQL 中的相同查询第一次花费的时间更长,但在所有后续调用中统计上是等效的。
我了解到,与数据库查询相比,HQL 的标准以及 HQL 到 SQL 的转换所花费的时间微不足道。根据我的测试,这些翻译的时间似乎是 session 时间的 18.4 倍。
0.847434 / 0.045958 = 18.439314
假设一些实现细节,我预计查询的转换需要 0.801476 毫秒。这意味着转换步骤需要 session 时间的 17.4 倍时间。使用 JDBC,我们可以在 0.025368 毫秒内运行这些查询。这是一个以前使用 ODBC 的转换项目,因此我们正在寻找与之前的速度相当的速度。然而,即使使用缓存,我们似乎也无法达到可比的速度。
(0.847434 - 0.045958) / 0.045958 = 17.439314
我预计,通过使用缓存来避免与数据库通信,我们在后续调用中将达到与 JDBC 相当的速度。标准翻译需要一毫秒的时间来运行是否正常?人们如何通过使用标准的缓存来达到与 JDBC 相当的速度?
编辑:我的帖子包含一个重大错误,似乎相同的代码产生了两个不同的统计数据。此问题现已修复。
最佳答案
I ran the following queries 1001 times each. The first time I run the query the entity is not cached by the session, but every time after that the session is cached.
你的假设是错误的。使用 Criteria API 时,条件查询不会缓存在持久性上下文中。即使您使用 id 属性,也会执行 SQL 查询。而使用 get
方法时,对象确实维护在一级缓存(持久化上下文)中。
您可以通过启用 show_sql=true
来验证它。对于第一个用例,您将看到单个查询打印输出。对于条件,您将看到 1000 个查询。
第一次预热调用速度明显变慢的原因是必须从池中获取/创建连接,可能缓存一条语句等。
也就是说,将 setCacheable(true)
添加到条件中,您将看到平均时间下降到接近调用 get
的水平。
关于java - Hibernate session.createCriteria 与 session.get 性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26911883/
我在不同的示例、教程、博客等中看到过这两种格式,但就我的生活而言,我找不到对差异的解释。有什么区别 ICriteria crit = session.CreateCriteria(typeof(Cat
我在不同的示例、教程、博客等中看到过这两种格式,但就我的生活而言,我找不到对差异的解释。有什么区别 ICriteria crit = session.CreateCriteria(typeof(Cat
我正在尝试创建一个REST服务,该服务以JSON格式返回结果。 我创建了一个将返回搜索结果的方法。它接受一个EnumMap搜索参数,并检查这些参数以建立createCriteria。 我遇到的问题是,
我怎样才能在 grails 中使用 createCriteria 获得类似这个 MYSQL 查询的内容? SELECT * FROM engine4_user_fields_val
刚刚了解createCriteria()方法的功能。只是想知道,除了将其应用于Controller之外,还有没有一种方法可以应用于域类?可能是自己映射到类似这样的属性: static mapping
我想获取在其列表(firstsList或SecondsList)中包含特定用户的实例。 在我的解决方案中,创建条件仅考虑第一批用户。 逻辑OR的用法似乎不正确 域 class ClassA {
我正在尝试使用 criteria 从数据库中获取数据 Domain class发票 - class Invoice{ Date invoiceNo Date invoiceDate
几个小时以来,我试图弄清楚如何使用一种必须在列表中的条件来创建条件。 如果减少代码,则有以下两个域类: 酒店-我要检索的基本域类: class Hotel { static hasMany =
能够使用分页是目标,但是我不确定如何使用它。该关系是单向的hasMany(如下所示)。目前,它可以在没有分页的情况下正常工作(请参阅Screenshot),但是要使用分页,我必须更改 Controll
我很好奇如何使用条件构建器访问继承的类的字段。 假设我们有以下类(class): class A { String fieldOne String fieldTwo static hasM
我是Grails条件构建器的新手,有人可以解释以下含义吗? def c = Account.createCriteria() def results = c {
我可以做到这一点: def criteria = Category.createCriteria(); def results = criteria.list{
def employee = Person.createCriteria().listDistinct { eq "personType" UserType.EMPLOYEE or {
我想写一个单元测试(通过 JUnit)来测试这个函数在 Groovy 中的值: String getPeopleNamesById(int[] peopleIds) { Lis
在 SQL 中我可以写 SELECT blah FROM Clients Where @p1 Like '%'+lastname+'%' 如何在 Nhibernate 中使用 CreateCriter
我在createCriteria中的查询中有一堆行,但是必须进行一些更改,我需要在一行中隐藏带有0的行,在另一列中隐藏带有字母A的行,但是如果它们有,我就不会隐藏它们0和另一个字母,如何在create
通过使用CreateCriteria,我想比较两个列表,并检查groups中users中是否存在至少一个元素。 有像eq这样的东西吗? 域 class User { String login
我有一个域类反馈 class Feedback{ String name String email Date createdOn Boolean isMailSent
场景是这样的: 每个Process具有多个ProcessingSteps 我编写的代码能够获取所有进程,而无需与ProcessingSteps对应。 我知道我缺少where子句,我想问一下我们如何在G
我在grails中有一个域类,该类具有一列字符串类型。下面是域类结构。 class TravelRequestUpdates{ updatedAt sqlType:'varchar(4
我是一名优秀的程序员,十分优秀!