Tôi có một ứng dụng đơn luồng sử dụng 3 cơ sở dữ liệu SQLite trong 3 tệp khác nhau trên hệ thống tệp cục bộ.Tại sao tôi nhận được SQLException: cơ sở dữ liệu bị khóa trên cơ sở dữ liệu SQLite JDBC của tôi?
Tôi đã tạo lớp học trợ giúp DbAdapter
mở kết nối với tệp cơ sở dữ liệu SQLite. Trong lớp này, tôi có phương thức open
tạo kết nối và phương thức close
giải phóng mọi thứ.
3 cơ sở dữ liệu được truy cập từ một lớp có nguồn gốc DbAdapter
.
Trong chương trình của tôi mỗi truy cập cơ sở dữ liệu giống như thế này:
MyDbAdapter DB = new MyDBAdapter();
int stuff = DB.getStuff(); // queries the database
DB.close();
// now do something with `stuff`
Tôi đã đăng nhập để stdout
tất cả các cuộc gọi đến và DbAdapter.open
DbAdapter.close
. Mỗi lần có một số open()
, close()
theo sau.
Tôi cũng cẩn thận để đóng tất cả các Statement
s của mình (điều này sẽ khiến cho ResultSet
s được liên kết đóng lại).
Vì vậy, tôi đoán rằng truy cập cơ sở dữ liệu của tôi là sạch vì tôi đang cố gắng để có được chúng càng ngắn càng tốt, và tôi phát hành tất cả các nguồn lực ngay sau khi tôi không còn cần chúng.
Tuy nhiên, tôi vẫn nhận được java.sql.SQLException: database is locked
.
Có điều gì tôi không làm đúng không? Tôi biết tôi đã không hiển thị bất kỳ mã nào, nhưng tôi phải đăng rất nhiều mã và nó sẽ không có liên quan. Tôi chỉ hỏi nếu tôi đang sử dụng các phương pháp hay nhất ở đây, bởi vì tôi nghĩ rằng tôi làm và tôi vẫn nhận được ngoại lệ.
Đây là với Java 1.6, Xerial.org của sqlite-jdbc-3.7.2 lái xe, trên Mac OS 10.6 x64
Có thể quá trình đăng ký cũ vẫn đang chạy? Điều này vẫn đến sau khi khởi động lại? Bởi vì theo như tôi biết đó là một quá trình cho mỗi db nhúng không phải là một luồng .... – Thihara
có thể trùng lặp của [java.sql.SQLException: cơ sở dữ liệu bị khóa] (http://stackoverflow.com/questions/2578623/java-sql- sqlexception-database-locked) –
@Thihara: Tôi đã 'giết -9' tất cả các quy trình java, vẫn là –