dbcp を使用して準備された接続プールをどのように使用できるかを誰かが説明できますか? (可能であれば、いくつかのサンプルコードを添えて)。私はそれをオンにする方法を見つけました - KeyedObjectPoolFactory を PoolableConnectionFactory に渡します。しかし、その後、特定の準備済みステートメントをどのように定義する必要があるのでしょうか? 現在、プールから接続を取得するために PoolingDataSource のみを使用しています。プールから準備済みステートメントを使用するにはどうすればよいですか?
3 に答える
プールから接続を取得することと、「プールされていない」接続を取得することについてよく話していますが、コードに変更はありますか:)? 私はあなたがしないに違いない。準備済みステートメントと同じ方法。コードを変更しないでください。したがって、これに役立つコード例はありません。
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」を作成しようとしている場合、このステートメントを見つけようとします)。最初はプールで)
これが私が使用する基本的なコードです。
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);
問題は、単一の を使用する場合、必要かどうかに関係なく sConnection
をキャッシュすることです。これに影響を与える唯一の可能な方法は、プロパティを使用するか、ベンダー固有の API を使用することです。ただし、これらのステートメントは他の接続からは見えないため、別の接続を使用して同じステートメントを準備すると、再度作成されます。そのため、内部のDBCP のような接続プールでは、異なる接続間で s を再利用でき ( simple の代わりにインターフェイスを使用します)、すべての接続によって準備されたすべてのステートメントを追跡します。PreparedStatement
DataSource
PreparedStatement
PooledConnection
Connection
更新:この情報は間違っていたようです。少なくとも、C3P0 でこの機能を見つけることができませんでした。