2009-11-09 4 views
2

안녕하세요. 통신 채널에서 데이터를 받고 표시합니다. 병렬, 나는 그것을 SQLite 데이터베이스로 직렬화한다 (일반적인 SQL INSERT 문 사용). 응용 프로그램 종료 후 sqlite 객체에 .commit을 수행합니다.안정적으로 데이터를 직렬화하는 방법

신청서가 잔인하게 중간에 종료되면 어떻게됩니까? 최신 (합리적으로 말하자면 100 마이크로 초 전, 그러나 적어도 초전에) 데이터는 .commit없이 데이터베이스에 안전하게 저장됩니까? 아니면 정기 커밋을해야합니까? 이런 일을하는 데 가장 좋은 패턴은 무엇입니까?


나는 (SQLite는의 옵션)에 자동 커밋을 시도하고이 요인에 의해 많은 코드를 느리게 ~ 55 (자동 커밋 대 단지 하나가 마지막에 커밋). 100 회의 인서트를 수행하면 최적의 모드의 20 % 이내로 성능이 향상됩니다. 따라서 자동 커밋은 저에게 매우 느립니다.

내 응용 프로그램은 많은 데이터를 DB에 저장합니다. 제대로 작동하려면 어떻게해야합니까?

답변

1

논리적 변경을 완료 할 때마다 COMMIT를 수행해야합니다.

트랜잭션의 커밋되지 않은 데이터가 외부에서 볼 수 없도록하는 것이 하나의 이유입니다. 이는 때때로 단일 논리 변경이 여러 INSERT 또는 UPDATE 문으로 변환 될 수 있기 때문에 중요합니다. 후자의 트랜잭션 조회 중 하나가 실패하면 ROLLBACK으로 트랜잭션을 취소 할 수 있으며 변경 사항이 전혀 기록되지 않습니다.

일반적으로 COMMIT가 성공할 때까지 트랜잭션에서 수행 된 변경 사항은 데이터베이스에 기록되지 않습니다.

내 코드가 상당히 느려지지 않습니까?-

자주 커밋을 zaharpopov, 코드를 늦출 수 있으며 최적화 당신은 단일 트랜잭션에서 여러 개의 논리적 인 변화를 그룹화 시도 할 수 있습니다. 그러나 이것은 트랜잭션의 올바른 사용에서 출발하는 것이므로 성능을 크게 향상 시킨다는 것을 측정 한 후에 만해야합니다.

+0

내 코드가 상당히 느려지지 않습니까? – zaharpopov

3

transaction 내에이 작업을 수행해야하며 결과적으로 해당 프로세스의 적절한 시점에 commit을 수행해야합니다. 트랜잭션은이 작업이 atomic임을 보장합니다. 즉, 작동하거나 작동하지 않습니다.

는 자성 데이터베이스 수정은 "전부 또는 아무것도"규칙을 따라야한다고. 각 거래는 은 "원자"라고 말하면 거래의 한 부분 인 이 실패하면 전체 거래가 실패합니다. 데이터베이스 관리 시스템 은 어떤 DBMS, 운영 체제 또는 하드웨어 장애에도 불구하고 트랜잭션의 원자 성을 유지하는 것이 중요합니다.

커밋하지 않은 경우 프로세스가 종료 될 때 삽입이 표시되지 않으며 롤백됩니다.

언제 이러한 커밋을 수행합니까? 귀하의 삽입물이 으로 일관되고 무언가를 나타낼 때. 예를 들어 .. 각 메시지에 2 개의 정보를 삽입해야한다면 두 정보를 모두 삽입 한 후 커밋하십시오. 귀하의 정보가 일관성이 없거나 완전하지 않기 때문에 각각 후에 커밋하지 마십시오.

2

데이터가 커밋없이 데이터베이스에 영구적이지 않습니다. 가끔 커밋을 사용하여 트랜잭션에서 많은 삽입을 수행하는 속도를 조정하십시오 (커밋 빈도가 높을수록 느림). 커밋 빈도가 더 높아지는 것을 방지합니다.

+0

가장 좋은 방법은 무엇입니까? 삽입 횟수를 카운트하고 N을 한 번 커밋합니까? – zaharpopov

+0

그것은 주로 응용 프로그램에 따라 다릅니다. N 개의 삽입마다 한 번 또는 단위 시간당 한 번 또는 다른 틱 소스를 사용할 수 있습니다. 귀하는 귀하의 신청서에 대한 절충안을 만들어야합니다. –

관련 문제