2010-06-22 62 views
8

Tôi đang viết một ứng dụng phải ghi nhật ký thông tin khá thường xuyên, giả sử, hai lần trong một giây. Tôi muốn lưu các thông tin vào một cơ sở dữ liệu sqlite, tuy nhiên tôi không nhớ để thực hiện các thay đổi cho đĩa một lần sau mỗi mười phút.Đồng bộ hóa cơ sở dữ liệu sqlite từ bộ nhớ đến tệp

Thực hiện truy vấn của tôi khi sử dụng cơ sở dữ liệu tệp mất nhiều thời gian và làm cho máy tính bị trễ.

Một giải pháp tùy chọn là sử dụng một cơ sở dữ liệu trong bộ nhớ (nó sẽ phù hợp, không phải lo lắng), và đồng bộ hóa nó vào đĩa trong từng thời kỳ,

Có thể? Có cách nào tốt hơn để đạt được điều đó (bạn có thể yêu cầu sqlite cam kết chỉ đĩa sau khi truy vấn X?).

Tôi có thể giải quyết vấn đề này với Qt 's SQL trình bao bọc không?

Trả lời

11

Giả sử bạn có cơ sở dữ liệu trên đĩa được gọi là 'disk_logs' với bảng có tên là 'sự kiện'. Bạn có thể đính kèm một cơ sở dữ liệu trong bộ nhớ cơ sở dữ liệu hiện tại của bạn:

ATTACH DATABASE ':memory:' AS mem_logs; 

Tạo một bảng trong cơ sở dữ liệu (đó sẽ là hoàn toàn trong bộ nhớ) để nhận các sự kiện đăng nhập đến:

CREATE TABLE mem_logs.events(a, b, c); 

Sau đó, chuyển dữ liệu từ bảng trong bộ nhớ sang bảng trên đĩa trong thời gian ngừng hoạt động của ứng dụng:

INSERT INTO disk_logs.events SELECT * FROM mem_logs.events; 

Và sau đó xóa nội dung của bảng trong bộ nhớ hiện có. Nói lại. Tuy nhiên, điều này khá phức tạp ... Nếu hồ sơ của bạn trải rộng trên nhiều bảng và được liên kết với nhau bằng khóa ngoài, có thể là một nỗi đau để giữ chúng đồng bộ khi bạn sao chép từ bảng trong bộ nhớ sang bảng trên đĩa .

Trước khi thử một thứ gì đó (không thoải mái được thiết kế quá mức) như thế này, tôi cũng khuyên bạn nên trying to make SQLite go as fast as possible. SQLite sẽ có thể dễ dàng handly> 50K bản ghi chèn mỗi giây. Một vài mục nhật ký hai lần một giây sẽ không gây ra sự chậm lại đáng kể.

2

Tìm kiếm ngắn gọn về tài liệu SQLite không có gì hữu ích (không có khả năng và tôi không mong đợi nó).

Tại sao không sử dụng chuỗi nền khởi động sau mỗi 10 phút, sao chép tất cả các hàng nhật ký từ cơ sở dữ liệu trong bộ nhớ sang cơ sở dữ liệu ngoài (và xóa chúng khỏi cơ sở dữ liệu trong bộ nhớ). Khi chương trình của bạn đã sẵn sàng kết thúc, hãy đánh thức chủ đề nền một lần cuối cùng để lưu các bản ghi cuối cùng, sau đó đóng tất cả các kết nối.

+0

Vì sau đó tôi cần phải tạo nhật ký, hãy nhớ phần nào của nhật ký tôi đã lưu, duy trì chủ đề nền và chủ yếu nói tự thực hiện đồng bộ hóa. Điều đó là có thể, nhưng tôi muốn tránh điều đó. –

+0

Hãy cho tôi biết cách bạn cuối cùng giải quyết vấn đề này. –

5

Nếu bạn đang thực hiện từng lần chèn trong giao dịch riêng của nó - đó có thể là một đóng góp đáng kể cho những người chậm bạn nhìn thấy.Có lẽ bạn có thể:

  • Đếm số lượng hồ sơ đưa cho đến nay
  • Bắt đầu một giao dịch
  • Chèn hồ sơ của bạn
  • Tăng đếm
  • Commit/giao dịch kết thúc khi N hồ sơ đã được đưa vào
  • Lặp lại

Nhược điểm là nếu hệ thống cr tro trong thời gian đó bạn có nguy cơ mất các bản ghi chưa cam kết (nhưng nếu bạn sẵn sàng sử dụng một cơ sở dữ liệu trong bộ nhớ, hơn là nó có vẻ như bạn đang OK với rủi ro đó).

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