37

Web アプリに対して複数のスレッドを実行すると、次のようになります。

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)

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

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

<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、Spring 3.2、Hibernate 3.6.9、および sqlite3 3.7.2

よろしくロジャー

4

11 に答える 11

27

グーグルで調べたところ、SQLite に接続するときに複数の接続を使用するのは悪い習慣であることがわかりました。見る

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

poolsize maxactive を 1 に設定して試してみてください。

于 2012-12-15T11:48:36.017 に答える
12

アプリケーションとの接続は 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;
    }
}
于 2014-06-15T18:27:27.270 に答える
9

誤って接続を閉じるのを忘れた場合にも、これが発生する可能性があることに注意してください。

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 */
    }
  }
}

サーバーが起動すると、最初のデータベース接続は正常に機能する場合がありますが、接続プールの構成方法によっては、後続のクエリが正常に機能しない場合があります。

于 2014-10-21T20:12:32.000 に答える
2

接続を確立するたびに、作業が完了したら必ず閉じてください。

Connection con = null;
PreparedStatement pst = con.prepareStatement("...query... "); 
/*
 do some stuff 
*/
pst.executeQuery();
pst.close();
con.close();
于 2018-05-01T05:15:48.307 に答える
-2

@Transactional(readonly=true)読み取りのみを行うメソッドを試してください。多分それはあなたのために働く。

于 2012-12-15T09:30:48.777 に答える