La obtención del archivo de base de datos está bloqueada con sentencias select

Si ejecuto varios hilos contra mi aplicación web, obtengo:

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) 

Sé que solo un hilo puede escribir en una base de datos sqlite pero solo estoy leyendo desde la base de datos. Entonces, ¿por qué recibo este mensaje de error?

Por cierto: mi grupo de conexión se ve así:

           

La configuración es: Java 1.6, Tomcat 7.0.34, Spring 3.2, Hibernate 3.6.9 y sqlite3 3.7.2

Saludos Roger

Después de buscar en Google, descubrí que es una mala práctica usar múltiples conexiones cuando me conecto a SQLite. Ver

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

Configure su maxactive de poolsize en 1 y pruébelo.

Solo debe haber UNA conexión con su aplicación. puedes usar esto para asegurarte.

 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; } } 

Tenga en cuenta también que esto puede suceder si accidentalmente olvida cerrar su conexión:

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

Si bien la primera conexión a la base de datos puede funcionar bien una vez que se inicia el servidor, las consultas posteriores pueden no hacerlo, dependiendo de cómo esté configurado el conjunto de conexiones.

Pruebe @Transactional(readonly=true) para aquellos métodos que solo hacen lecturas. Quizás eso funcione para ti.

Cada vez que estableces una conexión, asegúrate de cerrarla después de terminar el trabajo. Me funcionó como si estuvieras usando

 Connection con = null; PreparedStatement pst = con.prepareStatement("...query... "); /* do some stuff */ pst.executeQuery(); pst.close(); con.close();