2012-06-21 38 views
5

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.openDbAdapter.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

+0

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

+0

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) –

+0

@Thihara: Tôi đã 'giết -9' tất cả các quy trình java, vẫn là –

Trả lời

2

tôi nhận thấy rằng tôi đã có quá trình Java lạ mà tôi không thể giết. Tôi đã chạy:

ps aux | grep java | grep -v grep | awk '{print$2}' | xargs sudo kill -9 

Nhưng những quá trình này vẫn ở đây (với cùng một PID).

Tôi đã khởi động lại và sự cố không còn xuất hiện nữa. Điều này không có ý nghĩa bởi vì tôi đã có thể thực hiện rất nhiều cuộc gọi DB mà không gặp bất kỳ sự cố nào, chỉ có một cuộc gọi duy nhất gây ra ngoại lệ. Tôi không hiểu TẤT CẢ những gì đã xảy ra, nhưng tôi không còn gặp vấn đề này nữa.

Bất kỳ thực trả lời chào mừng.

+1

Nói với bạn :-P Tôi nghĩ rằng có một số quá trình rogue còn lại từ một số chạy cũ. Điều này đã xảy ra với tôi một vài lần là tốt. Nhưng đó là trong các ứng dụng GUI, nơi tôi đã quên đặt ứng dụng EXIT_ON_CLOSE thành JFrame chính. Vì lý do tôi không phải là một guru Linux. Có thể bạn sẽ có may mắn hơn ở SuperUser. – Thihara

+0

Bạn đã đúng. Tôi không nghĩ rằng họ đã ảnh hưởng đến ứng dụng của tôi bởi vì tệp thực thi chỉ là '(java)' và không phải là '/ path/to/java/executable -arg1 -arg2 ...'. Và đó là Mac OS, không phải Linux! Unix;) –

0

trích dẫn từ chủ đề java.sql.SQLException: database locked

'Đọc một cơ sở dữ liệu SQLite đặt trạng thái khóa để chia sẻ . Nhiều người đọc có thể hoạt động cùng một lúc.

Ghi vào cơ sở dữ liệu SQLite đặt trạng thái khóa thành Độc quyền. Không có quy trình nào khác có thể hoạt động tại thời điểm đó.

Bạn có thể tìm thấy một lời giải thích chi tiết về http://www.sqlite.org/lockingv3.html '

Tôi nghĩ rằng đây là vấn đề của bạn

+1

Làm thế nào đây có thể là vấn đề của tôi? Thật vậy, kết nối với DB được đóng ngay khi tôi không cần nó nữa, và không thể truy cập đồng thời vì ứng dụng của tôi là đơn luồng. –

0

Trong trường hợp của tôi, sự cố là do cố gắng cập nhật cơ sở dữ liệu từ Java, trong khi mở nó trong Trình duyệt cơ sở dữ liệu SQLite (có vẻ như đã khóa một khóa trên db).

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