2012-12-09 90 views
13

我想創建我的第一個連接池。我正在用Tomcat 7和MySQL DB創建一個Java Web應用程序,並且我想創建最簡單的連接池。 我看了幾篇教程,但對我來說並不是很清楚,所以我想讓你確認一下我是否做得很好。基本的數據庫連接池與Java和Tomcat 7

我寫了下面的類爲連接池管理器:

package dao.mysql; 

import java.sql.Connection; 
import java.sql.SQLException; 
import org.apache.tomcat.jdbc.pool.DataSource; 
import org.apache.tomcat.jdbc.pool.PoolProperties; 

public class MySQLConnectionPool { 

    private static DataSource datasource; 
    private static String driver = "com.mysql.jdbc.Driver"; 
    private static String url = "jdbc:mysql://localhost:3306/mydb"; 
    private static String username = "user"; 
    private static String password = "password"; 

    public MySQLConnectionPool() { 
     datasource = new DataSource(configurePoolProperties(driver, url, username, password)); 
    } 

    private PoolProperties configurePoolProperties(String driver, String url, String username, String password) { 
     PoolProperties properties = new PoolProperties(); 
     properties.setDriverClassName(driver); 
     properties.setUrl(url); 
     properties.setUsername(username); 
     properties.setPassword(password); 
     return properties; 
    } 

    public static synchronized Connection getConnection() { 
     Connection connection = null; 
     try { 
      connection = datasource.getConnection(); 
     } catch (SQLException ex) { 
      System.out.println("Error while getting a connection from the pool! \nSQL state:" + ex.getSQLState() + "\nMESSAGE" + ex.getMessage()); 
     } 
     return connection; 
    } 
} 

我不知道有關靜態性能也不同步

而且我不確定池中的「客戶端」類。據我所知,他們只得到使用

Connection con = MySQLConnectionPool.getConnection(); 

最後一個連接關閉使用

con.close(); 

這方面就是這樣? 此外,有沒有更簡單或更好的方法來做到這一點?

非常感謝!

回答

18

這是錯誤的做法。

Tomcat已經有連接池,您可以通過conf目錄中的context.xml沒有任何代碼進行配置和設置。

一旦定義了它,你需要做的就是在你的代碼中查找JNDI數據源。對所有這些進行硬編碼(並重新發明車輪)是一個非常糟糕的主意。

要了解如何配置JNDI數據源檢查了手冊:http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

Tomcat的手冊還提供瞭如何從池中獲取一個連接的例子:

InitialContext cxt = new InitialContext(); 
DataSource ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/dsname"); 

其中dsname是您在context.xml中提供的名稱

+0

DAO不管理*數據源,它只是*使用*它。您可能還想閱讀JavaEE教程:http://docs.oracle.com/javaee/6/tutorial/doc/bncjj.html –

+0

如果連接池被配置爲Tomcat中的JNDI DataSource和Resource的工廠屬性是'org.apache.tomcat.jdbc.pool.DataSourceFactory',從java類訪問數據源時的DataSource類型是什麼?我使用'org.apache.tomcat.jdbc.pool.DataSource',或者它應該是'javax.sql.DataSource'(後者是Resource的'type'屬性的值)? – Sefran2