Groovy sql数据集导致java.lang.OutOfMemory

时间:2010-09-08 08:06:58

标签: database groovy out-of-memory

我有一个包含252759个元组的表。我想使用DataSet对象让我的生活更轻松,但是当我尝试为我的表创建一个DataSet时,3秒后,我得到了java.lang.OutOfMemory。

我没有使用数据集的经验,是否有任何指导如何将DataSet对象用于大表?

2 个答案:

答案 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内存加工+内存中无法处理的虚拟内存。