2010-03-01 21 views
12

我想使用與Java的聯合連接(因爲每個線程創建一個連接的代價很高),所以我使用的是MysqlConnectionPoolDataSource()對象。我堅持跨線程數據源。所以,我只使用一個數據源在整個這樣的應用程序:我正確使用Java PooledConnections嗎?

startRegistry(); // creates an RMI registry for MySQL 
    MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); 
    dataSource.setUser("username"); 
    dataSource.setPassword("password"); 
    dataSource.setServerName("serverIP"); 
    dataSource.setPort(3306); 
    dataSource.setDatabaseName("dbname"); 

    InitialContext context = createContext(); // Creates a context 
    context.rebind("MySQLDS", dataSource); 

現在,我有我的數據源創建的,我做的每個單獨的線程執行以下操作:

PooledConnection connect = dataSource.getPooledConnection(); 
    Connection sqlConnection = connect.getConnection(); 

    Statement state = sqlConnection.createStatement(); 

    ResultSet result = state.executeQuery("select * from someTable"); 
    // Continue processing results 

我猜我很困惑的是打電話給dataSource.getPooledConnection();
這是真的獲取一個彙集連接?這是線程安全嗎? 我注意到PooledConnection有像notify()和wait()這樣的方法......這意味着我不認爲它正在做我認爲它正在做的事情......

此外,何時以及如何釋放連接?

我想知道是否它會更有利於推出自己的產品,因爲那樣我會更加熟悉一切,但在這種情況下我並不想重新發明輪子。

Thanks SO

+0

所有Java類都有通知和等待,因爲它們是從java.lang.Object繼承的。但是,實際使用它們是非常罕見的。 –

+0

是的,我有點新的Java哈哈......我給它一個旋轉 – Polaris878

+0

這是一個來自Apache DBCP的例子:http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/ DOC/PoolingDataSourceExample.java?view = co –

回答

15

這不是正確的做法。數據源需要由正在運行應用程序的任何容器來管理。MysqlConnectionPoolDataSource而不是的連接池。這只是javax.sql.DataSource接口的具體實現。您通常在JNDI上下文中定義它並從那裏獲取它。另外,MySQL本身在their documentation中明確說明了這一點。

現在,如何使用它取決於應用程序的目的。如果它是一個Web應用程序,那麼你需要參考有問題的servletcontainer/appserver的JNDI資源文檔。如果它是例如Tomcat,那麼你可以找到它here。如果你正在運行一個客戶端應用程序 - 爲此我會高度質疑連接池的價值 - 那麼你需要尋找一個連接池框架,它可以利用MySQL提供的連接池數據源,例如C3P0

的另一個問題的代碼,你發佈的是,PooledConnection#getConnection()將返回底層連接,也就是這樣連接池。調用關閉它不會返回連接池,但只是真的關閉它。池必須每次創建一個新的連接。

然後是threadsafety的故事,這取決於真正的連接池問題。 C3P0已經證明了它的堅固性在幾年,你不要,只要你按照標準的成語寫JDBC代碼,即使用的JDBC接口,並獲得關閉所有資源(ConnectionStatementResultSet)擔心在儘可能最短的範圍內。

+0

它是一個RESTlet獨立應用程序...所以沒有應用程序服務器或JNDI – Polaris878

+0

然後使用C3P0。 – BalusC

+0

如果您爲任務使用PooledConnection,則C3P0對於可以放入一個類文件的內容來說是相當大的。 – Trejkaz