2012-06-21 2 views
5

Mam aplikację jednowątkową, która korzysta z 3 baz danych SQLite w 3 różnych plikach w lokalnym systemie plików.Dlaczego otrzymuję SQLException: baza danych jest zablokowana w mojej bazie danych SQLite JDBC?

Stworzyłem klasę DbAdapter pomocnika, który otwiera połączenie do pliku bazy danych SQLite. W tej klasie mam metodę open, która tworzy połączenie i metodę close, która uwalnia wszystko.

W 3 bazy danych są dostępne z klasy pochodnej DbAdapter.

W moim programie każdy dostęp do bazy danych wygląda następująco:

MyDbAdapter DB = new MyDBAdapter(); 
int stuff = DB.getStuff(); // queries the database 
DB.close(); 
// now do something with `stuff` 

mam rejestrowane stdout wszystkie połączenia DbAdapter.open i DbAdapter.close. Za każdym razem jest blisko open(), a close().
ja również wziąć starań, aby zamknąć wszystkie moje Statement s (co spowoduje związane ResultSet s zostać zamknięte aswell).

Więc myślę, że moje dostępy baz danych są czyste, ponieważ staram się je jak najkrótsze, a ja zwolnić wszystkie zasoby, jak tylko już ich nie potrzebują.

Jednak nadal jestem coraz java.sql.SQLException: database is locked.

Czy jest coś, czego nie robię właściwie? Wiem, że nie pokazałem żadnego kodu, ale musiałbym wysłać DUŻĄ ilość kodu i nie będzie to miało znaczenia. Pytam tylko, czy używam tutaj najlepszych praktyk, ponieważ myślę, że mam i wciąż dostaję wyjątki.

To z Java 1.6, Xerial.org za sqlite-JDBC-3.7.2 kierowca, na Mac OS 10.6 x64

+0

Czy stary proces aplikacji działa nadal? Czy to nadal przychodzi po ponownym uruchomieniu? Ponieważ o ile wiem, jest to jeden proces na wbudowany db nie jeden wątek ... – Thihara

+0

możliwy duplikat [java.sql.SQLException: baza zablokowana] (http://stackoverflow.com/questions/2578623/java-sql- sqlexception-database-locked) –

+0

@ Thihara: Mam 'kill -9''d wszystkie procesy java, wciąż –

Odpowiedz

2

zauważyłem, że miałem dziwne procesy Java, że ​​nie mogę zabić. Uruchomiłem:

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

Ale te procesy były nadal tutaj (z tym samym PID).

Po ponownym uruchomieniu problem nie jest już wyświetlany. To nie ma sensu, ponieważ udało mi się wykonać wiele wywołań DB bez żadnych awarii, było tylko jedno wywołanie, które spowodowało wyjątek. W ogóle nie rozumiem, co się stało, ale nie mam już tego problemu.

Wszelkie prawdziwe odpowiedź mile widziane.

+1

Powiedziałem :-P Myślę, że z niektórych starych przebiegów pozostały jakieś nieuczciwe procesy. Zdarzyło mi się to również kilka razy. Ale to było w aplikacjach GUI, w których zapomniałem ustawić aplikację EXIT_ON_CLOSE na główną ramkę JFrame. Jeśli chodzi o powód, dla którego nie jestem guru linux. Być może będziesz miał więcej szczęścia w SuperUser. – Thihara

+0

Tak, masz rację. Nie sądziłem, że wpłynęły one na moją aplikację, ponieważ plik wykonywalny był po prostu '(java)', a nie '/ path/to/java/executable -arg1 -arg2 ...'. I to jest Mac OS, a nie linux! Unix;) –

0

cytując temacie java.sql.SQLException: database locked

„Odczytywanie bazy danych SQLite ustawia stan blokujący do wspólnych . Wiele czytników może być aktywnych w tym samym czasie.

Zapisywanie do bazy danych SQLite ustawia stan zablokowania na Wyłączny. Żadne inne procesy nie mogą być aktywne w tym czasie.

można znaleźć szczegółowe wyjaśnienie http://www.sqlite.org/lockingv3.html '

myślę, że to jest twój problem

+1

Jak to może być mój problem? Rzeczywiście, połączenie z bazą danych jest zamykane, gdy tylko nie jest mi ona potrzebna i nie może być dostępu równoległego, ponieważ moja aplikacja jest jednowątkowa. –

0

W moim przypadku problem wynikał z próby zaktualizowania bazy danych z poziomu Java, a jednocześnie otwarcia jej w przeglądarce SQLite Database Browser (która, jak się wydaje, wstrzymała db).