작성
·
304
0
DB 서버에 DB 클라이언트로 접근할 때는 JSESSIONID만 같으면 어떤 connection이든 같은 클라이언트로 여겨졌고 같은 트렌젝션을 가지게 되는 것 같았습니다.
세션은 서버의 메모리에 남아서 커넥션보다 더 긴 생명주기를 가지고 stateless한 접속들을 stateful하게 처리하기 위한 방법이니까, 엄밀하게 말하면 어플리케이션에 있는 connection도 다른 connection과 JSESSIONID만 공유하면 같은 DB 세션과 트렌젝션을 가질 수 있어야 한다고 생각합니다.
그런데 그런 것이 되지 않는 이유는 자바 스펙에서 connection이라는 객체가 connection 자체가 아니라 실제 connection들을 만들어주는, JSESSIONID를 보관하는 객체이기 때문이라는 생각이 들었습니다.
한 마디로 getConnection()해서 커넥션을 획득해서 close()할 때가지 실질적으로는 하나의 커넥션이 생성되는게 아니라 preparedStatement의 executeQuery()와 executeUpdate()가 실행되어 tcp 통신이 이루어질 때마다 커넥션이 만들어졌다가 사라지고, 그때 connection 객체에서 관리되는 JSESSIONID에 의해서 같은 트렌젝션으로 관리된다는 생각이 들었습니다. 그리고 close()가 하는 역할은 커넥션의 종료라기 보다는 DB서버에 있는 세션을 메모리에서 내리는 역할을 한다는 생각이 들었습니다.
이런 제 생각이 맞을까요?
답변 1
2
안녕하세요. 컴퓨터공부하자님
일반적으로 데이터베이스 커넥션은 JSESSIONID 같은 내용과는 전혀 무관합니다^^
이 부분은 H2 데이터베이스만의 아주 특별한 동작 방식입니다.
(H2 데이터베이스 웹 콘솔의 특별한 동작 방식으로만 이해하시면 됩니다. 웹 콘솔이 JSESSIONID가 같으면 같은 커넥션을 유지하는 것 같아요.)
그리고 H2 데이터베이스를 사용하더라도 JSESSIONID를 같이 사용하면 안됩니다.
너무 지엽적인 부분이기 때문에 내부 원리를 이해하는 것은 사실상 무의미합니다^^!
감사합니다.
감사합니다!