Использование пула PreparedStatement в dbcp
может кто-нибудь объяснить, как именно можно использовать подготовленный пул соединений с помощью 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);
дело в том, если вы используете один Connection
кэш,PreparedStatement
s Хотите вы этого или нет, единственный возможный способ повлиять на это-использовать DataSource
свойства или использовать API для конкретного поставщика. Но эти операторы не видны другими соединениями, и если вы подготовите тот же оператор, используя другое соединение, он воссоздаст его снова. Таким образом, пулы соединений, такие как DBCP под капотом, позволяют повторно использовать PreparedStatement
s между различными соединениями (он использует PooledConnection
интерфейс вместо просто Connection
), они отслеживают все заявления, подготовленные всеми соединениями.
обновление: кажется, я ошибался в этой информации, по крайней мере, я не мог найти эту функциональность в C3P0.