Khi tôi truy vấn một cơ sở dữ liệu và nhận được một trở về (chỉ-chỉ đọc) ResultSet, ResultSet hoạt động như một danh sách các hàng cơ sở dữ liệu.Xử lý một tập kết quả SQL như một dòng Scala
Tôi đang cố gắng tìm một số cách để xử lý ResultSet này như Scala Stream
. Điều này sẽ cho phép các hoạt động như filter
, map
, v.v. trong khi không tiêu tốn một lượng lớn RAM.
tôi thực hiện một phương pháp đuôi-đệ quy để trích xuất các mặt hàng cá nhân, nhưng điều này đòi hỏi tất cả các mục có trong bộ nhớ cùng một lúc, một vấn đề nếu ResultSet là rất lớn:
// Iterate through the result set and gather all of the String values into a list
// then return that list
@tailrec
def loop(resultSet: ResultSet,
accumulator: List[String] = List()): List[String] = {
if (!resultSet.next) accumulator.reverse
else {
val value = resultSet.getString(1)
loop(resultSet, value +: accumulator)
}
}
Bạn có thể sử dụng Iterable thay vì Luồng để làm những gì bạn muốn không? –
Ngoài ra, luồng sẽ giữ lại các giá trị trong bộ nhớ, vì vậy bạn sẽ không thực sự lưu bộ nhớ vào thời điểm bạn đến cuối danh sách. –
Tôi nghĩ rằng không có một cờ/tùy chọn jdbc làm cho chính jdbc truyền các kết quả, bạn vẫn có một bản sao đầy đủ của dữ liệu trong bộ nhớ, được xây dựng bởi api jdbc của bạn. – matanster