2010-07-09 48 views
5

Folks Tôi đang triển khai hàng đợi dựa trên tệp (see my earlier question) bằng cách sử dụng sqlite. Tôi có các chủ đề sau đang chạy ở chế độ nền:kết nối cơ sở dữ liệu sqlite/câu hỏi khóa

  1. thread-1 để xóa cấu trúc bộ nhớ thành bảng "xếp hàng" (chèn vào bảng "xếp hàng").
  2. chuỗi-1 để đọc và "xử lý" bảng "xếp hàng" chạy sau 5 đến 10 giây
  3. thread-3 - chạy rất thường xuyên và xóa dữ liệu cũ không còn cần thiết từ bảng "xếp hàng" nữa chạy chân không để kích thước của tệp cơ sở dữ liệu vẫn còn nhỏ.

Hiện tại, hành vi mà tôi muốn là cho từng chuỗi để nhận bất kỳ khóa nào cần (chờ hết giờ nếu có thể) và sau đó hoàn tất giao dịch. Nó là ok nếu chủ đề không chạy đồng thời - điều quan trọng là giao dịch một khi bắt đầu không thất bại do "khóa" lỗi như "cơ sở dữ liệu bị khóa".

Tôi đã xem số transaction documentation nhưng dường như không có cơ sở "hết thời gian chờ" (Tôi đang sử dụng JDBC). Thời gian chờ có thể được đặt thành số lượng lớn trong kết nối không?

Một giải pháp (chưa được thử) Tôi có thể nghĩ là có một hồ bơi kết nối với tối đa 1 kết nối. Vì vậy, chỉ có một sợi có thể kết nối tại một thời điểm và vì vậy chúng ta không nên thấy bất kỳ lỗi khóa nào. Có cách nào tốt hơn không?

Thanx!

Trả lời

2

Nếu đó là tôi, tôi sẽ sử dụng một xử lý kết nối cơ sở dữ liệu duy nhất. Nếu một thread cần nó, nó có thể phân bổ nó trong một phần quan trọng (hoặc mutex, hoặc tương tự) - điều này về cơ bản là một hồ bơi kết nối của người nghèo chỉ với một kết nối trong pool :) Nó có thể làm kinh doanh với databse. Khi hoàn thành, nó thoát khỏi phần quan trọng (hoặc giải phóng mutex hoặc?). Bạn sẽ không gặp phải lỗi khóa nếu bạn cẩn thận sử dụng kết nối db đơn.

-Don

+0

Thanx Đồn, đó là những gì tôi có thể kết thúc làm mặc dù cài đặt nó thông qua một hồ bơi db sẽ được nhiều hơn "tiêu chuẩn" cách để làm việc đó (và ít gây nhầm lẫn vì bạn đang điều trị các sqlite như cơ sở dữ liệu khác trong mã. – serverman

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