↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 7.4 / 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 7.1 已结束支持。 请参阅 当前版本手册.

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 都会创建一个后端进程。这取决于你和你的应用程序的需求。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.