带有Tomcat DBCP的Spring JDBC和多个数据源

时间:2011-01-14 15:03:22

标签: java spring multiple-databases spring-jdbc

我使用spring有多个数据源(迎合多个mysql dbs)并使用tomcat dbcp。我得到一些奇怪的例外,比如

    找不到
  • 过程 - 当db明确存在于db
  • 中时
  • 无法从池中借用 - 本地开发设置,所以游泳池肯定不满

问题我觉得可能是这个,需要每个人的投入:

我在jdbcTemplate中定义了一个spring.xml对象,在我需要触发的每个查询上,我调用jdbcTemplate.setDataSource()来设置相应的数据源,然后使用simplejdbccall(jdbctemplate)执行proc。

我是否应该同时定义多个jdbcTemplate对象,即每个定义的数据源一个。我在jdbctemplate上设置数据源并执行存储过程的bean定义为prototype

3 个答案:

答案 0 :(得分:5)

如果您要继续更改其JdbcTemplate,则当然不应使用共享的DataSource。设置DataSource一次,不管它。

这意味着多个JdbcTemplate bean,每个DataSource一个,或者按需手动创建新的JdbcTemplate对象,并且不共享它们。创建新的没有显着的性能开销,这不是问题。

您可以将它们定义为prototype,当然,如果您要手动注入DataSource,则没有多大意义。也可以使用JdbcTemplate实例化new

答案 1 :(得分:0)

感谢您的回答。我通过每次创建一个新的jdbctemplate实例来克服这些错误。我也更新到最新的mysql jconnector jsr(5.1.14) 课程设计现在非常简单。我有一个基础dao,它使用自定义编写的spring jdbc包装器的新实例,该实例又将jdbcTemplate对象实例化为实例变量。此实例变量用于每个请求的SimpleJdbcCall的新实例。我所有的dao类都继承自这个基础dao。

然而,有一些像这样的间歇性错误:

org.springframework.jdbc.support.MetaDataAccessException:提取DatabaseMetadata时出错.... 。 。 。 引起的: org.apache.tomcat.dbcp.dbcp.PoolingDataSource.checkConnection(): 连接已关闭。 我没有看到这个错误的模式。我的每个数据源的初始大小为10。 maxActive为100.关于这里可能存在什么问题的任何提示?

答案 2 :(得分:0)

Spring对动态切换数据源有一定程度的原生支持。 Here is the article on你是怎么做到的。

下面也可以提供帮助

  1. Hibernate, Spring and multiple DataSources part 1
  2. Hibernate, Spring and multiple DataSources part 2