在使用Hibernate分页器时,习惯使用直接把查询语句、页数、分页大小,传给分页器,这样会默认使用last来获取总记录数,效率非常的低。
解决方法,很简单,就是用SQL来count查询条件获得总记录的Query,再给Hibernate分页器(本身就写好了的)。
这样就必须多写几行代码,就是因为自己懒,觉着效果都一样,就简单的写了。
数据量大了以后,就很明显的速度慢下来了。又全部重头改过,很是郁闷。
转载此文,以示提醒!
即使懒得研究Hibernate底层,也要注意它的效率问题。
我看到一些资料这样说,oracle的jdbc驱动是不支持服务器端的游标的,当你调用resultSet.last()时,jdbc驱动程序会把整个结果集的数据读到内存,然后在内存中进行结果集的遍历。
如果在做分页的时候,用这样的方式获取结果的总记录数:
rs.last();
int rowcount = rs.getRow();
在结果集很大的时候,这个性能是相当低下的,并且会用掉很多的内存。
这个问题是昨天在检查人才网的代码时发现的,随着数据增加,原来被掩盖的问题才开始暴露出来。我们用jprofiler对程序进行剖析的情况也间接的证明了上面的说法:1) 连续几次刷新工作列表后,虚拟机的内存被占满了,运行垃圾回收后内存又被释放出来。2) 从页面请求到完成响应,resultSet.last()方法的调用占去了cpu的绝大部分时间。
因为上面提到的分页方法是一种常用的方法,我建议大家考虑一下自己的代码是否存在这样的问题,这对办公系统的稳定运行可能是很重要的。
参考:
http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/jdbc/rs/CountResult.html
提到了:
如果 ResultSet 非常大,则 resultset.last() 有可能是非常费时的操作,因为它将使用服务器端的更多资源。因此,除非确实需要可滚动结果集,应避免使用这种方法。
http://forum.springframework.org/showthread.php?t=50044&page=2
提到了:
Anyway, if it's a normal behaviour of the oracle driver to keep data in memory when using SCROLLABLE resultset
http://xiongbo.iteye.com/blog/38481
对几种游标类型做了介绍,并给出了建议
分享到:
相关推荐
Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,其...总的来说,掌握Oracle的常用函数和JDBC的基本操作是Java开发者必备的技能,这有助于高效地实现数据库的读写操作,并与各种类型的数据库进行无缝连接。
Oracle JDBC驱动程序是Java应用程序与Oracle数据库之间通信的桥梁,ojdbc8是Oracle公司为Java 8及更高版本提供的最新JDBC驱动程序。在Maven项目中,正确配置ojdbc8的依赖对于确保应用程序能够顺利连接到Oracle数据库...
- 获取查询结果的行数:先调用`last()`方法将游标移到最后一行,再调用`getRow()`方法获取当前行号。 7. **关闭连接** - 关闭连接时应先关闭`ResultSet`,再关闭`Statement`,最后关闭`Connection`。 - 这样做...
JDBC提供了高度的抽象层,使得开发者可以通过统一的API来访问不同的数据库。 - **连接数据库**:在Java中,连接数据库通常需要通过指定的URL、用户名和密码。例如,连接Oracle数据库时,可以使用以下代码: ```...
- **JDBC 1.0的局限性**:最初版本的JDBC规范中,ResultSet对象仅支持向前移动,这意味着开发者无法在一次查询后获取结果集的总大小,这对于分页来说是个重大障碍。 - **JDBC 2.0的改进**:随着JDBC 2.0的发布,...
- 使用`ResultSet`对象的`last()`方法移动结果集指针到最后一条记录,然后调用`getRow()`方法获取记录总数。 - 根据记录总数和每页显示的记录数计算出总页数。 6. **分页显示数据**: - 将结果集指针定位到当前页...
然而,标准的JDBC并未提供良好的分页机制,因此开发者们需要寻找或创造其他方式来实现这一功能。本文将介绍几种常用的JSP分页技术,并探讨它们各自的优缺点。 #### JDBC规范与分页 在JDBC 1.0时代,由于结果集(`...
为了解决上述问题,开发者通常会创建一个通用的分页类,该类能够根据不同的数据库系统动态生成相应的SQL语句,并处理分页逻辑。这样的类通常会包含以下功能: - 计算总记录数:通过执行一个`COUNT(*)`查询来获取。 ...
为了更好地处理分页问题,开发者们逐渐探索出了一些高效的方法,例如利用`ResultSet`的不同类型、通过编写特定的SQL语句等方式。下面我们将详细介绍几种常见的实现方法: ##### 1. 利用`ResultSet`的不同类型实现...
1. **加载驱动**:根据使用的数据库(如MySQL、Oracle等),我们需要导入对应的JDBC驱动,并通过`Class.forName()`方法加载驱动。例如,对于MySQL,代码可能是`Class.forName("com.mysql.jdbc.Driver")`。 2. **...
需要注意的是,这个示例使用了JDBC的ODBC驱动,对于实际生产环境,可能需要替换为更适合的数据库驱动,如MySQL、Oracle或PostgreSQL等。此外,为了提高性能和防止SQL注入攻击,建议使用PreparedStatement代替...
### Java学习笔记知识点详解 #### 一、Java基础知识概述 Java是一种广泛使用的面向对象的编程语言,具有简单性、面向对象、健壮性、安全性、平台...无论是初学者还是有一定经验的开发者,都能从中获得有价值的信息。
- **多线程**:线程的基本概念、Thread类与Runnable接口的使用,同步机制与死锁问题。 - **泛型**:理解泛型的作用及其实现方式。 2. **面向对象分析与设计(OOAD)** - **设计模式**:单例模式、工厂模式、策略...