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

Java GWT RPC:跨多个请求使用相同的数据库连接,java,database,gwt,servlets,rpc,Java,Database,Gwt,Servlets,Rpc,我正在开发一个数据库的web前端。目的是创建一个学生可以用来学习SQL、发出查询和查看结果的工具。在此之前,我一直在使用CLI。它的主要缺点是:(1)现在的学生更习惯于GUI;b)当查询返回一个非常宽的表时,很难读取,因为它会环绕。我的web GUI旨在解决这些缺陷 我使用GWT作为客户端前端和PostgreSQL数据库后端。GWT通过Jetty或Tomcat托管的Javaservlet容器与数据库通信 使用GWT RPC机制发出简单的查询非常简单。不过,我一直在思考如何处理长期交易。为了让学生

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

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

使用GWT RPC机制发出简单的查询非常简单。不过,我一直在思考如何处理长期交易。为了让学生更好地理解事务的行为,我需要他们能够发出BEGIN语句,然后发出一个或多个查询,然后提交或回滚。我希望它们能够手动发出BEGIN/COMMIT/ROLLBACK语句,这意味着事务可以处于活动状态长达几分钟

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

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

恐怕我对Java servlet有点陌生,所以我有几个问题

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

其次,我考虑创建一个轻量级的服务器进程,servlet与之通信。服务器进程将会话ID与活动数据库连接相匹配,并将客户端连接到相应的数据库连接。因此,轻量级服务器会维护数据库连接本身,并一直保持到用户注销为止——就像CLI一样。类似的东西已经存在了吗?

Java servlet为每个用户会话保留一个对象。每个会话对象都有一个字符串键控映射,您可以使用该映射将任意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();