-1

こんにちは、データベース接続プールを作成しようとしています。以下の方法は正しいですか。

public Connection getMySQLConnection(){
            Connection conn = null;

            String url = "jdbc:mysql://" +  Config.getInstance().getProperty("DB_SERVER_HOST") + ":" + Config.getInstance().getProperty("DB_SERVER_PORT") + "/" + Config.getInstance().getProperty("DB_NAME");


            try {
                poolConn = new DbPool("com.mysql.jdbc.Driver", url, Config.getInstance().getProperty("DB_USERNAME"), Config.getInstance().getProperty("DB_PASSWORD"));
            } catch (SQLException e) {
                LOGGER.error("error while creating the connection pool : "+e);

            }
            try {
                conn = poolConn.getConnection();
            } catch (SQLException e) {
                LOGGER.error("Error while getting connection from db pool"+e);

            }
            return conn;
    }

これは、私のカスタム DbPool クラスのコンストラクターです。上記のコードでは、このクラスのオブジェクトを作成しています。

public DbPool(String classname, String url, String username,
            String password) throws java.sql.SQLException {
        try {
            Class.forName(classname).newInstance();
        } catch (Exception e) { // Catch any exception from JDBC driver failure
           LOGGER.error("Failed to load JDBC driver: "+classname
                               +", Exception: "+e);
        }

        maxConnections = defaultMaxConnections;
        timeout = defaultTimeout;
        if (DEBUG) {
            maxConnections = debugDefaultMaxConnections;
            timeout = debugDefaultTimeout;
        }
        totalConnections = 0;
        freeList = new java.util.LinkedList<DBPoolConnection>();
        busy = new java.util.HashMap<Connection, DBPoolConnection>();
        this.url = url;
        connectionProperties = new java.util.Properties();
        if (username == null) LOGGER.info("ERROR: Null JDBC username");
        else connectionProperties.setProperty("user",username);
        if (password == null) LOGGER.info("ERROR: Null JDBC password");
        else connectionProperties.setProperty("password",password);
    }
4

2 に答える 2

1

Pascal Thiventは、Java で接続プールを作成するための Need Codeについて次のように書いています。

Java で接続プールを作成するコードが必要ですか?

質問が何であるかわからないが、さらに別の接続プールを作成しないでください。C3P0、Apache DBCP、Proxool、または BoneCP (その分野の新しいプレーヤー) などの既存のソリューションを使用してください。C3P0 を使用します。

接続プールが既に使用されている同じオブジェクトを返さないようにするにはどうすればよいでしょうか?

接続がプールから借用され、まだ返されていない場合、その接続はプール内になく、プールの別のクライアントに割り当てることができないためです (リソースは、返されるまでプールから削除されます)。

接続プールから取り出した後にクライアントが接続を閉じた場合はどうなりますか?

クライアントがプールから取得する接続は、実際には java.sql.Connection ではなく、一部のメソッドの動作をカスタマイズする java.sql.Connection のラッパー (プロキシ) です。close() メソッドはその 1 つで、Connection インスタンスを閉じずにプールに返します。

このリンクもチェックしてください

于 2013-10-08T09:51:29.947 に答える
1

完全に間違っています。getMySQLConnection メソッドが呼び出されるたびにプールを作成するのはなぜですか。プールは一度作成する必要があり、getMySQLConnection が呼び出されたら、プールから接続を取得し、接続が有効かどうかを確認してから、接続を返します。

自分で作成する代わりに、boneCP、DBCP、C3P0 などのサード パーティの接続プールを使用することをお勧めします。

接続プールを作成する前に、多くのパラメータを考慮する必要があります

于 2013-10-08T09:16:21.843 に答える