- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
几天来,我一直在为针对 Oracle 数据库的 hibernate 查询而苦苦挣扎。类似这样的东西用于将记录提供给网格。
SELECT
fields
FROM
tables and JoinedTables
WHERE
Field1 >= :value1
AND Field2 = :value2
AND Field3 = :value3
Order By MaintTable.Id Desc
在 Spring Java + Hibernate 4.2 方法中使用此方法。
SQLQuery query = (SQLQuery) session.createSQLQuery(querySql)
.addEntity(CertificateViewEnt.class)
.setParameter("value1", firstCertificateRecordDate)
.setParameter("value2", certType.toUpperCase())
.setParameter("value3", deleted? 1:0);
每个过滤字段都正确索引并在 Maintable.Id Descendent 上创建函数索引以提高性能。
一开始以为是session/connection pool没有被正确管理,所以改成StatelessSession,加上这个session.close():
query.setCacheable(false)
.setTimeout(30)
.setReadOnly(true);
...
...
//Pagination
query.setMaxResults(rows);
query.setFirstResult(HelperMethod(page, rows));
result = (List<CertificateViewEnt>) query.list();
session.close();
return result;
没有解决。查询运行几次正常,但由于某些未知原因,并且使用之前已成功运行的值,挂起,使 session 在 Oracle 中打开(状态= Activity )并因超时而失败。在任何 SQL 客户端上针对 Oracle 运行相同的查询,并使用所有可能的参数组合执行数十次,以极高的性能执行,大约 400 毫秒,一次处理 10 条记录。
在阅读了一些文章之后,Link1 [ Slow performance on Hibernate + Java but fast when I use TOAD with the same native Oracle query链接2:[query hangs oracle 10g
我怀疑 Hibernate 使用的 QueryPlan 很糟糕,因此决定删除所有使用绑定(bind)参数的过滤器,但也没有解决,尽管它稍微好一点。移动到第 1、2、3、4 页等其他页面时挂了一会儿,......
毕竟,我怀疑Hibernate的方法生成的SQL
query.setMaxResults(rows)
query.setFirstResult(SomeHelperMethod(page, rows));
因为在日志中看到它们作为绑定(bind)参数传递给 Oracle。
...
Order By Certificado.Id Desc ) row_
where rownum <= ?)
where rownum_ > ?
我在跟踪日志中也看到了这一点
2015-09-15 14:09:53 TRACE QueryPlanCache:200 - Located native-sql query plan in cache (SELECT /*+ INDEX(
还有这个:
2015-09-15 14:09:53 TRACE BasicBinder:84 - binding parameter [2] as [VARCHAR] - E
2015-09-15 14:09:53 DEBUG Loader:2031 - bindNamedParameters() 0 -> deleted [3]
2015-09-15 14:09:53 TRACE BasicBinder:84 - binding parameter [3] as [INTEGER] - 0
2015-09-15 14:09:53 TRACE Loader:1931 - Bound [7] parameters total
/*
SLOW here !!! Around 3 secs when query runs in ~0,300 secs via SQL client.
And ACTIVE sessions are left running in Oracle.
*/
2015-09-15 14:09:56 TRACE JdbcCoordinatorImpl:397 - Registering result set [org.apache.commons.dbcp.DelegatingResultSet@f0c620]
2015-09-15 14:09:56 TRACE Loader:943 - Processing result set
最后我不得不放弃所有 Hibernate 绑定(bind)参数并实现自定义计算分页并编写所有 SQL 来检索页面行并且它正在运行并正确管理数据库 session 。
那么,我的问题是: hibernate 在阻止查询在针对数据库运行时运行的场景中做了什么?绑定(bind)参数查询是否存在任何已知问题?
当我有绑定(bind)参数时,我真的不喜欢编写所有 SQL 代码并强制硬解析此 SQL。
关于环境的一些注意事项:Tomcat 和 Oracle 在同一台主机上。所以网络连接不是问题
Hibernate 4.2.15 最终版
该表在开发数据库中有大约 30 万条记录(生产中有 1.5 万条记录),一次显示 10、20、50 条记录的页面,按主键降序排序(生成的序列)
希望一些 Hibernate 专家可以帮助我,这样我仍然可以信任大型数据库项目中的 Hibernate 查询。提前致谢。
最佳答案
我不知道这是否是您的问题,但 Oracle 在解析查询时会查看绑定(bind)变量值,然后保存查询计划以供将来执行,因此它不必在每次运行时都继续解析查询使用一组新的绑定(bind)变量。但是每隔一段时间就会重新解析查询。如果在解析过程中碰巧传递了一些不寻常的绑定(bind)变量值,则会存储和使用错误的计划。这是一种绑定(bind)变量的诅咒。它们减少了解析,但可以在再次解析查询时根据非典型的绑定(bind)变量值翻转计划。提示可以提供帮助。我们使用 SQL 配置文件来锁定带有绑定(bind)变量的查询计划,这些变量往往会改变计划。有时您可以自定义收集优化器统计信息的时间和方式,以便无论将什么值传递到绑定(bind)变量都可以创建一个好的计划。
无论如何,这是我一直看到的事情,可能是也可能不是你的问题。
鲍比
关于java - Hibernate 参数化 sql 查询缓慢且活跃的 oracle session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596761/
什么是 hibernate 和n- hibernate ?我可以在 Visual Studio 2008 中使用它进行 C# Web 应用程序开发吗?请给我建议...我是 asp.net Web 应用
我有一个不系统地发生的异常(exception)。 我试图通过在每次迭代中刷新和清理 session 来解决此问题,但没有成功。 [quartzScheduler_Worker-7] ERROR jd
使用 Hibernate 在数据库中存储 IP 地址的最佳类型是什么? 我虽然是 Byte[] 或 String,但有没有更好的方法,或者你用什么? @Column(name = "range_fr
我正在尝试制定一个公式来选择用户个人资料的用户友好名称。它选择名字 + ' ' + 姓氏 如果其中至少有一个不为空且不为空(包含非空白字符),否则选择 短名称 (条件相同),最后,如果 短名称 为空或
在hibernate中,是否可以将鉴别器作为一个实体?例如,如果我将 Department 作为基类,将 AdminDepartment 和 ProcessingDepartment 作为子类。 De
我只想从表中获取一些列值。因此,我已经使用投影来实现这一目标。该代码有效,但我认为它无效。 我的问题是当我使用ProjectionsList并将标准条件列表设置为ArrayList时-Bulletin
你好: 我对 hibernate 缓存缓存的内容感到困惑。 从文档中,我知道 hibernate 中有缓存类型。 一级 :交易级别。 似乎要被 session 持久化的实体被缓存在这里。 二级缓存 :
我遇到了一个情况: save或update hibernate 的目标表中的某些数据 在目标表上有一个触发器,该触发器将在目标表的insert或update操作之前执行 由 hibernate 将此记
我有一个名为 Master_Info_tbl 的表。它是一个查询表: 这是该表的代码: @Entity @Table(name="MASTER_INFO_T") public class Code
我想知道如何在 Hibernate 查询语言中使用日期文字。我在我的 JPA 项目中做了如下操作(作为 Eclipselink 提供者)并且它工作正常。 SELECT m FROM Me m WHER
@Entity public class Troop { @OneToMany(mappedBy="troop") public Set getSoldiers() { ...
我正在尝试使用 hibernate 查询删除表 'user_role' 中的所有行。但每次我都会出错。有人可以帮我吗。 DaoImpl @Override public void deleteAll(
不是将数据库操作分散在四个 (osgi) 包中,而是在那里做略有不同的事情。我想创建一个负责所有持久性问题的(简单的)OSGi 包。我觉得这并不像听起来那么简单,因为“每个包都有独特的类加载器”。 因
这就是我使用生成器的方式: private Integer id; 我看到的行为是: 创建第一个对象 hibernate 分配 id = 1 删除该对象 关闭服务
对象级别的实体和值类型有什么区别。我知道实体将有一个 id 但值不会,但为什么我们需要不同的方法来映射实体与值类型? 这样做是为了让hibernate可以对值类型应用任何优化吗? 最佳答案 一个实体已
我正在使用 HibernateTemplate.findByCriteria 方法进行一些查询。现在我想在标准上创建一些 SQL 限制,比如 criteria.add(Restrictions.sql
所以我有以下代码: Query query = session.createQuery("from Weather"); List list = query.list();
如何使用Hibernate映射具有多个实体的 View ? 问候, 混沌 最佳答案 请参见Hibernate文档中第5.1.3节“类”,紧接在“Id”节之前: There is no differen
据我所知,Hibernate 有两种类型的实现 JPA的实现(2)(@Entity,@Table注解) 扩展到旧的(传统的) hibernate (没有 JPA),使用 HSQL 查询,没有注释 如果
我需要一个将条目存储为键值对的集合(因此我可以通过键查找值),但我需要一个允许多个值使用 hibernate 共享同一个键的集合 最佳答案 一个键具有多个值的映射称为多映射 - 在 Apache 公共
我是一名优秀的程序员,十分优秀!