锁定老帖子 主题: 关于jdbc的一种功能的实现
精华帖 (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 |
|
返回顶楼 | |
发表时间: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 楼主可以参考一下! |
|
返回顶楼 | |
发表时间:2012-02-28
滚动?你是想说ResultSet的类型吧?
直接搜ResultSet的类型就可以了。 有的可以滚动,有的不可以滚动的。 |
|
返回顶楼 | |
发表时间: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这个参数设置错误了,导致结果集驻留在内存中 |
|
返回顶楼 | |
发表时间:2012-02-28
如果一次性加载过多的数据到内存 肯定是要溢出的
不管你分页不分页 你要不溢出 就必须得保证每次加载的数据是内存可以容忍的范围之内 而你所说的 一次性查出来 然后分页显示 我觉得这个描述是有问题的 既然查出来了 必要就要在内存放 如果你再存在磁盘上 取的时候还要再读一次磁盘 还是要加载到内存中 |
|
返回顶楼 | |
发表时间:2012-02-28
ct198312_163.com 写道 如果一次性加载过多的数据到内存 肯定是要溢出的 不管你分页不分页 你要不溢出 就必须得保证每次加载的数据是内存可以容忍的范围之内 而你所说的 一次性查出来 然后分页显示 我觉得这个描述是有问题的 既然查出来了 必要就要在内存放 如果你再存在磁盘上 取的时候还要再读一次磁盘 还是要加载到内存中 是的,所以我是每次加载一部分保存到文件中后再加载 |
|
返回顶楼 | |
发表时间:2012-02-28
游标?
|
|
返回顶楼 | |
发表时间:2012-02-28
spyker 写道 游标? 应该类似吧 |
|
返回顶楼 | |
发表时间:2012-02-28
去看看hibernate 的实现吧。
|
|
返回顶楼 | |
发表时间:2012-02-28
xiaoZ5919 写道 jdbc有一个fetch_size 意思是每次从游标中取多少,oracle支持该参数,mysql不支持。这样每次加载指定的数目到内存中,而不是所有的 解决了内存消耗的问题
看了这么多回复,终于发现一个明白人 |
|
返回顶楼 | |