↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.1 已于 2006 年 4 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

8.7. 在多线程(multi-threaded)或 servlet 环境中使用驱动 #

许多 JDBC 驱动的一个问题是,同一时刻只能 有一个线程使用一个 Connection —— 否则 一个线程可能在另一个线程接收结果时发送查询,这对数据库 引擎来说会是一件糟糕的事情。

PostgreSQL 6.4 为整个驱动带来了线程 安全性。(标准的 JDBC 在 6.3 中就是线程 安全的,但 Fastpath API 不是。) 因此,如果你的应用程序使用多个线程,你不必 担心用复杂的算法来确保同一时刻只有一个 在使用数据库。

如果一个线程在另一个线程正在使用连接时尝试 使用它,它会等到另一个线程完成其 当前操作。如果它是一条常规的 SQL 语句,那么该操作由发送语句和 检索任何 ResultSet(完整地)组成。如果它 是一次 Fastpath 调用(例如从一个 LargeObject 读取一个块),那么这就是发送 和取回该块的时间。

这对应用程序和 applet 来说没有问题,但对 servlet 可能造成 性能问题。对 servlet 来说,连接上可能承受 很重的负载。如果你有多个线程执行 查询,那么除一个之外每个线程都会暂停,而这可能 不是你想要的效果。

为了解决这个问题,建议你创建一个 连接池。每当一个线程需要使用数据库时,它向一个管理器 类请求一个 Connection。管理器 把一个空闲的连接交给该线程并把它标记为忙。如果没有 空闲连接可用,它就打开一个。一旦该线程 用完了连接,就把它归还给管理器, 管理器随后可以关闭它或者把它加入池中。管理器 还会检查连接是否仍然存活,如果已经 死掉就把它从池中移除。

因此,对 servlet 来说,是用单个连接还是连接池 由你决定。连接池的好处是线程不会受到单个 网络连接造成的瓶颈的 影响。缺点是它增加了服务器的 负载,因为每个 Connection 都会创建 一个后端进程。这取决于你和你的应用程序的 需求。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。