2012-06-04 39 views
0

在讀了一些servlet體系結構,tomcat機制和數據庫池之後,我想知道我是否真的應該在我的servlet的init中打開一個連接(並在destroy中關閉)? 我的目標是實現高性能,所以我想我應該使用連接池。 一開始我使用tomcat的內置數據庫池機制。建議在servlet的init()和destroy()中使用get/close DB連接嗎?

的context.xml

<Context> 
    <Resource name="jdbc/mytest" auth="Container" type="javax.sql.DataSource" 
    maxActive="100" maxIdle="30" maxWait="10000" 
    username="userxy" password="xy" driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost:3306/mytest"/> 
</Context> 

網站XML:

<resource-ref> 
    <description>MyTest</description> 
    <res-ref-name>jdbc/mytest</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

我確信我可以通過某事物easilly更換如果需要的話。 所以我的問題是:我應該使用而不是serlet的init()/ destroy()每個請求稱爲doGet()並信任池機制? 什麼,如果我同時使用?

+2

在servlet的生命週期中保持連接打開幾乎肯定是一個壞主意。 –

+0

你爲什麼不相信游泳池?這是有原因的,使用它。 – AngerClown

回答

2

如果你在Init中打開一個連接並在Destroy中關閉它,你幾乎肯定會遇到問題。

Servlets是多線程的。您只有一個servlet實例處理多個線程。

例如說你插入一條記錄,然後檢索last_insert_id()。如果你只有一個線程運行,它會正常工作。如果你有兩個或更多的線程在運行,你的一些線程將會得到錯誤的引用。

到目前爲止,最好的方法是根據請求從池中獲取連接,並在完成時在finally塊中釋放它。

+2

...在finally塊中。更好的是,將所有數據庫邏輯移動到一個單獨的類,以便更容易地重用它。 –

+0

正確,我會編輯我的答案以反映這 – Jaydee

+0

@Jaydee,與您的上述說法相反,我相信servlet init函數是線程安全的。 destroy()方法不一定和init()方法一樣乾淨。服務器調用在所有服務調用完成後或者經過一定的秒數之後(以先到者爲準)銷燬。這意味着其他線程可能會在調用destroy()方法的同時運行服務請求!所以一定要同步,和/或等待其他請求退出。 Sun的Servlet教程提供了一個如何使用引用計數來實現這個功能的例子。 – kroiz