Вопрос

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top