GWT RPC:跨多个请求使用相同的数据库连接
Posted
技术标签:
【中文标题】GWT RPC:跨多个请求使用相同的数据库连接【英文标题】:GWT RPC: Use same DB connection across multiple requests 【发布时间】:2010-07-05 22:58:21 【问题描述】:我正在开发数据库的 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 与活动的数据库连接匹配,并将客户端连接到适当的连接。因此,轻量级服务器自己维护数据库连接并一直持续到用户注销——就像 CLI 一样。类似的东西已经存在了吗?
【问题讨论】:
【参考方案1】: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();
【讨论】:
以上是关于GWT RPC:跨多个请求使用相同的数据库连接的主要内容,如果未能解决你的问题,请参考以下文章
登录期间的会话处理,并在 GWT 中防止 XSRF(跨站点请求伪造)