¿Realmente necesita recuperar todas las filas a la vez? De lo contrario, podría recuperarlos en lotes de (por ejemplo) 10000 utilizando el enfoque que se muestra a continuación.
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
es una característica específica de MySQL, pero la mayoría de otros RDBMS tener una característica equivalente que limita el número de filas devueltas por una consulta.
Además, no he probado (ni compilado) el código anterior, ¡así que trátelo con cuidado!
¿Es posible hacer datos de recuperación groovy perezosamente? Porque el aumento de la memoria no se escala muy bien. – Skarab
Si desea hacer eso, debe usar JDBC normal. La forma maravillosa en que lo hace, es decir, copiar todo el conjunto de resultados en una lista de arrays, no es adecuado para la recuperación diferida, porque Groovy nunca pudo saber cuándo fue necesario cerrar el conjunto de resultados subyacente, ya que no hay un método explícito close() en la lista ; por lo que debería dejarlo abierto hasta la recolección de basura (lo que podría no suceder pronto), absorbiendo recursos en el servidor de la base de datos. –
Gracias, veo que no entendí la API de DataSet. En mi caso, los registros en la tabla contienen datos textuales y 4GB no es suficiente, por lo tanto, volveré a JDBC. Si tengo tiempo, planeo echar un vistazo también a GORM (Groovy ORM) que es parte de Grails. – Skarab