历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.
31.9. 在多线程或 Servlet 环境中使用驱动 #
许多 JDBC 驱动的一个问题是,同一时刻只能有一个线程使用一个 Connection —— 否则一个线程可能在另一个线程接收结果时发送查询,这可能造成严重的混乱。
PostgreSQL JDBC 驱动是线程安全的。因此,如果你的应用程序使用多个线程,你不必担心用复杂的算法来确保同一时刻只有一个线程使用数据库。
如果一个线程在另一个线程正在使用连接时尝试使用它,它会等到另一个线程完成其当前操作。如果该操作是一条常规的
SQL 语句,那么该操作由发送语句和检索任何 ResultSet(完整地)组成。如果它是一次 fast-path 调用(例如从一个大对象读取一个块),那么它由发送和检索相应的数据组成。
这对应用程序和 applet 来说没有问题,但对
servlet 可能造成性能问题。如果你有多个线程执行查询,那么除一个之外每个线程都会暂停。为了解决这个问题,建议你创建一个连接池。每当一个线程需要使用数据库时,它向一个管理器类请求一个 Connection 对象。管理器把一个空闲的连接交给该线程并把它标记为忙。如果没有空闲连接可用,它就打开一个。一旦该线程用完连接,就把它归还给管理器,管理器随后可以关闭它或者把它加入池中。管理器还会检查连接是否仍然存活,如果已经死掉就把它从池中移除。连接池的缺点是它增加了服务器的负载,因为每个
Connection 对象都会创建一个新会话。这取决于你和你的应用程序的需求。