2015-07-10 12 views
10

Tôi đang cố gắng tìm ra cách làm việc với phát trực tuyến mượt mà. Tôi sử dụng slick 3.0.0 với trình điều khiển postgresCách phù hợp để làm việc với kết quả trực tuyến 3.0.0 của slick và Postgresql là gì?

Tình huống sau: máy chủ phải cung cấp cho chuỗi khách hàng dữ liệu được chia thành các phần bị giới hạn theo kích thước (tính bằng byte). Vì vậy, tôi đã viết sau đây truy vấn trơn:

val sequences = TableQuery[Sequences] 
def find(userId: Long, timestamp: Long) = sequences.filter(s ⇒ s.userId === userId && s.timestamp > timestamp).sortBy(_.timestamp.asc).result 
val seq = db.stream(find(0L, 0L)) 

tôi kết hợp với seq AKKA-suối Source, đã viết tùy chỉnh PushPullStage, mà giới hạn kích thước của dữ liệu (tính theo byte) và kết thúc ở thượng nguồn khi nó đạt đến giới hạn kích thước. Nó hoạt động tốt. Vấn đề là - khi tôi nhìn vào nhật ký postgres, tôi thấy truy vấn như vậy select * from sequences where user_id = 0 and timestamp > 0 order by timestamp;

Vì vậy, thoạt nhìn có vẻ như truy vấn cơ sở dữ liệu (và không cần thiết) đang diễn ra, chỉ sử dụng vài byte trong mỗi truy vấn . Cách thích hợp để thực hiện phát trực tuyến với Slick để giảm thiểu truy vấn cơ sở dữ liệu và tận dụng tốt nhất dữ liệu được truyền trong mỗi truy vấn là gì?

Trả lời

11

Các "đúng cách" để làm trực tuyến với Slick và Postgres bao gồm ba điều:

  1. Phải sử dụng db.stream()

  2. Phải vô hiệu hóa autoCommit trong JDBC-driver. Một cách là làm cho truy vấn chạy trong một giao dịch bằng cách kết hợp .transactionally.

  3. Phải đặt fetchSize thành thứ khác 0 hoặc postgres khác sẽ đẩy toàn bộ kết quảĐặt đến khách hàng trong một lần.

Ex:

DB.stream(
    find(0L, 0L) 
    .transactionally 
    .withStatementParameters(fetchSize = 1000) 
).foreach(println) 

Liên kết hữu ích:

https://github.com/slick/slick/issues/1038

https://github.com/slick/slick/issues/809

+0

Cảm ơn cho câu trả lời, rất hữu ích. Tôi đã nhầm lẫn về "phụ lục": không phải là bối cảnh thực hiện xử lý db được duy trì riêng biệt trong AsyncExecutor? – JimN

+0

Tốt để nghe! Về phụ lục: Có, bạn nói đúng. Nó phải là mặc định. Tôi loại bỏ phụ lục kể từ khi nó gây nhầm lẫn nhiều hơn nó giúp và trong hindsight tôi đoán nó thực sự đã làm với cơ khí áp lực trở lại. Người tiêu dùng của tôi nhanh hơn rất nhiều so với mạng, vì vậy hãy ngừng xử lý tương lai nhanh như kết quả đến là một giải pháp phù hợp hơn. – Rikard

+0

Có tương đương với trường hợp của MySQL không? – matanster

Các vấn đề liên quan