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

обновление: кажется, я ошибался в этой информации, по крайней мере, я не мог найти эту функциональность в C3P0.