2010-12-15 4 views
1

나는 봄에 mysql에 쓰기 위해 ibatis를 사용하고있다.spring ibatis mysql 간헐적 인 비동기 문제

간헐적 인 버그가 있습니다. 프로세스의 각 사이클마다 DB에 두 개의 행을 씁니다. 이전주기의 행을 읽은 다음주기. 때로는 (30 번에 한 번, 때로는 더 자주, 때때로 덜) DB에서 한 줄만 가져옵니다.

내가 생각할 수있는 모든 캐싱을 해제했습니다. 내하는 SQLMaps-config.xml 파일은 말한다 :

<sqlMapConfig> 
<settings enhancementEnabled="false" statementCachingEnabled="false" classInfoCacheEnabled="false"/> 

<sqlMap resource="ibatis/model/cognitura_core.xml"/> 

다른 봄 캐싱 또는 iBATIS를 또는 내가 부족 MySQL의 드라이버가 일부 비동기가 있는가, 또는? 봄 3.0.5 사용

는 MySQL의 커넥터 - 자바 5.0.5

EDIT 1, 2.3.5의 MyBatis :

내가 연결 (C3P0)의 풀을 사용하고 있기 때문에 될 수 있을까요? 독서 중일 때 삽입물이 계속 실행 중입니까? 이상하게 보입니다. 명시 적으로 asynch를 선언하지 않으면 모든 것이 동 기적으로 발생한다고 생각 했습니까?

답변

0

삽입 후에 SqlSession.commit()을 호출하고 있습니까? C3P0은 연결을 비동기 적으로 "닫습니다". 이는 커버 아래에서 커밋을 호출 할 수 있습니다. 그것은 당신이보고있는 행동을 설명 할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 그건 아주 유망한 소리 .. 난 당신이 SqlSession.commit()에 의해 무슨 뜻인지 모르겠다. 삽입을 getSqlMapClientTemplate()처럼 호출하고 있습니다. insert ("insertIterationHistory", dataMap); - 템플릿에 커밋 메소드가없는 것 같습니다. @Transaction으로 메소드에 주석을 달아야합니까? 나는 커밋이 어디에서 일어나기로되어 있는지 정말로 모르겠다. 나는 각 인서트가 기본적으로 자동으로 커밋 될 것이라고 생각했다. – bruce

+0

Hmmm .. 나는 단지 http://old.nabble.com/how-to-dusable-asynch-threads---td21196742.html을 읽고 비동기 설명에 가중치를 추가했다. . 나는 단지 동기식으로 일을하는 다른 연결 풀을 사용하려고한다고 생각한다. – bruce

+0

MyBatis 3과 같이 미안하다. 그 원리는 동일하다. DB 커밋을 얻으려면 트랜잭션이 필요하므로 DataSourceTransactionManager가 구성되어 있고 Spring 구성에서 와 같은 것을 가지고 있다고 가정하면 주석을 추가해야합니다. – AngerClown

0

나는 비슷한 행동을하고 있습니다. 이것이 내가하는 일이다. 업그레이드 할 계획이없는 IBATIS의 이전 버전이 있습니다. 이것을 데코레이터로 쉽게 옮길 수 있습니다.

SqlMapSession session = client.openSession(); 
try { 
    try { 
     session.startTransaction(); 
     // do work 
     session.commitTransaction(); 
     // The transaction should be committed now, but it doesn't always happen. 
     session.getCurrentConnection().commit(); // Commit again :/ 
    } finally { 
     session.endTransaction(); 
    } 
} finally { 
    session.close(); // would be nice if it was 'AutoCloseable' 
} 
관련 문제