6

dbcp を使用して準備された接続プールをどのように使用できるかを誰かが説明できますか? (可能であれば、いくつかのサンプルコードを添えて)。私はそれをオンにする方法を見つけました - KeyedObjectPoolFactory を PoolableConnectionFactory に渡します。しかし、その後、特定の準備済みステートメントをどのように定義する必要があるのでしょうか? 現在、プールから接続を取得するために PoolingDataSource のみを使用しています。プールから準備済みステートメントを使用するにはどうすればよいですか?

4

3 に答える 3

7

プールから接続を取得することと、「プールされていない」接続を取得することについてよく話していますが、コードに変更はありますか:)? 私はあなたがしないに違いない。準備済みステートメントと同じ方法。コードを変更しないでください。したがって、これに役立つコード例はありません。

JDBC データソースの実装に関するドキュメントを読んで、開発者がプーリングについて何と言っているかを確認してください。これに関する信頼できる情報源は他にありません。

ここから: このコンポーネントには、PreparedStatements をプールする機能もあります。有効にすると、接続ごとにステートメント プールが作成され、次のいずれかの方法で作成された PreparedStatements がプールされます。

* public PreparedStatement prepareStatement(String sql)
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

したがって、prepareStatement() 呼び出しを使い続けるだけで、理論的には dbcp がプーリングを処理します (つまり、「select * from users u where u.name like :id」を作成しようとしている場合、このステートメントを見つけようとします)。最初はプールで)

于 2008-11-11T21:05:34.160 に答える
0

これが私が使用する基本的なコードです。

    GenericObjectPool connectionPool = new GenericObjectPool(null);
    connectionPool.setMinEvictableIdleTimeMillis(1000 * 60 * 30);
    connectionPool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 30);
    connectionPool.setNumTestsPerEvictionRun(3);
    connectionPool.setTestOnBorrow(true);
    connectionPool.setTestWhileIdle(false);
    connectionPool.setTestOnReturn(false);

    props = new Properties();
    props.put("user", username);
    props.put("password", password);
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, props);

    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true);
    PoolingDataSource dataSource = new PoolingDataSource(connectionPool);
于 2011-05-16T10:37:58.470 に答える
0

問題は、単一の を使用する場合、必要かどうかに関係なく sConnectionをキャッシュすることです。これに影響を与える唯一の可能な方法は、プロパティを使用するか、ベンダー固有の API を使用することです。ただし、これらのステートメントは他の接続からは見えないため、別の接続を使用して同じステートメントを準備すると、再度作成されます。そのため、内部のDBCP のような接続プールでは、異なる接続間で s を再利用でき ( simple の代わりにインターフェイスを使用します)、すべての接続によって準備されたすべてのステートメントを追跡します。PreparedStatementDataSourcePreparedStatementPooledConnectionConnection

更新:この情報は間違っていたようです。少なくとも、C3P0 でこの機能を見つけることができませんでした。

于 2011-08-12T09:59:24.787 に答える