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

许多 JDBC 驱动的一个共同问题是它们在任意时刻一个线程只能使用一个联接 Connection) - 否则可能一个在发送一个查询而另一个线程正在接受结果, 这个现象对数据库引擎是一个很糟糕的事情.

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

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

这对客户端的大小应用都很好, 但是可能造成服务器端小应用 (servlets) 的性能问题. 对于 servlets, 你可能会有很沉重的联接负荷. 如果你有好几个线程执行查询, 那么它们每个都暂停可不是你想看到的.

要解决这个问题, 我们建议你创建一个联接池. (pool of Connections) 当一个线程需要使用数据库, 它向管理类请求一个 Connection. 管理器赋予该线程一个空闲联接, 然后把它标记为忙. 如果没有空闲联接, 管理器就打开一个. 一旦线程完成数据库使用, 该线程把联接返回给管理器, 管理器既可以关闭该联接, 也可以把它加到联接池里. 管理器同样还检查联接是否仍然激活, 如果联接死亡了就把它从联接池删除.

所以, 对于服务器端小应用 ( servlets ), 选择单联接还是联接池是你的责任. 使用联接池的优点是线程不会成为单个网络联接的瓶颈. 缺点是这样做增加了服务器端 的负荷, 因为对每个Connection都要创建一个后端进程. 选择何种方式是你和你的应用的需求决定的.