2012-04-25 2 views
0

여러 응용 프로그램에서 처음으로 병렬로 사용할 mysql 데이터베이스를 만들어야합니다. 이 시점까지는 mysql 데이터베이스에 대한 나의 유일한 경험은 데이터베이스를 쿼리하는 단일 프로그램 (예 : 웹 서버)이었습니다. 이제 여러 CXF 자바 서블릿 유형 프로그램과 백그라운드 서버 편집 및 동일한 스키마를 읽는 시나리오로 옮겨 가고 있습니다. Connector/J JDBC 드라이버를 사용하여 모든 경우에 데이터베이스에 연결하고 있습니다.mysql 데이터베이스를 병렬로 호출 할 때의 고려 사항

내 질문은 : 병렬 액세스가 문제가되지 않도록하려면 무엇을해야합니까. 나는 적절한 곳에 거래를 사용해야한다는 것을 알지만, 내가 정말로 잃어버린 곳은 경영진에있다. 예를 들면. 서블릿이 작업을 완료 할 때마다 연결을 닫아야합니까? 데이터베이스에 액세스하는 각 프로그램마다 고유 한 사용자가 필요합니까? Connector/J 객체로 무언가해야합니까? 테이블을 다른 방식으로 선언해야합니까? 나는 무엇인가 놓쳤는가, 아니면 내가 생각하지 못한 것이 있는가? 나는 거래와 SQL 자체를 처리하는 방법에 대해 꽤 좋은 생각을 가지고 있지만 데이터베이스를 설정할 때해야 할 일에 대해서는 꽤 분실했다.

답변

2

연결 풀을 유지해야합니다. 연결은 실제로 수백 밀리 초의 순서로 생각하는 데 비용이 많이 든다. 따라서 대용량 애플리케이션의 경우 캐시하고 재사용하는 것이 좋습니다.

서블릿의 경우 사용중인 컨테이너에 따라 다릅니다. JBoss와 같은 것은 컨테이너의 일부로 풀링을 제공합니다. 데이터 소스 정의를 통해 정의되고 JNDI를 통해 액세스 할 수 있습니다. 바람둥이 같은 다른 컨테이너는 C3PO와 같은 것을 의지 할 수 있습니다.

이러한 프레임 워크 대부분은 풀에 대한 연결을 반환하는 논리로 close() 메소드를 구현하는 JDBC 연결의 사용자 정의 구현을 반환합니다.

동시성 고려 사항은 낙관적/비관적 잠금 및 트랜잭션 격리 수준의 개념을 숙지해야합니다. 이것들은 응용 프로그램의 운영 컨텍스트에서만 정답을 결정할 수있는 절충점이 있습니다.

대부분의 응용 프로그램에는 읽기/쓰기 사용자라는 응용 프로그램을 나타내는 한 명의 사용자가 있습니다. 이 사용자는 응용 프로그램과 연관된 테이블, 색인, 시퀀스 등에서 레코드를 읽고 쓸 수있는 권한 만 가져야합니다. 응용 프로그램의 모든 인스턴스는 연결 문자열에이 사용자를 지정합니다.

위의 개념에 익숙해지면 그 중 약 95 %가됩니다.

한 가지 더. 관리 측면에 대한 의견에서 지적한대로 데이터베이스 엔진은 큰 고려 사항입니다. 차이점과 튜닝/구성 옵션에 익숙해야합니다.

+1

다른 하나주의 :'MyISAM'이 아닌'InnoDB' 스토리지 엔진을 사용하십시오. InnoDB는 동시성 (테이블 잠금 대신 행 잠금)을 처리하는 것이 훨씬 낫다. –

+0

연결 풀의 주제에 몇 가지 추가 질문이 있습니다. 1. 모든 서블릿간에 공유 될 예정입니까 아니면 각각의 연결 풀을 제공하는 것이 공평합니까? 그 이유는 대부분의 단위 테스트가 tomcat 외부에서 실행되기 때문에 tomcat 특정 객체로 작업하는 것을 보지 못하기 때문입니다. 2.내가 여기서 읽은 바로는, 주요 관심사는 하나의 연결 객체에 병렬로 액세스하는 것을 피하는 것이라고 가정하는 것이 맞습니까? 같은 데이터베이스 사용자에게 묶여있는 몇 개의 연결 객체가 있으면 연결이 지속되는 것과 마찬가지로 괜찮습니까? –

+0

1) 연결 자체는 일반적으로 공유되지 않습니다. 풀은 공유되어 스레드로부터 안전합니다. 풀의 주요 관심사는 데이터베이스 연결을 만드는 데 걸리는 시간입니다. 훨씬 간단한 해결책은 모든 요청에 ​​대해 연결을 만드는 것이지만 응답 시간의 99 %는 해당 연결을 협상하는 것입니다. 그것의 훨씬 더 효율적으로 전면에 연결을 잔뜩 협상하고 그들을 재사 용할 수 있습니다. 2) 연결은 기술적으로 스레드 안전성이 있다고 생각하지만 트랜잭션의 commit()이 연결에 의해 관리되기 때문에 스레드를 여러 스레드에서 공유하도록 권장하지 않습니다. – nsfyn55