2012-12-15 15 views
16

でロックされているの取得私は私のWebアプリケーションに対して複数のスレッドを実行する場合、私は得る:[SQLITE_BUSY]データベースファイルを選択ステートメント

java.sql.SQLException: [SQLITE_BUSY] The database file is locked (database is locked) 
    at org.sqlite.DB.newSQLException(DB.java:383) 
    at org.sqlite.DB.newSQLException(DB.java:387) 
    at org.sqlite.DB.execute(DB.java:339) 
    at org.sqlite.PrepStmt.executeQuery(PrepStmt.java:75) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 

私は1つのスレッドだけのSQLiteデータベースに書き込むことができることを知っていますが、私はよデータベースからのみ読み込みます。では、なぜこのエラーメッセージが表示されますか?

ところで:私の接続プールは、次のようになります。

<bean class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close" id="dataSource"> 
    <property name="driverClassName" value="${database.driverClassName}" /> 
    <property name="url" value="${database.url}" /> 
    <property name="username" value="${database.username}" /> 
    <property name="password" value="${database.password}" /> 
    <property name="initialSize" value="1" /> 
    <property name="maxActive" value="2" /> 
    <property name="maxIdle" value="1" /> 
    <property name="poolPreparedStatements" value="true" /> 
</bean> 

セットアップされます。Java 1.6、Tomcatの7.0.34、春3.2は、3.6.9および3.7.2 sqlite3の

よろしく休止状態 Roger

+0

可能な複製[SQLITE \ _BUSY]データベースファイルがロックされています(データベースがロックされています)](http://stackoverflow.com/questions/8559623/sqlite-busy-the-database-file-is-locked- – Stephan

答えて

15

私が見つけたのは、SQLiteに接続するときに複数の接続を使用するのが悪いことです。 1へのあなたのプールサイズのMAXACTIVEを設定し、試してみる

http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

を参照してください。

+0

あります。しかし、私はまだselect文だけが実行されているにもかかわらず、ファイルがロックされている理由を理解できません。 – rogergl

+0

@rogergl:SQLiteOpenHelper#getReadableDatabase()との接続を試行してください。リンク:http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html – sorencito

0

@Transactional(readonly=true)読み取り専用の方法については、@Transactional(readonly=true)をお試しください。多分それはあなたのために働く。

+0

それは助けにならない – rogergl

+0

私の新しい答えを見てください。 – sorencito

+0

これは、この状況の発生を減らすためのいくつかの手順の1つとして、SQLiteドキュメント内でもお勧めします。最初のステップは、すべてが閉じられていることを確認することです。また、データベースがスレッディングをサポートしていることを確認する必要があります(デフォルトはオン)。FULLMUTEX – oden

9

アプリケーションとの接続は1つだけにする必要があります。 これを使用して確実に行うことができます。

public class SqliteHelper { 
private static Connection c = null; 
public static Connection getConn() throws Exception { 
    if(c == null){ 
    Class.forName("org.sqlite.JDBC"); 
    c = DriverManager.getConnection("jdbc:sqlite:D:/test.db"); 
    } 
    return c; 
    } 
} 
2

あなたが誤って接続を閉じることを忘れた場合、これが起こる可能性があることにも注意してください:

Connection connection; 
try { 
    Statement statement = connection.createStatement(); 
    ResultSet resultSet = statement.executeQuery(QUERY); 
    if (resultSet.next()) { /* do something */ } 
catch (SQLException e) { /* handle exception */ } 
finally { 
    if (connection != null) { 
    try { 
     connection.close(); // <-- This is important 
    } catch (SQLException e) { 
     /* handle exception */ 
    } 
    } 
} 

サーバーが開始されてから最初のデータベース接続がうまく機能するかもしれないが、後続の問合せは、に依存しないことがあり接続プールの構成方法。