论坛首页 Java企业应用论坛

关于jdbc的一种功能的实现

浏览 20092 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-28  
java_user 写道
坏孩子 写道
不就是读取ResultSet么,有那么难吗?读一条处理一条,缺点就是长时间占用连接

这个试了不行的,读的多了还是会内存溢出

兄弟,没仔细看我前面回帖么,看看这个文档,关于ResultSet部分。
http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-implementation-notes.html
0 请登录后投票
   发表时间:2012-02-28   最后修改:2012-02-28
Hibernate 里倒是有一个方法:
13.2. Batch updates
For retrieving and updating data, the same ideas apply. In addition, you need to use scroll() to
take advantage of server-side cursors for queries that return many rows of data.
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
   
ScrollableResults  customers = session.getNamedQuery("GetCustomers")
    .setCacheMode(CacheMode.IGNORE)
    .scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
        //flush a batch of updates and release memory:
        session.flush();
        session.clear();
    }
}
   
tx.commit();
session.close();

还得看一下你用的db 是否支持这个功能
Property name Purpose
hibernate.jdbc.use_scrollable_resultset Enables use of JDBC2 scrollable resultsets
by Hibernate. This property is only
necessary when using user-supplied JDBC
connections. Hibernate uses connection
metadata otherwise.
e.g. true | false

楼主可以参考一下!
0 请登录后投票
   发表时间:2012-02-28  
滚动?你是想说ResultSet的类型吧?
直接搜ResultSet的类型就可以了。
有的可以滚动,有的不可以滚动的。
0 请登录后投票
   发表时间:2012-02-28  
whb1984 写道
java_user 写道
坏孩子 写道
不就是读取ResultSet么,有那么难吗?读一条处理一条,缺点就是长时间占用连接

这个试了不行的,读的多了还是会内存溢出

兄弟,没仔细看我前面回帖么,看看这个文档,关于ResultSet部分。
http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-implementation-notes.html

哦,多谢啊
我之前就是用ResultSet来操作的
ResultSet.TYPE_FORWARD_ONLY这个参数设置错误了,导致结果集驻留在内存中
0 请登录后投票
   发表时间:2012-02-28  
如果一次性加载过多的数据到内存 肯定是要溢出的
不管你分页不分页
你要不溢出 就必须得保证每次加载的数据是内存可以容忍的范围之内
而你所说的 一次性查出来 然后分页显示  我觉得这个描述是有问题的
既然查出来了 必要就要在内存放 如果你再存在磁盘上 取的时候还要再读一次磁盘
还是要加载到内存中
0 请登录后投票
   发表时间:2012-02-28  
ct198312_163.com 写道
如果一次性加载过多的数据到内存 肯定是要溢出的
不管你分页不分页
你要不溢出 就必须得保证每次加载的数据是内存可以容忍的范围之内
而你所说的 一次性查出来 然后分页显示  我觉得这个描述是有问题的
既然查出来了 必要就要在内存放 如果你再存在磁盘上 取的时候还要再读一次磁盘
还是要加载到内存中

是的,所以我是每次加载一部分保存到文件中后再加载
0 请登录后投票
   发表时间:2012-02-28  
游标?                       
0 请登录后投票
   发表时间:2012-02-28  
spyker 写道
游标?                       

应该类似吧
0 请登录后投票
   发表时间:2012-02-28  
去看看hibernate 的实现吧。
0 请登录后投票
   发表时间:2012-02-28  
xiaoZ5919 写道
jdbc有一个fetch_size 意思是每次从游标中取多少,oracle支持该参数,mysql不支持。这样每次加载指定的数目到内存中,而不是所有的 解决了内存消耗的问题


看了这么多回复,终于发现一个明白人
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics