2011-02-25 7 views
9

SQLite 데이터베이스와 봄을 사용하는 응용 프로그램을 개발하고 있습니다.스프링 + SQLite 멀티 스레드 응용 프로그램에서

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close" lazy-init="true"> 
    <property name="driverClassName" value="org.sqlite.JDBC" /> 
    <property name="url" value="jdbc:sqlite:sample.db" /> 
    <property name="initialSize" value="2" /> 
    <property name="maxActive" value="20" /> 
    <property name="maxIdle" value="5" /> 
    <property name="poolPreparedStatements" value="true" /> 
</bean> 

각 스레드 :

내가 구성된 하나의 데이터 소스이 '데이터베이스 파일이 잠겨'내가 오류 - 여러 스레드가 데이터베이스를 수정하려고 할 때 문제가있을 나는 데이터베이스에 삽입을 수행하는 JdbcDaoSupport 별도의 인스턴스가 :

getJdbcTemplate().update(
    "insert into counts values(15)" 
); 

데이터베이스 업데이트를 수행하는 기능은 TRANSAC입니다 tional (모든 격리 수준을 시도했습니다. 각 경우마다 동일한 오류가 발생합니다).

다른 데이터베이스 (MySql)를 사용할 때 동일한 코드가 올바르게 작동합니다.

내 코드에 '수동'동기화를 추가하지 않고 어떻게 해결할 수 있습니까?

+0

앱의 동시 발생 예상도는 어떻습니까? 설계 상 SQLite는 MySQL의 경우 fopen() 및 -not-을 대체하기위한 것입니다. 동시 데이터 액세스를 위해 2PL 또는 MVCC를 처리하도록 설계된 RDBMS가 필요하면 다른 RDBMS를 고려할 수 있습니다. MySQL, HSQLDB 또는 Derby는 모두 실제 클라이언트 - 서버를 지원합니다. – scottb

답변

1

바라건대, 나는 당신을 위해 완벽한 대답을 가지고 있습니다 - Berkeley DBSQL API. 작년 Berkeley DB는 스토리지 엔진과 SQLite SQL 레이어를 결합하여 두 제품 모두에서 최고의 제품을 제공했습니다. Berkeley DB의 동시성, 성능, 확장 성 및 안정성과 함께 SQLite의 편재성 및 사용 편의성.

왜이 문제를 해결할 예정입니까? Berkeley DB는 SQLite와 완벽하게 호환되지만 다른 동시 잠금 관리자를 구현하기 때문에 즉, Berkeley DB에서 데이터베이스에 동시에 액세스하는 여러 개의 업데이트 스레드를 가질 수 있습니다. 이 주제에 대한 몇 가지 흥미로운 백서가 있는데, Mike Owens (The Definitive Guide to SQLite) 저자 : Technical & Performance EvaluationBenefits and Differences.

면책 조항 : 저는 Berkeley DB의 제품 관리자로, 약간 편견이 있습니다. 그러나 Berkeley DB SQL API는 정확히이라는 문제를 제기합니다.이 문제는 SQLite에서 동시 읽기/쓰기 작업을 허용하는 방법입니다.

+0

Berkley DB와 같은 라이선스는 무엇입니까? 비용없이 상업용 응용 프로그램과 함께 배포 할 수 있습니까? –

+0

Berkeley DB 라이센스는 http://bit.ly/g7h1mf에서 찾을 수 있습니다. 기본적으로 이중 라이센스입니다. 오픈 소스 프로젝트를위한 오픈 소스 사용. 폐쇄 소스 애플리케이션에 대한 상용 라이센스 또는 오라클 지원을받을 수 있습니다. – dsegleau

+0

또 다른 대안으로, HSQLDB (http://www.hsqldb.org)는 무료이며, GPL과 같은 라이선스에 따라 사용 가능하며 현재 버전 2.3.0이며 10 년 이상 지속적으로 개발되었습니다. 성숙한 JDBC 4.1 드라이버 인 클라이언트 - 서버 (또는 독립 실행 형) 지원은 ANSI SQL : 2008을 거의 완벽하게 지원하며 2PL 및 MVCC 모델을 통한 다중 액세스를 지원합니다. – scottb

3

SQLite는 한 번에 하나의 연결 만 지원하므로 데이터 소스가 하나의 연결 만 생성하도록 구성해야합니다.

나는

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="true"> 
    <property name="driverClassName" value="org.sqlite.JDBC" /> 
    <property name="url" value="jdbc:sqlite:sample.db" /> < 
    <property name="initialSize" value="1" /> 
    <property name="maxActive" value="1" /> 
    <property name="maxIdle" value="1" /> 
    <property name="poolPreparedStatements" value="true" /> 
</bean> 
0

스프링을 사용하면 SingleConnectionDataSource을 활용할 수 있습니다. 내 사용 (300 + 인서트/초),이 잘 작동합니다.

@Bean 
public DataSource jdbcDataSource() { 
    SingleConnectionDataSource ds = new SingleConnectionDataSource(); 
    ds.setDriverClassName("org.sqlite.JDBC"); 
    ds.setUrl("jdbc:sqlite:stats.db"); 
    return ds; 
} 
+0

SingleConnectionDataSource 설명서에서 인용 "분명히이 기능은 멀티 스레딩 기능이 아닙니다." – PhoneixS

+0

@PhoneixS 실제 쿼리는 아니지만, JdbcTemplate과 같은 스프링 jdbc 클래스를 사용하는 한 스프링은 동기화를 처리합니다. – wmarbut

관련 문제