Czy na pewno potrzebujesz pobrać wszystkie wiersze naraz? Jeśli nie, możesz po prostu pobrać je partiami (na przykład) 10000 za pomocą podejścia pokazanego poniżej.
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
jest MySQL określonej funkcji, ale większość innych RDBMS mają równoważną funkcję, która ogranicza liczbę wierszy zwróconych przez zapytanie.
Również nie testowałem (lub nawet skompilowany) kod powyżej, więc poradzić się ostrożnie!
Czy można leniwie wyszukiwać groovy? Ponieważ zwiększenie pamięci nie skaluje się zbyt dobrze. – Skarab
Jeśli chcesz to zrobić, musisz użyć normalnego JDBC. Sposób, w jaki robi to groovy, tj. Skopiowanie całego zestawu wyników do listy tablic, nie jest odpowiedni do leniwego pobierania, ponieważ Groovy nigdy nie wie, kiedy jest zapisywany, aby zamknąć podstawowy zestaw wyników, ponieważ nie ma wyraźnej metody close() na liście ; więc musiałby pozostawić to otwarte do czasu wyrzucenia śmieci (co może nie nastąpić w najbliższym czasie), zasysając zasoby na serwer bazy danych. –
Dziękuję, widzę, że nie rozumiem interfejsu DataSet API. W moim przypadku zapisy w tabeli zawierają dane tekstowe, a 4 GB to za mało, więc wrócę do JDBC. Jeśli mam czas, planuję przyjrzeć się również GORM (Groovy ORM), który jest częścią Grails. – Skarab