Использование пула PreparedStatement в dbcp - PullRequest
6 голосов
/ 11 ноября 2008

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

Ответы [ 3 ]

6 голосов
/ 12 ноября 2008

Ну, если говорить о получении соединения из пула, а не о подключении "без пула", есть ли у вас какие-либо изменения в вашем коде :)? Бьюсь об заклад, вы не делаете. То же самое с подготовленными заявлениями. Ваш код не должен меняться. Таким образом, нет полезного примера кода для этого.

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

С здесь : Этот компонент также имеет возможность объединять PreparedStatements. Когда этот параметр включен, пул операторов будет создаваться для каждого соединения, а PreparedStatements, созданные одним из следующих методов, будут объединены:

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

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

0 голосов
/ 12 августа 2011

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

ОБНОВЛЕНИЕ: Кажется, я ошибся в этой информации, по крайней мере, я не смог найти эту функцию в C3P0.

0 голосов
/ 16 мая 2011

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

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