2010-07-05 2 views
1

데이터베이스의 웹 프런트 엔드에서 작업하고 있습니다. 그 목적은 학생들이 SQL을 배우고 질의를하고 결과를 볼 때 사용할 수있는 도구를 만드는 것입니다. 지금까지는 CLI를 사용했습니다. 그것의 주요한 단점은 a) 요즘 학생들은 GUI에 익숙하다. 그리고 b) 쿼리가 매우 넓은 테이블을 반환 할 때 랩핑 (wrap around)하기 때문에 읽기가 어렵습니다. 내 웹 GUI는 이러한 결함을 해결하기위한 것입니다.GWT RPC : 여러 요청에서 동일한 DB 연결 사용

저는 클라이언트 측 프론트 엔드와 GWT를 PostgreSQL 데이터베이스 백엔드로 사용하고 있습니다. GWT는 Jetty 또는 Tomcat이 호스팅하는 Java 서블릿 컨테이너를 통해 데이터베이스와 통신합니다.

간단한 쿼리를 실행하기 위해 GWT RPC 메커니즘을 사용하는 것만으로도 충분합니다. 하지만 오래 지속되는 트랜잭션을 처리하는 방법에 대해 고민하고 있습니다. 학생들이 트랜잭션이 어떻게 작동하는지 더 잘 이해하기 위해서는 BEGIN 문을 발행 한 다음 하나 이상의 쿼리를 발행하고 COMMIT 또는 ROLLBACK을 발행 할 수 있어야합니다. 나는 그들이 BEGIN/COMMIT/ROLLBACK 명령문을 손으로 발행하기를 원한다. 이것은 트랜잭션이 수분 동안 활성화 될 수 있음을 의미한다. 이를 구현하기 위해

(이것은 고성능 데이터베이스 서버 수 없습니다. 그것은 교육 도구, 그래서 내가 속도를 통해 사용자 경험을 소중하게 생각합니다.)

, 내가 통해 안심해야 전체 트랜잭션, 클라이언트는 동일한 데이터베이스 연결에 연결됩니다. 기존 (stateless) 기술을 사용하면 데이터베이스 연결이 단명 또는 풀링됩니다. 결과적으로 동일한 데이터베이스 연결이 여러 쿼리에서 사용된다는 것을 확신 할 수 없습니다.

저는 자바 서블릿에 조금 익숙하지 않기 때문에 몇 가지 질문이 있습니다.

데이터베이스 연결을 열고 전체 사용자 세션에서 사용하기위한 기존 메커니즘이 무엇입니까?

둘째, 서블릿과 통신하는 경량 서버 프로세스를 작성하려고했습니다. 서버 프로세스는 세션 ID를 활성 데이터베이스 연결과 일치시키고 클라이언트를 적절한 데이터베이스 연결에 연결합니다. 따라서 경량 서버는 데이터베이스 연결 자체를 유지하고 사용자가 로그 오프 할 때까지 지속됩니다 (CLI와 마찬가지로). 이 같은 것이 이미 존재합니까?

답변

3

Java 서블릿은 각 사용자 세션에 대해 HttpSession 개체를 유지합니다. 각 세션 객체에는 임의의 Java 객체 (예 : SQL 연결)를 세션에 연결하는 데 사용할 수있는 문자열 키 맵이 있습니다. 귀하의 경우에는 각 요청에 대해 다음과 같은 연결 개체를 검색합니다.

// getThreadLocalRequest is a member of GWT's RemoteServiceServlet 
HttpSession session = getThreadLocalRequest().getSession(); 
Connection connection = (Connection)session.getAttribute("connection"); 

if (connection == null) { 
    // I'll leave it to you to implement createConnection 
    final Connection c = createConnection(); 
    connection = c; 

    session.setAttribute("connection", connection); 
    session.setAttribute("expiryListener", new HttpSessionBindingListener() { 
     public void valueBound(HttpSessionBindingEvent e) {} 

     // This method will be called when the user's session expires 
     public void valueUnbound(HttpSessionBindingEvent e) { 
      c.close(); 
     } 
    }); 
} 

// connection is ready to use! 
Statement statement = connection.createStatement();