로컬 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을 실행하려고했습니다. 작동하는 것으로 보이는 유일한 것은 과도하게 긴 타이머/시간 초과입니다. 이는 받아 들일 수있는 해결책이라고 생각하지 않습니다.
누구도이 문제에 부딪 혔습니까? 비동기에 대한 트릭이 있습니까?