`
firebirdyuan
  • 浏览: 13402 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

JdbcTemplate中的queryForList()内存溢出

阅读更多
我在对JdbcTemplate中的queryForList(String sql)作单元测试时发现有内存溢出的现象,这个查询的方法跟表中的字段多少有关:
我的做法如下:
1、表A INSERT INTO A('1','中华') 一共50万条
2、表B INSERT INTO A('1','中华人民共和国') 一共50万条
3、表C INSERT INTO A('1','中华人民共和国中华人民共和国') 一共50万条

对三张表作全查询时,发现内存溢出现象,都是用JdbcTemplate.queryForList(sql)出现的,并且其获取的最大记录数都不一样,如果这样的话,我们应该怎么解决这种问题呢?

首先:1、跟表的设计有关吗?
      2、跟表中的字段长度有关吗?
      3、跟选择的列数有关吗?


[oracle]
select * from ( select a.*, rownum rn from (select * from tableName) a )   where rn between 10 and 40
select * from (select rownum as rn1,code,name from cpcode where rownum<=100) where rn1 >=91

mssql
select * from (select top 10 * from (select top 100 * from cpcode order by code) a order by code desc) as b  order by code

[mysql]select * from cpcode limit 90,10  
分享到:
评论
15 楼 梅花簪 2012-07-10  
”对三张表作全查询时“是什么意思??你自己提出额三个问题有什么答案吗?你的解决办法是分页?
14 楼 火柴天堂 2008-04-14  
一群SB,NND
13 楼 firebirdyuan 2007-07-03  
今天突然发现,Oracle原来可以这样实现分页功能:

select * from t_table where rowid not in(select rowid from t_table where rownum<=200) and rownum<=200

上述语句实现了从第201条记录开始处取200条记录
12 楼 firebirdyuan 2007-07-03  
针对Oracle数据库

1. 最好还是利用分析函数
row_number() over ( partition by col1 order by col2 )

比如想取出100-150条记录,按照tname排序

select tname,tabtype from (
   select tname,tabtype,row_number() over ( order by tname ) rn from tab
)
where rn between 100 and 150;

2. 直接使用rownum 虚列
select tname,tabtype from (
   select tname,tabtype,rownum rn from tab where rownum <= 150
)
where rn >= 100;
使用序列不能基于整个记录集合进行排序,如果指定了order by子句,排序的的是选出来的记录集的排序.
------------------------------------------------------
经过我的测试,在100万条数据的表中,检索数据的时候,方法2的速度要比方法1要快的
11 楼 firebirdyuan 2007-07-03  
特点:一次查询,数据库只返回一页的数据。而不是取出所有的数据。
说明:

pagesize: 每页显示记录数
cureentpage:当前页数

select * from (  select TOP pagesize * FROM ( SELECT TOP pagesize*cureentpage  * from user_table  ORDER BY id ASC ) as aSysTable  ORDER BY id DESC ) as bSysTable  ORDER BY id ASC


例子说明:

假如数据库表如下:

user_table:

id:主键,自增
username:字符
password:字符

假设有80条记录,每页显示10条记录,id 从1到80


现在按照id升序排列取出第三页的数据应该为:所取得记录的id 应该为 21到30。

这时该语句应该为:

select * from (  select TOP 10 * FROM ( SELECT TOP 30  * from user_table  ORDER BY id ASC ) as aSysTable  ORDER BY id DESC ) as bSysTable  ORDER BY id ASC

原理如下:

先按照id从小到大升序取出30条记录(3*10),也就是:id 在 1-30 之间的记录 (SELECT TOP 30  * from user_table  ORDER BY id ASC)

然后按照ID降序排列这30条记录,得到记录为id 在:从30到 1 

然后在这些30条记录中取出前10条记录:取得的记录为:id 在30-21之间。这就是我们需要的数据,但这时是按照降序排列的,不符合要求。

最后在重新排序得到最终我们需要的数据。id在21-30之间。

10 楼 ddandyy 2007-05-16  
http://blog.csdn.net/5iasp/archive/2006/04/14/663511.aspx
9 楼 ddandyy 2007-05-16  
ms sql?

不好意思看错了   还以为你用的mysql

光用sql也是可以的
就是要麻烦一些
你去网上找吧   很多
8 楼 firebirdyuan 2007-05-16  
谢谢ddandyy!
你写的sql语句是满足mysql的数据库的语法,但对MS SQL和其它数据库就不能使用,我已经在MS SQL上试过了不行。
看来还是要自己写方法去包装,才能正常使用啊。
7 楼 ddandyy 2007-05-16  
mysql在sql语句中取固定长度  网上一搜就能搜到了
比如我上面给出的那句 start 是开始的no 从头开始就是0 pageNum是取的数据量

你说从21-40 就是 select * from table limit 20,20

我这没mysql数据库  不能试  你可以去网上查

总之是肯定能做到就是了
6 楼 firebirdyuan 2007-05-16  
请问:ddandyy
你这个的SQL语句能执行吗?
select * from table limit start,pageNum

能否写一个能执行的模板SQL语句。谢谢
5 楼 firebirdyuan 2007-05-16  
请问:ddandyy
你的意思是使用语句实现要提取的记录,如提取21-40条记录,我该怎么写sql语句呢?
SELECT * FROM 表名
在SQL语句中只有top和percent
4 楼 ddandyy 2007-05-16  
select   *   from   table   limit   start,pageNum  

用sql语句实现不就行了么
3 楼 firebirdyuan 2007-05-16  
JdbcTemplate.queryForList(String sql)方法就是将满足条件的记录封装在数据容器中,而每一条记录又是一Map的形式置放于数据容器中,要想获取分页,就只能重写spring包中的方法了,况且还是否清楚在Spring包中的rs是否支持游标的移动呢?
再获取大量数据时,请问还有什么好的解决办法吗(除了自己新写类来处理这个问题)


用的是spring2.0版本
数据库:MS SQL
驱动:JSQLConnect.jar
2 楼 宏基小键盘 2007-05-16  
什么库?版本?驱动版本?
1 楼 ddandyy 2007-05-15  
分页取       

相关推荐

    Java 使用JdbcTemplate 中的queryForList发生错误解决办法

    "Java 使用JdbcTemplate 中的queryForList解决错误方法详解" Java 是一门广泛使用的编程语言,在 Java 中有多种方式来执行数据库查询操作,其中 JdbcTemplate 是 Spring 框架提供的一种简洁易用的数据库操作工具。...

    如何避免JDBC引起的内存溢出情况

    例如,当执行SELECT * FROM table_name这样的查询时,如果表中的记录非常多,那么所有的结果集都会被加载到内存中,从而可能导致内存溢出。 #### 二、针对不同数据库的解决方案 **1. MySQL** 对于MySQL,可以通过...

    使用jdbcTemplate查询返回自定义对象集合代码示例

    在上面的代码中,我们首先使用JdbcTemplate的queryForList()方法查询数据库,并将查询结果存储在lists变量中。然后,我们使用UserInfo的toObject()方法将lists转换为UserInfo对象集合。这个方法将Map对象转换为...

    spring自带的jdbcTemplate查询、插入预编译使用

    在使用`jdbcTemplate`进行预编译查询时,我们通常会使用`query()`或`queryForList()`方法。例如: ```java String sql = "SELECT * FROM table WHERE id = ?"; Object[] params = {1}; List&lt;MyObject&gt; result = ...

    spring mvc注解jdbctemplate

    在Spring MVC框架中,JdbcTemplate是一个非常重要的组件,它提供了对数据库操作的简化API,使得开发者可以更加方便地执行SQL语句,而无需过多关注事务管理、异常处理等底层细节。本文将深入探讨如何在Spring MVC中...

    Spring的JDBCTemplate

    为了能够在项目中使用`JDBCTemplate`,首先需要在Spring的配置文件`ApplicationContext`中定义一个`jdbcTemplate` bean,例如: ```xml &lt;bean id="jdbcTemplate" class="org.springframework.jdbc.core....

    spring的jdbcTemplate小案例

    在本文中,我们将深入探讨Spring框架中的一个核心组件——JdbcTemplate。JdbcTemplate是Spring提供的一种数据库操作工具,它简化了数据库访问,使开发者能够编写出更健壮、更易于维护的代码,避免了手动处理JDBC连接...

    JdbcTemplate基本使用

    JdbcTemplate是Spring框架中用于简化JDBC操作的工具类,它提供了一种更安全、更易用的方式来执行数据库操作,避免了手动管理数据库资源和处理潜在的资源泄露问题。通过JdbcTemplate,开发者可以专注于SQL语句的编写...

    JdbcTemplate实例

    `JdbcTemplate`是Spring框架中用于简化数据库操作的模板类,它提供了丰富的API来执行SQL语句,包括插入、更新、删除以及查询等操作。在Java应用中,使用`JdbcTemplate`可以避免直接操作JDBC,减少代码量,提高代码的...

    jdbcTemplate简单使用

    `JdbcTemplate`是Spring框架中的一个核心组件,主要用于简化数据库操作。它提供了一种模板化的JDBC编程方式,使得开发者可以避免直接与JDBC API打交道,从而减少代码量,提高可读性和可维护性。本篇文章将深入探讨`...

    spring jdbcTemplate 注入到servlet

    在Java Web开发中,Spring框架提供了丰富的工具来简化数据库操作,其中之一就是`Spring JdbcTemplate`。`JdbcTemplate`是Spring对JDBC(Java Database Connectivity)的一层轻量级封装,它使得开发者能够更加方便地...

    jdbcTemplate分页彻底解决,使用游标滚动

    在处理大量数据时,传统的分页方式可能会导致内存溢出,这时可以使用游标滚动来实现高效的分页。本篇文章将深入探讨如何利用JdbcTemplate结合游标滚动来解决分页问题。 首先,我们要理解什么是游标滚动。在数据库中...

    JdbcTemplate查询

    `JdbcTemplate`是Spring框架中提供的一个用于简化JDBC编程的工具类,它提供了丰富的API来帮助开发者更便捷地进行数据库操作。相较于传统的JDBC编程方式,使用`JdbcTemplate`可以极大地减少样板代码的编写,并能更好...

    Spring JdbcTemplate 常用方法整理

    Spring的JdbcTemplate是Spring框架中用于简化数据库操作的工具类,它是基于JDBC但又抽象出了一层,避免了直接与数据库驱动API交互,从而提高了代码的可读性和可维护性。本文将深入探讨Spring JdbcTemplate的常用方法...

    Spring JdbcTemplate查询实例

    Spring JdbcTemplate是Spring框架中用于简化数据库操作的一个重要组件,它是Spring对JDBC的轻量级封装,旨在提供一种结构良好、易于使用的SQL执行机制,同时保持了JDBC的灵活性。在本实例中,我们将深入探讨Spring ...

    jdbcTemplate.jar

    而在Spring框架中,Spring JDBC是处理数据库操作的重要模块,它提供了一种更加简洁、优雅的方式来操作数据库,而其中的核心组件就是`jdbcTemplate.jar`。本文将深入探讨这个关键的库文件,以及它如何简化了我们与...

    spring无web.xml的jdbctemplate配置

    List, Object&gt;&gt; result = jdbcTemplate.queryForList(sql); // 处理查询结果 } ``` 4. **Spring Boot的简化配置** 如果使用Spring Boot,配置变得更简单,因为Spring Boot默认集成了DataSource和JdbcTemplate...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    ### Spring中的JdbcTemplate #### JdbcTemplate概述 JdbcTemplate是Spring框架提供的一种用于简化JDBC编程的对象。通过封装原生的JDBC API,JdbcTemplate不仅提高了代码的可读性和可维护性,还帮助开发者避免了...

Global site tag (gtag.js) - Google Analytics