1

我正在使用具有多个数据源(满足多个 mysql dbs)并使用 tomcat dbcp 的 spring。我得到了一些奇怪的例外,比如

  • 找不到过程 - 当 proc 肯定存在于数据库中时
  • 无法从池中借用 - 本地开发设置,所以池肯定没有满

我觉得可能是这个问题,需要大家的意见:

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

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

4

3 回答 3

5

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

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

当然,您可以将它们定义为prototype,但是如果您要DataSource手动注入,则没有多大意义。还不如JdbcTemplate使用new.

于 2011-01-14T15:07:12.247 回答
1

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

但是有一些像这样的间歇性错误:

org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetadata .... . . . 由 org.apache.tomcat.dbcp.dbcp.PoolingDataSource.checkConnection() 引起:连接已关闭。我没有看到此错误的模式。每个数据源的 initialSize 为 10,maxActive 为 100。关于这里可能出现什么问题的任何提示?

于 2011-01-16T18:53:21.100 回答
0

Spring 对动态切换数据源有一定程度的原生支持。这是关于如何做到这一点的文章。

下面也可以帮忙

  1. Hibernate、Spring 和多个数据源第 1 部分
  2. Hibernate、Spring 和多个数据源第 2 部分
于 2011-01-16T20:02:40.943 回答