2014-07-14 3 views
1

에 의해 공유되고 있습니다.이 절차에서는 세션 기반 글로벌 임시 테이블을 사용하므로 문제가 발생합니다. 좋은 이유가 필요합니다. 한 웹 클라이언트의 동작은 다른 웹 클라이언트의 동작을 방해합니다. 동일한 Oracle 세션이 별도의 클라이언트에 의해 재사용되는 이유는 무엇입니까?오라클 세션이 다른 웹 클라이언트 - 웹 로그

웹 로직이있는 연결 풀링이 있습니다. 실제로 2 개의 클라이언트가 동일한 oracle 세션을 할당 받고 있음을 확인하기 위해 다음을 인쇄했습니다.

SELECT SYS_CONTEXT ('USERENV', 'INSTANCE'), 
     SYS_CONTEXT ('USERENV', 'SID'), 
     SYS_CONTEXT ('USERENV', 'SESSIONID') 
    FROM DUAL; 

각 클라이언트가 다른 세션 (HTTP 세션이 아닌 Oracle 세션)을 확보하는 방법은 무엇입니까? 웹 로직 레벨에서 뭔가 수정해야 할 필요가 있습니까?

답변

2

중간 계층에서 연결 풀링을 사용하는 경우 중간 계층 코드가 연결을 닫으면 풀로 돌아가고 다른 중간 계층 세션에서 사용할 수 있습니다. 중간 계층에서 연결을 닫는 지점을 지나서 데이터를 저장하는 전역 임시 테이블을 사용하려고하면 잘못된 결과가 발생합니다.

중간 계층을 설계하고 빌드하여 연결 풀링을 사용하지 않고 각 중간 계층 세션이 해당 사용자 만 사용하는 개인 데이터베이스 연결을 열도록 할 수 있습니다. 그러나 일반적으로 데이터베이스 연결을 열고 닫는 시간을 낭비하게 될 것이므로 응용 프로그램 사용자가 명시 적으로 사이트가 아닌 사이트를 탐색 할 때 수천 개의 고아 데이터베이스 연결로 끝날 수 있으므로 일반적으로 끔찍한 생각입니다. 로그 아웃하고로드 균형 조정을 위해 다른 시점에 다른 앱 서버에서 동일한 사용자를 서비스하는 것과 같은 일을하는 것은 매우 어려울 것입니다.

더 나은 방법은 글로벌 임시 테이블을 없애고 고유 한 세션 ID가 포함 된 영구 테이블에 필요한 데이터를 키의 일부로 저장하는 것입니다. 어느 시점에서 데이터를 제거하는 코드를 작성해야하지만 그다지 어렵지는 않습니다.

+0

몇 가지 질문이 있습니다. 먼저 답장을 보내 주셔서 감사합니다. (1) "고유 한 세션 ID를 키의 일부로 포함하는 영구 테이블"이라고하는 고유 한 세션 키는 무엇입니까? Java 세션 ID를 언급하고 있습니까? 왜냐하면 내가 질문에서 언급했듯이, DB 세션 ID가 다른 사용자/클라이언트에 대해 동일한 값을 보여주기 때문에 모든 문제가 발생하기 때문입니다. (2) 웹 응용 프로그램 컨텍스트에서 세션 기반 GTT에 대해 논의하지 않았습니까? 나는 웹 사이트와 관련하여 글로벌 임시 테이블의 다른 응용 프로그램이 무엇인지 의미합니까? 장바구니는 어떻게 구현됩니까? – user2275460

+0

@ user2275460 - "고유 한 세션 키"는 중간 계층에서 할당 한 것으로 응용 프로그램 세션을 식별합니다. 그리고 예, 저는 웹 기반 응용 프로그램에서 GTT를 사용하는 상황을 상상하기가 매우 어려울 것입니다. 장바구니를 만들 때 GTT를 사용하는 것을 상상할 수 없습니다. 나는 장바구니가 '쇼핑'상태 인 주문을 추적하는 데 사용할 영구 테이블을 보유 할 것으로 예상됩니다. 이 경우, 응용 프로그램 세션뿐만 아니라 장 Y 구니에 사용자의 장 Y 구니가 표시되기를 원할 수도 있습니다. –

+0

@ user2275460 - 예를 들어 몇 달 동안 Amazon cart에있는 항목이 있습니다. 아마존은 저에게만 전용 데이터베이스 연결을 열지 않았으며, 그 시간 동안 수십 대의 기계에서 열어 본 모든 애플리케이션 세션에 데이터베이스 연결을 연결하고 저장된 항목으로 GTT의 데이터를 보여주었습니다. . –