我有这个非常大的桌子,每天有数百万条记录,每天结束时我都会提取前一天的所有记录.我这样做:
String SQL = "select col1, col2, coln from mytable where timecol = yesterday";
Statement.executeQuery(SQL);
Run Code Online (Sandbox Code Playgroud)
问题是这个程序需要2GB的内存,因为它会将所有结果都记在内存中然后处理它.
我尝试设置Statement.setFetchSize(10)但它从操作系统获取完全相同的内存它没有任何区别.我正在使用Microsoft SQL Server 2005 JDBC驱动程序.
有没有办法以小块的形式读取结果,比如Oracle数据库驱动程序执行查询时只显示几行,当你向下滚动时会显示更多结果?
如何将Resultset对象转换为JSP上的分页视图?
例如,这是我的查询和结果集:
pst = con.prepareStatement("select userName, job, place from contact");
rs = pst.executeQuery();
Run Code Online (Sandbox Code Playgroud) 我看到很多JDBC/MySQL的"最佳实践"指南告诉我指定setFetchSize().
但是,我不知道何时指定,以及要指定的内容(语句,结果集).
Statement.setFetchSize() or PreparedStatement.setFetchSize()
ResultSet.setFetchSize()
Run Code Online (Sandbox Code Playgroud)
的Javadoc
默认值由创建结果集的Statement对象设置.可以随时更改提取大小.
Oracle Doc
生成结果集后对语句对象的提取大小所做的更改将不会影响该结果集.
如果我错了,请纠正我.这是否意味着setFetchSize在执行查询之前只是Affective?(因此,ResultSet上的setFetchSize是无用的?但是恰好"可以随时更改获取大小"?)
我想在我的自定义 JDBC 驱动程序中实现此方法功能。我应该使用 JDBC 中的哪种方法来 setMaxResults?
如果我的查询结果是1000行,并且我设置了setFetchSize=100,那么结果会是什么?它将仅返回 100 行,或者在返回前 100 行后,它将从数据库获取下 100 行,直到完成 1000 行。