Java アプリケーションでデータベース接続を作成する最良の方法は何ですか? シングルトン、静的メソッド、サービス ロケータ、接続プールなどを使用していますか?
上記の各アプローチの長所と短所を教えてください。
Java アプリケーションでデータベース接続を作成する最良の方法は何ですか? シングルトン、静的メソッド、サービス ロケータ、接続プールなどを使用していますか?
上記の各アプローチの長所と短所を教えてください。
接続を処理するには、次の 2 つの方法があります。
リクエストごとに 1 つの接続とは、プロセスの開始時に接続を取得し、最後にそれを返すことを意味します。これは、アプリケーションが同時に処理できる Web 要求の数が、使用可能なデータベース接続と同じ数だけであることを意味するため、Web 要求には適していません。ただし、必要な接続数が N 個だけであることがわかっているバッチ処理には適しています。
接続オンデマンドとは、db 呼び出しを実行しようとしているときに接続を取得し、db 呼び出しが終了するとすぐに接続を返すことを意味します。
どちらの場合も、接続プールを使用することをお勧めしますが、接続が返された後も接続を開いたままにしておく必要があるため、接続オンデマンド戦略では特に重要です。これは、接続を開くにはかなりのオーバーヘッドがあるためです。
一般に、接続プールを処理するには次の 2 つの方法があります。
コンテナ管理とは、アプリケーション サーバーが JNDI を介して接続プールをアプリケーションに提供することを意味します。これは、JBoss が通常行うことです。そこにある場合は、このアプローチを使用することもできます。それ以外の場合は、アプリケーション マネージド プールを使用する必要があります。
ほとんどの DI フレームワークは、わずかな構成で接続プールを提供します。接続プールを使用することの重大な欠点は実際にはありません。Java で最も一般的な 2 つは DBCP と C3P0 で、どちらも非常に成熟したライブラリです。DI フレームワークを使用していない場合は、それらのライブラリの入門ガイドを確認し、提案されている内容を実装する必要があります。
アプリが多くの接続で動作する場合は、接続プールを使用することをお勧めします。これはすでにJavaで実現されており、簡単に使用できます。tomcatを使用するWebアプリでプールを使用するこの例(Webアプリを作成する場合は、Tomcatのプールも使用できます。より良いでしょう)
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();
ほとんどの Java アプリでは、接続プールを使用することほど重要ではありません。接続を手動で管理する代わりに接続プールを使用することで得られる利便性と利益と比較すると、あなたの質問は個人的な好みの問題です。