31.9. 在一个多线程或服务器小应用(serverlet)环境里使用驱动

许多 JDBC 驱动的一个共同问题是它们在任意时刻一个线程只能使用一个 Connection -- 否则可能一个线程在发送一个查询而另一个线程正在接受结果, 而这样做可能导致服务器的混乱。

PostgreSQL JDBC 驱动都是线程安全的。 所以,如果你的应用要使用多线程, 那么你不必考虑任意时刻只允许一个线程使用数据库的复杂算法。

如果一个线程在其他线程正在使用数据库时试图访问数据库, 那么它将等到另一个线程完成当前操作之后进行。 如果这是一个普通的 SQL 语句, 那么该操作就是发送该语句, 并检索任何 ResultSet (完整的). 如果这是一个捷径调用(例如: 从一个大对象里读取一个数据块), 那么这时就包含发送, 和接收该数据块。

这对客户端的大小应用都很好, 但是可能造成服务器端小应用 (servlets) 的性能问题。 如果你有好几个线程执行查询, 那么它们除一个之外其它都是暂停的。 要解决这个问题,我们建议你创建一个联接池。 (pool of Connections) 当一个线程需要使用数据库,它向管理类请求一个 Connection。 管理器赋予该线程一个空闲联接,然后把它标记为忙。 如果没有空闲联接,管理器就打开一个。 一旦线程完成数据库使用,该线程把联接返回给管理器, 管理器既可以关闭该联接,也可以把它加到联接池里。 管理器同样还检查联接是否仍然激活,如果联接死亡了就把它从联接池删除。 缺点是这样做增加了服务器端的负荷,因为对每个Connection都要创建一个会话。 选择何种方式是你和你的应用的需求决定的。