您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

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

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

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

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

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

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

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