2012-08-29 105 views
1

在Java應用程序中創建數據庫連接的最佳方式是什麼?使用單例,靜態方法,服務定位器,連接池還是其他?創建數據庫連接的最佳方式

請你讓我知道上述每種方法的優缺點嗎?

+0

對於連接池,您可以使用一些開箱即用的工具,如:http://commons.apache.org/dbcp/ – dbalakirev

回答

2

如果您的應用程序將與許多連接一起工作,那麼最好使用連接池。它已經在Java中實現,您可以輕鬆使用它。 這是使用Tomcat(如果你編寫web應用程序,你也可以使用Tomcat的游泳池,這將是更好)使用的Web應用程序池的例子

package usepool; 

import org.apache.tomcat.jdbc.pool.DataSource; 
import org.apache.tomcat.jdbc.pool.PoolProperties; 

/** 
* 
* @author brainless 
*/ 
public class ConnectionPool { 

private static DataSource datasource; 
public static String dbURL = "jdbc:mysql://localhost:3306/" 
       + "<YourDataBase>?useUnicode=true&useEncoding=true&characterEncoding=UTF-8"; 
public static String driverClass = "com.mysql.jdbc.Driver"; 
public static String userName = "root"; 
public static String password = "password"; 
public static boolean jmx = true; 
public static boolean testIdle = false; 
public static boolean testBorrow = true; 
public static boolean testReturn = false; 
public static int validationInterval = 30000; 
public static int timeBetweenEviction = 30000; 
public static int maxActive = 100; 
public static int initialSize = 10; 
public static int maxWait = 10000; 
public static int removeAbandonedTimeout = 60; 
public static int minEvictableIdle = 30000; 
public static int minIdle = 10; 
public static boolean logAbandoned = true; 
public static boolean removeAbandoned = true; 
public static String jdbcInterceptors = "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" 
     + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"; 

private ConnectionPool() { 
} 

public static synchronized DataSource getInstance() { 
    if (datasource == null) { 
     PoolProperties p = new PoolProperties(); 
     p.setUrl(dbURL); 
     p.setDriverClassName(driverClass); 
     p.setUsername(userName); 
     p.setPassword(password); 
     p.setJmxEnabled(jmx); 
     p.setTestWhileIdle(testIdle); 
     p.setTestOnBorrow(testBorrow); 
     p.setTestOnReturn(testReturn); 
     p.setValidationInterval(validationInterval); 
     p.setTimeBetweenEvictionRunsMillis(timeBetweenEviction); 
     p.setMaxActive(maxActive); 
     p.setInitialSize(initialSize); 
     p.setMaxWait(maxWait); 
     p.setRemoveAbandonedTimeout(removeAbandonedTimeout); 
     p.setMinEvictableIdleTimeMillis(minEvictableIdle); 
     p.setMinIdle(minIdle); 
     p.setLogAbandoned(logAbandoned); 
     p.setRemoveAbandoned(removeAbandoned); 
     p.setJdbcInterceptors(jdbcInterceptors); 
     datasource = new DataSource(); 
     datasource.setPoolProperties(p); 
    } 
    return datasource; 
} 

public static synchronized void closePool() { 
    if (datasource != null) { 
     datasource.close(); 
    } 
} 

}

這個類是單身。爲了讓你的代碼的連接,你需要使用這樣的

import usepool.ConnectionPool; 
/* 
* code 
*/ 
connect = ConnectionPool.getInstance().getConnection(); 
0

這在大多數Java應用程序中比使用連接池不那麼重要。與使用連接池而不是手動管理連接所帶來的便利和收益相比,您的問題更多的是個人偏好問題。

2

有2種方法來處理連接:每個請求

  • 一個連接
  • 點播
  • 連接

每個請求一個連接意味着您在流程開始時獲得連接,並在最後返回。這對於web請求來說不是一個好主意,因爲這意味着應用程序只能處理儘可能多的併發web請求,因爲有可用的db連接。 但是,對於批處理來說,這可能是一個好主意,你知道你只需要N個連接。

按需連接意味着當您打算進行數據庫調用時獲得連接,然後在db調用完成後立即返回它。

在這兩種情況下,建議使用連接池,但對於連接按需策略尤其重要,因爲您希望連接在返回後保持打開狀態,因爲打開連接時存在大量開銷。

通常有兩種方法來處理連接池:

  • 容器管理
  • 應用管理

容器管理意味着應用程序服務器提供的連接池,通過JNDI的應用程序。這是JBoss通常所做的。如果它在那裏,你可以使用這種方法。否則,您應該使用應用程序管理的池。

大多數DI框架將爲您提供一個連接池,並提供一些配置。 使用連接池確實沒有顯着的缺點。 java中最常見的兩種是DBCP和C3P0,它們都是非常成熟的庫。如果您不使用DI框架,您應該查看這些庫的入門指南並實施他們的建議。

相關問題