Bạn có thực sự cần truy xuất tất cả các hàng cùng một lúc không? Nếu không, sau đó bạn chỉ có thể lấy chúng theo lô (ví dụ) 10000 bằng cách sử dụng cách tiếp cận hiển thị dưới đây.
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
là một tính năng đặc trưng cho MySQL, nhưng hầu hết các RDBMS khác có tính năng tương đương giới hạn số hàng được truy vấn trả về.
Ngoài ra, tôi chưa thử nghiệm (hoặc thậm chí biên dịch) mã ở trên, vì vậy hãy xử lý cẩn thận!
Nguồn
2010-09-08 08:50:35
Có thể làm cho dữ liệu thu thập dữ liệu trở nên lười biếng không? Bởi vì bộ nhớ tăng không quy mô rất tốt. – Skarab
Nếu bạn muốn làm điều đó, bạn phải sử dụng JDBC bình thường. Cách thức Groovy thực hiện nó, tức là sao chép toàn bộ tập kết quả vào một mảng, không phù hợp để lấy ra, vì Groovy không bao giờ biết khi nào nó được lưu để đóng kết quả cơ bản, vì không có phương thức close() rõ ràng nào trong danh sách ; do đó, nó sẽ phải để nó mở cho đến khi thu gom rác (có thể không xảy ra bất cứ lúc nào sớm), do đó hút tài nguyên trên máy chủ cơ sở dữ liệu. –
Cảm ơn bạn, tôi thấy rằng tôi không hiểu DataSet API. Trong trường hợp của tôi, các bản ghi trong bảng chứa dữ liệu văn bản và 4GB là không đủ, vì vậy tôi sẽ chuyển về JDBC. Nếu tôi có thời gian, tôi cũng dự định xem GORM (Groovy ORM) là một phần của Grails. – Skarab