2012-12-15 2 views
16
로 잠겨하기

내 웹 응용 프로그램에 대한 다중 스레드를 실행하면 내가 얻을 :은 [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) 

나는 오직 하나 개의 스레드가 sqlite가 데이터베이스에 기록 할 수 있다는 것을 알고 있지만 난 데이터베이스에서 읽기만 가능합니다. 그렇다면이 오류 메시지가 나타나는 이유는 무엇입니까?

은 BTW : 내 연결 풀은 다음과 같습니다

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

셋업이 : 자바 1.6, 톰캣 7.0.34, 봄 3.2, 3.6.9 및 sqlite3를 3.7.2

감사 최대 절전 모드 Roger

+0

가능한 복제본 [SQLITE \ _BUSY] 데이터베이스 파일이 잠김 (데이터베이스가 잠김) wicket] (http://stackoverflow.com/questions/8559623/sqlite-busy-the-database-file-is-locked- 데이터베이스가 잠겨 있음) – Stephan

답변

15

내가 검색 한 결과 SQLite에 연결할 때 여러 연결을 사용하는 것이 좋지 않은 것으로 나타났습니다.

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

1에 poolsize의 maxactive 설정을 참조하고 시도.

+0

예, 작동합니다. 하지만 여전히 select 문만 실행되지만 파일이 잠긴 이유는 여전히 이해할 수 없습니다. – rogergl

+0

@rogergl : SQLiteOpenHelper # getReadableDatabase()와의 연결을 시도하십시오. 링크 : http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html – sorencito

0

읽기 전용 방법은 @Transactional(readonly=true)을 시도하십시오. 어쩌면 그게 효과가 있을지도 몰라.

+0

그게 도움이되지 않습니다 – rogergl

+0

좋아, 내 새로운 대답을 참조하십시오. – sorencito

+0

또한이 상황의 발생을 줄이기위한 몇 가지 단계 중 하나로 SQLite 문서에서 권장됩니다. 첫 번째 단계는 모든 것이 닫혀 있는지 확인하는 것입니다. 또한 데이터베이스가 스레딩을 지원하는지 확인해야합니다 (기본값은 켜짐). FULLMUTEX – oden

9

응용 프로그램과 단 하나의 연결 만 있어야합니다. 을 사용하면이를 확인할 수 있습니다. 실수로 연결을 종료하는 것을 잊지 경우이 문제가 발생할 수 있음을 또한

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

을, 다음 쿼리는하지 않을 수에 따라 연결 풀 구성 방법