2014-11-02 2 views
0

JSF 웹 응용 프로그램에서 데이터베이스에 JDBC 연결을 설정하는 적절한 방법을 고민하고 있습니다. 이 문제에 대한 나의 일반적인 접근 방식은 응용 프로그램 서버 내에 데이터 소스를 생성하고 코드 내에서 JNDI 이름을 사용하여 데이터 소스에 연결하는 것입니다. 기본적으로 모든 사용자는 풀을 통해 전체 세션 동안 동일한 데이터베이스 사용자 계정을 공유합니다.연결 풀이없는 웹 응용 프로그램의 데이터베이스 연결

불행히도 내가 일하고있는 새 프로젝트의 요구 사항으로 인해이 작업을 수행 할 수 없습니다. 응용 프로그램에 연결하는 각 사용자는 고유 한 권한 정보를 사용하여 RDBMS에 로그인해야합니다. 이 코드와 관련된 코드를 구현하는 방법에 대한 스케치가 있지만 전반적인 아키텍처가 100 % 명확하지는 않습니다. 응용 프로그램 서버 (Tomcat, Glassfish, WebLogic)에는이를 지원하는 기능이 있습니까?

지금 당장이 작업을 수행하는 유일한 방법은 각 사용자 세션에서 데이터베이스에 직접 JDBC 연결을 다시 생성하는 것입니다. 나는 이것이 효과가 있다고 믿는 동안, 단지 옳다고 생각하지 않는다.

내가 누락 된 항목이 있습니까?

+0

['DataSource.getConnection (username, password)'] (http://docs.oracle.com/javase/8/docs/api/javax/sql/DataSource.html)에서 얻은 연결을 확인하는 것이 좋습니다. # getConnection-java.lang.String-java.lang.String-)은 전혀 풀링되지 않습니다. –

답변

1

당신은 뭔가를 놓쳤습니다 - 대단히 생각합니다 : 합리적인 시스템 설계. ;) 데이터베이스 자격 증명을 사용하여 사용자를 관리한다는 아이디어는 데이터베이스를 관리하는 하나의 유스 케이스에 유용합니다. 그 밖의 모든 것, 그것은 좋은 것보다 많은 문제를 부과합니다. 그래서 똥 스톰이 시작됩니다 ...;)

BOT : 딜레마가 있습니다. 기본적으로 각 사용자에 대한 연결 풀을 작성해야합니다. 그렇지 않으면 데이터 소스가 연결 시간 초과로 실행될 때마다 데이터베이스에 대한 연결을 작성해야하기 때문입니다. 세 방향 핸드 쉐이크와 인증은 싼 것은 아닙니다. 대기 시간이 귀하의 성과를 저해 할 수 있습니다. 일부 드라이버는 그에 따라 구성 할 수 있지만 일반적으로 나쁜 아이디어이며 대부분의 드라이버는 "분리의 문제"때문에 연결 자체를 관리하지 못합니다. 다른 한편, 각 사용자가 자신이 여러 작업을 동시에 수행 할 가능성이 거의 없으므로 각 연결 "풀"에는 약 5 개의 연결 만 있으면됩니다.

참고 : 연결 및 풀을 관리하는 유일한 드라이버는 MongoDB의 드라이버입니다.

이제 여기에 문제가 있습니다. 세션에 연결 풀을 연결할 수 없습니다. 꽤 많은 마일을 걷지 않고, 나는 그것이 전부 가능하다는 것을 의심합니다.

이 문제를 해결하려면 사용자가 로그인하여 JNDI를 사용하여 동적으로 등록 할 때 연결 풀을 만드는 것이 좋습니다. 문제는 이것이 매우 확장 성이 없다는 것입니다 (수백 명의 사용자가 있다고 가정). 따라서 세션이 종료되면 (로그 아웃 또는 시간 초과로) 풀이 제거되었는지 확인해야합니다. 또한 코드를 유지 관리해야합니다.

또 다른 아이디어는 Apache Shiro을 사용하고 자격 증명을 확인하기 위해 데이터베이스에 로그인하려고하는 사용자 지정 영역을 작성하여 실패 할 경우 AuthenticationExcepion을 던집니다. 여기에 걸 맞는 절충점은 매번 연결을 초기화해야한다는 것입니다. 영역에서는 응용 프로그램 전체 연결 풀을 사용하고 인증 및 권한 부여 데이터에 대해 데이터베이스 메타 데이터를 검사 할 수도 있습니다. 물론 그것은 특권을 가진 사용자로서 데이터베이스에 액세스하는 것이 필요합니다. 이것은 끔찍한 생각입니다.

결론 : 어떤 방식으로 보더라도 응용 프로그램의 인증 및 권한 부여 요구 사항을 데이터베이스를 통해 관리하면 응용 프로그램의 인증 및 권한 부여 계층이 제거 될 수 있지만 추가로 추상화 계층이 필요합니다. 일부 데이터베이스 메커니즘이 변경되는 경우 서비스의 코드를 변경하고 싶습니까?), 코드를 한 데이터베이스로보고 묶을 때 확장 성 문제를 부과합니다 (물론 세분화 된 사용 권한은 원하지 않고 "효과가 없다"결과).

+0

답변 해 주셔서 감사합니다. 이것들은 요구 사항이 제시되었을 때 내가 가진 것과 똑같은 관심사입니다. 내 현재의 아이디어 (다시, 나는 이상한 ... 실현하지 않습니다) RDBMS에 자격 증명을 확인하기 위해 사용자가 만든 테이블 집합을 읽는 아주 작은 수영장을 구성하는 것입니다 (예를 들어, 오라클의 dba_users보기) . cred가 확인되면 응용 프로그램에서 세션을 만듭니다. 거기에서, 그/그녀 자신의 RDBMS 신임장으로 그 사용자를 위해서만 다른 연결이 작성됩니다. – Naitouk

+0

나는 이것이 유지하기에는 너무 많은 코드라고 생각한다. 차라리 구현할 수있는 Shiro와 Custom 영역으로 갈 것입니다. –

0

빈 연결 풀의 오버 헤드와 사용자 수에 대해 잘 모르겠지만 최대 연결 수 (2 개)와 공격적인 연결 풀의 전체 목록을 유지하는 것이 좋습니다 유휴 시간 초과는 0 풀 연결로 되돌아갑니다. 그런 다음 사용자가 로그인 할 때 이미 사용자 이름으로 참조 된 풀이 있는지 확인하고 풀이 아닌 경우 새 풀을 만들고 풀에 고정하여 해당 사용자의 연결에 대해 풀을 사용합니다.

그런 식으로 최소한의 오버 헤드로 풀의 이점을 얻을 수 있습니다. 가능한지 여부는 사용자 수에 따라 다릅니다.

나는 확실히 당신을 위해 기능 할 가장 낮은 오버 헤드 풀 구현을 찾고 있습니다. 선택할 수있는 몇 가지가 있습니다. c3p0은 나 자신을 위해 훌륭하게 작동했습니다.

+0

흥미로운 접근 방식. 각 사용자마다 100 % 고유 한 사용자 이름이 보장되므로 로그 아웃 할 때 풀을 삭제해야 할 수도 있습니다. 조언 해 주셔서 감사합니다! – Naitouk

관련 문제