Tüm satırları bir kerede almanız gerekiyor mu? Aksi takdirde, aşağıda gösterilen yaklaşımı kullanarak bunları (örneğin) 10000'lük gruplar halinde geri alabilirsiniz.
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 özgü bir özellik, ancak çoğu diğer RDBMS bir sorgu ile satır sayısını sınırlar eşdeğer bir özellik. Ayrıca, yukarıdaki kodu test etmedim (hatta derlemedim), bu yüzden dikkatle ele almayın!!
Mükemmel şekilde verinin alınmasını kolaylaştırmak mümkün mü? Çünkü bellek artışı çok iyi ölçeklenmiyor. – Skarab
Bunu yapmak isterseniz, normal JDBC'yi kullanmanız gerekir. Mükemmel bir şekilde, yani tüm sonucu bir arraylist olarak kopyalamak, tembel geri alma için uygun değildir, çünkü Groovy, temel sonuç kümesini kapatmak için ne zaman kaydedileceğini asla bilmeyebilir, çünkü listede açık close() yöntemi yoktur ; Bu nedenle, çöp toplama (bu kadar yakında gerçekleşmeyebilir) kadar açık bırakmak zorunda kalacak, böylece veritabanı sunucusunda kaynakları emecek. –
Teşekkür ederim, DataSet API'sini anlamadım. Benim durumumda, tablodaki kayıtlar metinsel veriler içeriyor ve 4GB yeterli değil, bu yüzden JDBC'ye geri döneceğim. Zamanım varsa, Grails'in bir parçası olan GORM'e (Groovy ORM) de göz atmayı planlıyorum. – Skarab