我有一个包含252759个元组的表。我想使用DataSet对象让我的生活更轻松,但是当我尝试为我的表创建一个DataSet时,3秒后,我得到了java.lang.OutOfMemory。
我没有使用数据集的经验,是否有任何指导如何将DataSet对象用于大表?
答案 0 :(得分:7)
您真的需要一次检索所有行吗?如果没有,那么您可以使用下面显示的方法批量检索它们(例如)10000。
def db = [url:'jdbc:hsqldb:mem:testDB', user:'sa', password:'', driver:'org.hsqldb.jdbcDriver']
def sql = Sql.newInstance(db.url, db.user, db.password, db.driver)
String query = "SELECT * FROM my_table WHERE id > ? ORDER BY id limit 10000"
Integer maxId = 0
// Closure that executes the query and returns true if some rows were processed
Closure executeQuery = {
def oldMaxId = maxId
sql.eachRow(query, [maxId]) { row ->
// Code to process each row goes here.....
maxId = row.id
}
return maxId != oldMaxId
}
while (executeQuery());
AFAIK limit
是特定于MySQL的功能,但大多数其他RDBMS都具有相同的功能,可以限制查询返回的行数。
另外,我没有测试(甚至编译)上面的代码,所以要小心处理!
答案 1 :(得分:1)
为什么不从为JVM提供更多内存开始呢?
java -Xms<initial heap size> -Xmx<maximum heap size>
252759元组听起来不像4GB内存加工+内存中无法处理的虚拟内存。