Spring JDBC с Tomcat DBCP и несколькими источниками данных - PullRequest
0 голосов
/ 14 января 2011

Я использую Spring с несколькими источниками данных (обслуживая несколько MySQL базы данных) и использую tomcat dbcp.Я получаю некоторые странные исключения, такие как

  • процедура не найдена - когда процесс определенно присутствует в db
  • не может заимствовать из пула - локальная установка dev, поэтому определенно пул неfull

Проблема, которую я чувствую, может быть такой, мне нужны данные от всех:

У меня есть один jdbcTemplate объект, определенный в моем spring.xml, на каждый запрос, который мне нуженfire, я вызываю jdbcTemplate.setDataSource(), чтобы установить соответствующий источник данных, а затем использую simplejdbccall(jdbctemplate), чтобы выполнить процедуру.

Должен ли я также определить несколько jdbcTemplate объектов, т. Е. По одному для каждого определенного источника данных.Бин, из которого я устанавливаю источник данных для jdbctemplate и выполняю сохраненный процесс, определяется как prototype.

Ответы [ 3 ]

5 голосов
/ 14 января 2011

Вы, конечно, не должны использовать общий JdbcTemplate, если вы собираетесь продолжать изменять его DataSource. Установите DataSource один раз и оставьте его в покое.

Это означает либо несколько JdbcTemplate бинов, по одному для каждого DataSource, либо создание новых JdbcTemplate объектов вручную, по запросу, и не делитесь ими. Там нет значительных накладных расходов производительности при создании новых, делать это не проблема.

Вы можете определить их как prototype, конечно, но нет особого смысла, если вы собираетесь ввести DataSource вручную. Можно также создать экземпляр JdbcTemplate, используя new.

0 голосов
/ 16 января 2011

Spring имеет некоторый уровень встроенной поддержки для динамического переключения источников данных. Вот статья о , как вы это делаете.

Ниже также может помочь

  1. Hibernate, Spring и несколько источников данных, часть 1
  2. Hibernate, Spring и несколько источников данных, часть 2
0 голосов
/ 16 января 2011

Спасибо за ответ. Я преодолел эти ошибки, создавая новый экземпляр jdbctemplate каждый раз. Я также обновил до последней версии MySQL JConnector JSR (5.1.14) Дизайн класса теперь довольно прост. У меня есть базовый dao, который использует новый экземпляр специально написанной Spring JDBC-оболочки, которая, в свою очередь, создает экземпляр объекта JDBCTemplate в качестве переменной экземпляра. Эта переменная экземпляра используется в новом экземпляре SimpleJdbcCall для каждого запроса. все мои классы дао наследуют от этого базового дао.

Однако есть некоторые случайные ошибки, подобные этой:

org.springframework.jdbc.support.MetaDataAccessException: ошибка при извлечении DatabaseMetadata .... , , , вызванный : org.apache.tomcat.dbcp.dbcp.PoolingDataSource.checkConnection (): соединение закрыто. Я не вижу шаблон для этой ошибки. У меня есть initialSize 10 для каждого из источников данных и maxActive 100. Любые советы относительно того, что может быть проблемой здесь?

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