6

Может ли кто-нибудь объяснить, как можно использовать готовый пул соединений с использованием dbcp? (с некоторым примером, если это возможно). Я выяснил, как включить его - передача KeyedObjectPoolFactory в PoolableConnectionFactory. Но как следует определять конкретные подготовленные заявления после этого? Прямо сейчас я использую PoolingDataSource для получения соединений из пула. Как использовать подготовленные заявления из пула?Использование пула PreparedStatement в dbcp

+0

Что вы передаете для KeyedObjectPoolFactory? Для конструктора GenericKeyedObjectPoolFactory требуется KeyedPoolableObjectFactory, и я не вижу, как создать один из тех, для которых будет использоваться Connection PreparedStatement. – 2012-08-11 19:50:43

ответ

6

Хорошо, говоря о получении соединения от пула против получения «не объединенного» соединения, есть ли у вас какие-либо изменения в вашем коде :)? Держу пари, что нет. То же самое с подготовленными заявлениями. Ваш код не должен меняться. Таким образом, для этого нет полезного примера кода.

Вы должны прочитать документы для реализации JDBC Datasource и посмотреть, что разработчики должны сказать о пуле. Нет другого источника надежной информации об этом.

От here: Этот компонент также имеет возможность объединения PreparedStatements. При включенной пул заявления будет создана для каждого соединения и PreparedStatements, созданного одним из следующих способов будут объединено:

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

Таким образом, вы просто продолжать использовать вызов prepareStatement() и ваш ДБХП будет теоретически заботиться о пул (т. е. если вы пытаетесь создать «select * от пользователей u, где u.name like: id», он попытается найти это заявление в пуле вначале)

+0

Действительно? Тогда почему у PoolableConnectionFactory есть параметр для объединения команд? Очевидно, должен быть какой-то способ настроить его. Apache - как обычно - не помогает. – sproketboy 2011-05-13 19:59:18

+0

@ Dan: Не забудьте расширить свой комментарий? С какой частью моего ответа вы не согласны? Если вы снова прочитаете вопрос, автор уже знает, как включить объединение для операторов. Он задается вопросом об изменениях, которые ему необходимо внести в код, если таковые имеются. – 2011-05-15 14:28:20

1

Вот базовый код, который я использую.

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); 
0

Дело в том, если вы используете один Connection, он кэширует PreparedStatement сек, хотите ли вы этого или нет, единственно возможный способ воздействия на это, чтобы использовать DataSource свойства или использовать конкретный производитель API. Но эти утверждения не видны другими подключениями, и если вы подготовите одно и то же заявление с использованием другого соединения, оно снова заново создаст его. Таким образом, пулы соединений, такие как DBCP под капотом, позволяют повторно использовать между различными соединениями (он использует интерфейс PooledConnection вместо простого Connection), они отслеживают все утверждения, подготовленные всеми соединениями.

UPDATE: похоже, что я был не прав в этой информации, по крайней мере, я не смог найти эту функцию в C3P0.