2011-10-03 5 views
0

로컬 sqlite db를 매우 많이 사용하는 응용 프로그램에서 작업합니다. 처음에는 동기식 데이터베이스 통신용으로 설정되었지만 이러한 과도한 사용으로 인해 애플리케이션이 "잠시"매우 짧은 기간 동안 "정지"되고있었습니다.Adobe AIR SQLite 비동기 이벤트가 디스패치되지 않음

비동기 통신으로 리팩토링 한 후 다른 문제가 발생했습니다. 응용 프로그램이 훨씬 덜 신뢰할 것으로 보인다. 일자리는 단순히 완료되지 않는 것 같습니다. 많은 디버깅과 조정 후에 문제는 항상 잡히지 않는 데이터베이스 이벤트 핸들 인 것으로 보입니다. 특히 트랜잭션을 시작하거나 연결을 닫을 때이를 볼 수 있습니다. 이 잘 작동 시간의 대부분

con.addEventListener(SQLErrorEvent.ERROR, tran_ErrorHandler); 

con.addEventListener(SQLEvent.BEGIN, con_beginHandler); 

con.begin(SQLTransactionLockType.IMMEDIATE); 

: 여기

은 예입니다. 하지만 con_beginHandler는 con.begin이 호출 된 후에 매번 공격을받지 않습니다. 이로 인해 결코 커밋되지 않은 열린 트랜잭션이 생기고 향후 요청을 실제로 중단시킬 수 있습니다. 연결 종료 처리기로 이와 동일한 문제를 조사 할 때 해결 방법 중 하나는이를 지연시키는 것입니다. 그런 맥락에서 몇 초를 기다리는 것이 좋습니다.

이렇게 변경하면 트랜잭션이 더 안정적으로 보이지만 응용 프로그램이 작업을 완료하는 데 걸리는 시간이 실제로 늘어납니다. 이것은 매우 db가 많은 응용 프로그램이므로 200ms를 추가하더라도 눈에 띄는 영향이 있습니다. 그러나 200ms 정도의 짧은 것도 문제를 완전히 해결하지 못하는 것 같습니다. 이 문제를 보지 않으려면 500-1000ms 이상이어야합니다.

코드와 트랜잭션을 테스트하고 스트레스 테스트하기 위해 별도의 AIR 응용 프로그램을 작성했지만 해당 환경에서는이 코드를 재현 할 수 없습니다. 심지어 애플리케이션 스트레인이 오산을 일으키는 지 알아보기 위해 응용 프로그램 (일부 수학이나 다른 처리를 수행하는 긴 루프)을 "동결"시키는 작업을 시도해도되지만 모든 것이 안정적으로 보입니다.

현재이 문제를 해결하는 방법을 놓치고 있습니다. 나는 심지어 더 많은 시간을 추가하기 위해 바인딩 이벤트에서 con.begin을 실행하려고했습니다. 작동하는 것으로 보이는 유일한 것은 과도하게 긴 타이머/시간 초과입니다. 이는 받아 들일 수있는 해결책이라고 생각하지 않습니다.

누구도이 문제에 부딪 혔습니까? 비동기에 대한 트릭이 있습니까?

답변

0

나는 상쾌한 주말 이후 시도해 볼만한 몇 가지 아이디어가 있었지만 그 중 어떤 것도 밖으로 펼쳐지지 않았습니다. 그러나, 이러한 시도와 더 많은 조사 동안 나는 마침내이 문제에 대한 패턴을 발견했다. 비록 그것이 일관되게 일어나지는 않더라도 일어나는 일은 그것이 일어나는 곳에서 공정하게 일관됩니다. 파일 크기를 줄이기 위해 데이터 지우기를 수행 한 후 DB를 압축하려고하는 문제가있는 프로세스 중에 1 ~ 2 개의 지점이 있습니다. 나는 여기서 문제가 작고 비동기식 흐름에 적절하게 작용하지 않는다고 생각한다. 그래서 우리는 db를 압축하려고 시도하면서 새로운 트랜잭션을 시작하려고합니다. 컴팩트가 잠시 동안 조금씩 시간이 걸리면 전화가 끊깁니다. 트랜잭션이 마침내 일어나지 않고 시작될 때 디스패치하는 비동기 이벤트 핸들링에 대한 가정 된 동작이 있다고 생각합니다.하지만 이것은 어느 정도 의미가 있습니다.