【发布时间】:2012-03-16 15:49:54
【问题描述】:
据我了解,DataSource 和JdbcTemplates 都是threadsafe,因此您可以配置JdbcTemplate 的单个实例,然后安全地将这个共享引用注入多个DAO(或存储库) 。还有DataSource应该是一个Spring单例,因为它管理着连接池。
官方Spring Documentation JdbcTemplate best practices解释了替代方案(手册摘录为斜体,方括号内是我的注释:
-
在你的 Spring 配置文件中配置一个 DataSource,然后将共享的 DataSource bean 依赖注入到你的 DAO 类中; JdbcTemplate 是在 DataSource 的设置器中创建的。 [使用 XML 配置,这会导致多个 JdbcTemplate 实例,因为在数据源设置器中有
new JdbcTemplate(dataSource)] - 为依赖注入使用组件扫描和注释支持。在这种情况下,您使用 @Repository 注释该类(这使其成为组件扫描的候选对象)并使用 @Autowired 注释 DataSource 设置方法。 [这种情况也会导致多个 JdbcTemplate 实例]
- 如果您使用 Spring 的 JdbcDaoSupport 类,并且您的各种 JDBC 支持的 DAO 类从它扩展,那么您的子类从 JdbcDaoSupport 类继承 setDataSource(..) 方法。你可以选择是否继承这个类。提供 JdbcDaoSupport 类只是为了方便。 [由于每个扩展它的类都有一个 JdbcDaoSupport 实例,因此派生类的每个实例也有一个 JdbcTemplate 实例(请参阅source code for JdbcDaoSupport)]
但是,稍后的说明不鼓励刚才提出的所有选项:
配置后,JdbcTemplate 实例是线程安全的。如果您的应用程序访问多个数据库,这需要多个 DataSource,并且随后需要多个不同配置的 JdbcTemplate,您可能需要多个 JdbcTemplate 实例。
换句话说,刚刚提出的所有选项都将导致拥有多个 JdbcTemplate 实例(每个 DAO 一个),并且就在文档说使用单个数据库时没有必要之后。
我要做的是直接将JdbcTemplate 注入到需要它的各种 DAO,所以我的问题是,这样做可以吗?而且,您是否也认为 Spring 参考文档是自相矛盾的?还是我的误会?
【问题讨论】:
-
每个数据库方案只使用一个数据源/jdbcTemplate
-
Spring 文档并不自相矛盾。您应该阅读前面的声明 - 无论您选择使用(或不使用)上述哪种模板初始化样式,每次执行 SQL 时都很少需要创建 JdbcTemplate 类的新实例。最佳实践是每个 dao 一个 JdbcTemplate。如果您只需要多个数据源,则需要多个 JdbcTemplates。
-
@stivlo 你还记得你最终做了什么吗?我处于类似的设计选择中,我认为每个 DAO 有 1 个
JdbcTemplate实例就足够了。但是你会看到类似这样的教程,他们在同一个 DAO vogella.com/tutorials/SpringJDBC/… 中使用多个JdbcTemplate实例 -
可能是因为
JdbcTemplate有几个setter 方法。 Spring 似乎有几个可变的 bean,可能会影响其他线程。当可以修改这些 bean 时,我认为共享JdbcTemplate和ObjectMapper之类的 bean 不是最佳做法。
标签: java spring jdbctemplate