GWT RPC:跨多个请求使用相同的数据库连接

时间:2010-07-05 22:58:21

标签: java database gwt servlets rpc

我正在开发一个数据库的Web前端。目的是创建一个学生可以用来学习SQL,发出查询和查看结果的工具。在此之前,我一直在使用CLI。它的主要缺点是:a)学生们现在更习惯于GUI;和b)当查询返回一个非常宽的表时,它很难读,因为它包装。我的Web GUI旨在解决这些不足之处。

我使用GWT作为客户端前端和PostgreSQL数据库后端。 GWT通过Jetty或Tomcat托管的Java servlet容器与数据库通信。

使用GWT RPC机制发出简单查询很容易。不过,我仍然坚持如何处理长期交易。为了让学生更好地理解事务的行为方式,我需要它们能够发出BEGIN语句,然后发出一个或多个查询,然后发出COMMIT或ROLLBACK。我希望他们手动发出BEGIN / COMMIT / ROLLBACK语句,这意味着事务可以激活多达几分钟。

(这不是一个高性能的数据库服务器。它是一个教学工具,所以我重视用户体验而不是速度。)

为了实现这一点,我需要确保通过整个事务,客户端将附加到同一个数据库连接。使用传统(无状态)技术,数据库连接要么是短暂的,要么是池化的。因此,人们永远无法确定将在多个查询中使用相同的数据库连接。

我担心我对Java servlet有点新意,所以我有几个问题。

首先,是否存在打开数据库连接并在整个用户会话中使用它的现有机制?

其次,我正在考虑创建servlet与之通信的轻量级服务器进程。服务器进程将会话ID与活动数据库连接匹配,并将客户端附加到适当的客户端ID。因此,轻量级服务器本身维护数据库连接并持续到用户注销 - 就像CLI一样。这样的事情是否已经存在?

1 个答案:

答案 0 :(得分:3)

Java servlet为每个用户会话保留一个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();