2012-07-13 3 views
0

나는 매초마다 데이터를 수집하여 ": 메모리"데이터베이스에 저장하고 있습니다. 이 데이터베이스에 데이터를 삽입하는 것은 트랜잭션 내에 있습니다.두 개의 메모리 데이터베이스 연결하기

한 요청이 서버에 전송 될 때마다 서버가 첫 번째 메모리에서 데이터를 읽고 일부 계산을 수행하여 두 번째 데이터베이스에 저장 한 다음 클라이언트로 다시 보냅니다. 이를 위해 첫 번째 db의 집계 된 정보를 저장하는 또 다른 ": memory :"데이터베이스를 만듭니다. 집계 된 결과를 얻기 위해 큰 계산을해야하기 때문에 같은 DB를 사용할 수 없습니다. 이것은 트랜잭션 내에서 수행 될 수 없습니다 (하나의 콜렉션이 5 초가 걸리는 경우 4 초의 데이터를 모두 잃어 버리기 때문에). 동일한 데이터베이스에 테이블을 만들 수 없습니다. 원래 데이터를 수집하고 삽입하는 동안 집계 데이터를 쓸 수 없기 때문입니다 (트랜잭션 내에 있고 1 초마다 수집 중임)

- 때때로 원합니다. 두 데이터베이스에서 데이터를 검색 할 수 있습니다. 이 두 메모리 데이터베이스를 어떻게 연결할 수 있습니까? 첨부 데이터베이스 stmt를 사용하여 두 번째 db를 첫 번째 db에 연결할 수 있습니다. 하지만 문제는 다음에 요청이 오면 어떻게됩니까 두 번째 db가 존재하는지 확인합니다.

- 두 번째 메모리를 첫 번째 메모리에 연결한다고 가정합니다. 첫 번째 데이터베이스에 데이터를 쓸 때 두 번째 데이터베이스가 잠길 것인가?

-이 집계 된 데이터를 저장할 다른 방법이 있습니까?

답변

0

나는 당신의 아이디어를 얻은 한 두 개의 데이터베이스가 전혀 필요 없다고 생각합니다. 나는 당신이 sql에서 트랜잭션의 아이디어를 오해하고 있다고 생각한다.

트랜잭션을 시작하는 경우 다른 프로세스에서도 데이터를 읽을 수 있습니다. 데이터를 읽는 중이라면 데이터베이스 잠금이 필요하지 않을 것입니다.

가능한 워크 플로는 다음과 같이 보일 수 있습니다.

  1. 그렇지 않으면 하나를 삽입하는 다른 프로세스를 방지 할 수 있습니다,
  2. 데이터베이스에 무거운 계산을 수행합니다 (그러나 트랜잭션을 사용하지 않는 데이터베이스에 일부 데이터를 삽입 (단지 삽입 프로세스 트랜잭션을 사용) 데이터를 데이터베이스에 저장). 이 단계에 실제로 많은 계산이 포함되어 있더라도 SELECT 문으로 데이터베이스를 잠그지 않으므로 다른 프로세스를 사용하여 데이터를 삽입하고 읽을 수 있습니다. 데이터베이스에
  3. 쓰기 결과는 (다시 트랜잭션을 사용하여)

그냥 무거운 계산 트랜잭션 내에서 수행되지 않습니다 있는지 확인하십시오.

이 솔루션에 대한 자세한 설명은 sqlite3의 파일 잠금 동작에 대한 설명서를 참조하십시오. http://www.sqlite.org/lockingv3.html

관련 문제