5.8. 在多线程或 servlet 环境中使用驱动 #
许多 JDBC 驱动的一个问题是,同一时刻只能有一个线程使用一个 Connection —— 否则一个线程可能在另一个线程接收结果时发送查询,这对数据库引擎来说会是一件糟糕的事情。
PostgreSQL JDBC 驱动是线程安全的。因此,如果你的应用程序使用多个线程,你不必担心用复杂的算法来确保同一时刻只有一个在使用数据库。
如果一个线程在另一个线程正在使用连接时尝试使用它,它会等到另一个线程完成其当前操作。如果它是一条常规的
SQL 语句,那么该操作由发送语句和检索任何 ResultSet(完整地)组成。如果它是一次 Fastpath 调用(例如从一个
LargeObject 读取一个块),那么这就是发送和取回该块的时间。
这对应用程序和 applet 来说没有问题,但对 servlet 可能造成性能问题。对 servlet 来说,连接上可能承受很重的负载。如果你有多个线程执行查询,那么除一个之外每个线程都会暂停,而这可能不是你想要的效果。
为了解决这个问题,建议你创建一个连接池。每当一个线程需要使用数据库时,它向一个管理器类请求一个 Connection。管理器把一个空闲的连接交给该线程并把它标记为忙。如果没有空闲连接可用,它就打开一个。一旦该线程用完了连接,就把它归还给管理器,管理器随后可以关闭它或者把它加入池中。管理器还会检查连接是否仍然存活,如果已经死掉就把它从池中移除。
因此,对 servlet 来说,是用单个连接还是连接池由你决定。连接池的好处是线程不会受到单个网络连接造成的瓶颈的影响。缺点是它增加了服务器的负载,因为每个 Connection 都会创建一个后端进程。这取决于你和你的应用程序的需求。