我使用spring有多个数据源(迎合多个mysql dbs)并使用tomcat dbcp。我得到一些奇怪的例外,比如
问题我觉得可能是这个,需要每个人的投入:
我在jdbcTemplate
中定义了一个spring.xml
对象,在我需要触发的每个查询上,我调用jdbcTemplate.setDataSource()
来设置相应的数据源,然后使用simplejdbccall(jdbctemplate)
执行proc。
我是否应该同时定义多个jdbcTemplate
对象,即每个定义的数据源一个。我在jdbctemplate
上设置数据源并执行存储过程的bean定义为prototype
。
答案 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你是怎么做到的。
下面也可以提供帮助