2011-01-14 2 views
0

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

  • процедура не найдена - когда прок, безусловно, присутствует в БД
  • не может заимствовать у бассейна - локальные настройки разработчика, поэтому, безусловно, бассейн не полный

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

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

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

+0

Если вы не обеспечивают синхронизацию вокруг операций доступа к данным, когда вы меняете DataSource, это ужасно-нить небезопасно. –

ответ

5

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

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

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

0

Спасибо за ответ. Я прошел мимо этих ошибок, создавая новый экземпляр jdbctemplate каждый раз. Я также обновил последнюю версию mysql jconnector jsr (5.1.14) Дизайн класса теперь довольно прост. У меня есть базовое dao, которое использует новый экземпляр пользовательской написанной весной jdbc-оболочки, которая в свою очередь создает экземпляр объекта jdbcTemplate в качестве переменной экземпляра. Эта переменная экземпляра используется в новом экземпляре SimpleJdbcCall для каждого запроса. все мои классы dao наследуют эту базовую дао.

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

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

Смежные вопросы