31.9. 在一個多線程或服務器小應用(serverlet)環境裡使用驅動

許多 JDBC 驅動的一個共同問題是它們在任意時刻一個線程只能使用一個 Connection -- 否則可能一個線程在發送一個查詢而另一個線程正在接受結果, 而這樣做可能導致服務器的混亂。

PostgreSQL JDBC 驅動都是線程安全的。 所以,如果你的應用要使用多線程, 那麼你不必考慮任意時刻只允許一個線程使用數據庫的復雜算法。

如果一個線程在其他線程正在使用數據庫時試圖訪問數據庫, 那麼它將等到另一個線程完成當前操作之後進行。 如果這是一個普通的 SQL 語句, 那麼該操作就是發送該語句, 並檢索任何 ResultSet (完整的). 如果這是一個捷徑調用(例如: 從一個大對象裡讀取一個數據塊), 那麼這時就包含發送, 和接收該數據塊。

這對客戶端的大小應用都很好, 但是可能造成服務器端小應用 (servlets) 的性能問題。 如果你有好幾個線程執行查詢, 那麼它們除一個之外其它都是暫停的。 要解決這個問題,我們建議你創建一個聯接池。 (pool of Connections) 當一個線程需要使用數據庫,它向管理類請求一個 Connection。 管理器賦予該線程一個空閒聯接,然後把它標記為忙。 如果沒有空閒聯接,管理器就打開一個。 一旦線程完成數據庫使用,該線程把聯接返回給管理器, 管理器既可以關閉該聯接,也可以把它加到聯接池裡。 管理器同樣還檢查聯接是否仍然激活,如果聯接死亡了就把它從聯接池刪除。 缺點是這樣做增加了服務器端的負荷,因為對每個Connection都要創建一個會話。 選擇何種方式是你和你的應用的需求決定的。