Пул подготовленных состояний JDBC для Scala - PullRequest
1 голос
/ 19 марта 2012

Я использую драйвер JDBC для Microsoft SQL Server 2012 (sqljdbc_4.0) и, хотя экземпляры Connection являются поточно-ориентированными, экземпляры Statement не выглядят (особенно PreparedStatement).

Я использую вызовы методов Scala .par.foreach для некоторых коллекций, которые затем выполняют PreparedStatement экземпляры. В настоящее время я создаю новые PreparedStatement экземпляры внутри закрытия .foreach для обработки каждого элемента, поскольку они не являются поточно-ориентированными.

Каждый из PreparedStatement запросов одинаков, для параметров вопросительного знака подставляются разные значения (?). Мне интересно, есть ли способ создать пул PreparedStatement экземпляров, равный по размеру числу потоков, используемых параллельной коллекцией, а затем просто повторно использовать один свободный для каждой итерации замыкания .foreach, возвращая их в бассейн после повторного использования.

1 Ответ

1 голос
/ 19 марта 2012

Несмотря на то, что соединение является поточно-безопасным , идиоматическим способом сделать это будет использование пула соединений, и каждый поток должен использовать отдельное соединение.

Это вызовет меньше конфликтов междупотоки через соединение и основной транспорт.Это также позволит базе данных на другом конце использовать разные рабочие потоки для каждого соединения.Вы получаете пропускную способность за счет памяти на стороне клиента с оговоркой о том, что вы все равно можете столкнуться с конкуренцией на уровне базы данных из-за фактических данных, если выполняете обновления одновременно.

Вы можете попробовать BoneCP , c3p0 или DBCP для объединения, все три широко используются.Они также позволяют настраивать пулы операторов и экономить на их повторной подготовке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...