开发者

Groovy sql dataset causes java.lang.OutOfMemory

开发者 https://www.devze.com 2023-01-15 11:23 出处:网络
I have a table with252759 tuples. I would like to use DataSet object to make my life easier, however w开发者_如何学JAVAhen I try to create a DataSet for my table, after 3 seconds, I get java.lang.OutO

I have a table with 252759 tuples. I would like to use DataSet object to make my life easier, however w开发者_如何学JAVAhen I try to create a DataSet for my table, after 3 seconds, I get java.lang.OutOfMemory.

I have no experience with Datasets, are there any guidelines how to use DataSet object for big tables?


Do you really need to retrieve all the rows at once? If not, then you could just retrieve them in batches of (for example) 10000 using the approach shown below.

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 is a MySQL-specific feature, but most other RDBMS have an equivalent feature that limits the number of rows returned by a query.

Also, I haven't tested (or even compiled) the code above, so handle with care!


Why not start with giving the JVM more memory?

java -Xms<initial heap size> -Xmx<maximum heap size>

252759 tuples doesn't sound like anything a maching with 4GB RAM + some virtual memory couldn't handle in memory.

0

精彩评论

暂无评论...
验证码 换一张
取 消