1

Java アプリケーションでデータベース接続を作成する最良の方法は何ですか? シングルトン、静的メソッド、サービス ロケータ、接続プールなどを使用していますか?

上記の各アプローチの長所と短所を教えてください。

4

3 に答える 3

3

接続を処理するには、次の 2 つの方法があります。

  • リクエストごとに 1 つの接続
  • 接続オンデマンド

リクエストごとに 1 つの接続とは、プロセスの開始時に接続を取得し、最後にそれを返すことを意味します。これは、アプリケーションが同時に処理できる Web 要求の数が、使用可能なデータベース接続と同じ数だけであることを意味するため、Web 要求には適していません。ただし、必要な接続数が N 個だけであることがわかっているバッチ処理には適しています。

接続オンデマンドとは、db 呼び出しを実行しようとしているときに接続を取得し、db 呼び出しが終了するとすぐに接続を返すことを意味します。

どちらの場合も、接続プールを使用することをお勧めしますが、接続が返された後も接続を開いたままにしておく必要があるため、接続オンデマンド戦略では特に重要です。これは、接続を開くにはかなりのオーバーヘッドがあるためです。

一般に、接続プールを処理するには次の 2 つの方法があります。

  • コンテナ管理
  • アプリケーション管理

コンテナ管理とは、アプリケーション サーバーが JNDI を介して接続プールをアプリケーションに提供することを意味します。これは、JBoss が通常行うことです。そこにある場合は、このアプローチを使用することもできます。それ以外の場合は、アプリケーション マネージド プールを使用する必要があります。

ほとんどの DI フレームワークは、わずかな構成で接続プールを提供します。接続プールを使用することの重大な欠点は実際にはありません。Java で最も一般的な 2 つは DBCP と C3P0 で、どちらも非常に成熟したライブラリです。DI フレームワークを使用していない場合は、それらのライブラリの入門ガイドを確認し、提案されている内容を実装する必要があります。

于 2012-08-29T11:37:03.143 に答える
2

アプリが多くの接続で動作する場合は、接続プールを使用することをお勧めします。これはすでに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();
于 2012-08-29T11:25:50.907 に答える
0

ほとんどの Java アプリでは、接続プールを使用することほど重要ではありません。接続を手動で管理する代わりに接続プールを使用することで得られる利便性と利益と比較すると、あなたの質問は個人的な好みの問題です。

于 2012-08-29T10:55:23.973 に答える