Tôi đã dành thời gian đọc các phương pháp hay nhất khác nhau cho cơ sở dữ liệu và cho SQLite cụ thể. Trong khi đọc tôi thấy tôi đã làm nhiều điều tôi không nên làm và khi cố gắng sửa chữa những vấn đề này tôi trở nên bối rối khi suy nghĩ về một số chi tiết tốt hơn về cách sử dụng SQLite với việc thực hiện ADO của nó.SQLite/C# Kết nối Pooling và chuẩn bị báo cáo Confusion
Sự nhầm lẫn của tôi bắt nguồn từ các báo cáo chuẩn bị và kết nối tổng hợp.
Khi đọc http://msdn.microsoft.com/en-us/library/ms971481.aspx Tôi thấy rằng các kết nối chỉ nên được mở cho một giao dịch. Khi giao dịch hoàn tất thì kết nối sẽ được đóng lại. Tôi không hiểu rõ lý do tại sao đây là trường hợp, nhưng tôi đã làm việc với giả định rằng tác giả biết rõ hơn sau đó I. Tôi hiểu rằng khi kết nối bị đóng, điều đó không có nghĩa là đã bị đóng. Nó chỉ đơn giản có nghĩa là nó đã được đưa trở lại vào hồ bơi.
Bây giờ, để cải thiện truy vấn và chèn của tôi, tôi đã đọc về cách sử dụng câu lệnh đã chuẩn bị. In SQLite, do prepared statements really improve performance? và http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html cả hai dường như chỉ ra rằng khi thực hiện một truy vấn sẽ được thực hiện nhiều lần chuẩn bị báo cáo là con đường để đi. Tôi cũng đã đọc rằng một câu lệnh chuẩn bị cụ thể cho một kết nối và rằng khi kết nối được đóng, câu lệnh đã chuẩn bị bị mất.
Sự nhầm lẫn của tôi là điều này. Nếu tôi mở và đóng kết nối của tôi (có thể hoặc không có nghĩa là kết nối đang bị đóng do hồ bơi luồng) thì tôi sử dụng bao nhiêu từ một tuyên bố đã chuẩn bị? Tôi có thể hiểu rằng nếu tôi có 1000 đối tượng tôi cần lưu trong một giao dịch duy nhất thì câu lệnh chuẩn bị có thể giúp ích rất nhiều. Tuy nhiên tôi không tin rằng tôi sẽ thấy một lợi ích từ việc tiết kiệm một đối tượng duy nhất trong một giao dịch bởi vì một khi tôi đóng kết nối, câu lệnh đã được tạo ra từ đối tượng đầu tiên hiện đã bị mất. Đây có phải là một tuyên bố đúng không?
Sự nhầm lẫn của tôi được tiếp tục bởi thực tế là tôi tin rằng một câu lệnh chuẩn bị được liên kết với phạm vi đối tượng SQLiteCommand của tôi.
Nếu tôi tạo một SQLiteCommand đại diện cho một truy vấn mà tôi sẽ thực hiện thường xuyên, tôi có cần phải giữ cho SQLiteCommand đó trong bộ nhớ cho câu lệnh chuẩn bị để hoạt động không?
Nếu tôi tạo một SQLiteCommand mới với cùng một câu lệnh SQLite, nó có nhận ra rằng SQLiteCommand mới giống như trước đó và do đó có một câu lệnh chuẩn bị có thể được sử dụng không?
Nếu tôi giữ SQLiteCommand trong bộ nhớ và thay đổi thông số và kết nối khi tôi mở và đóng kết nối cho các giao dịch khác nhau, tôi có giữ nguyên câu lệnh chuẩn bị giữa các kết nối khác nhau không?
Tôi có nhiều khả năng sẽ suy nghĩ nhiều hơn vào thời điểm này nhưng tôi hy vọng bạn có thể giúp tôi hiểu rõ hơn cách những thứ này tương tác để tôi có thể nhận được nhiều lợi ích nhất từ chúng.
Tôi không thạo SQLite, nhưng liên quan đến lý do tại sao một người nên đóng kết nối càng sớm càng tốt, bạn gần như tự trả lời: Kết nối vật lý cơ bản không bị đóng, bạn chỉ trả lại kết nối với hồ bơi. Hàm ý là nó có thể được sử dụng bởi các chủ đề khác. Rõ ràng, nếu bạn treo vào một kết nối nhưng không thực sự sử dụng nó, điều đó sẽ hạn chế tối đa khả năng sử dụng. (Tương tự rõ ràng: nếu bạn đang ở trong một bối cảnh đơn luồng, kết nối tổng hợp không làm cho rất nhiều ý nghĩa, mặc dù nó là unlikley để làm tổn thương bạn nhiều.) –