是否有多个JdbcTemplate实例?

sti*_*vlo 20 java spring jdbctemplate

据我了解,无论是DataSourceJdbcTemplatesthreadsafe,那么您可以配置的一个实例JdbcTemplate,然后安全地注入该共享引用到多个DAO(或仓库).也DataSource应该是Spring单例,因为它管理连接池.

官方的Spring文档JdbcTemplate最佳实践解释了替代方案(手册的摘录用斜体,方括号之间的注释:

  • 在Spring配置文件中配置DataSource,然后将共享DataSource bean依赖注入到DAO类中; JdbcTemplate是在DataSource的setter中创建的.[使用XML配置,这导致多个JdbcTemplate实例,因为在数据源设置器中有new JdbcTemplate(dataSource)]
  • 使用组件扫描和注释支持依赖注入.在这种情况下,您使用@Repository注释该类(这使其成为组件扫描的候选者)并使用@Autowired注释DataSource setter方法.[也是这种情况导致多个JdbcTemplate实例]
  • 如果您正在使用Spring的JdbcDaoSupport类,并且您的各种JDBC支持的DAO类从它扩展,那么您的子类将从JdbcDaoSupport类继承setDataSource(..)方法.您可以选择是否继承此类.JdbcDaoSupport类仅为方便起见而提供.[因为你为每个扩展它的类都有一个JdbcDaoSupport实例,所以对于派生类的每个实例都有一个JdbcTemplate实例(参见JdbcDaoSupport的源代码)]

但是,稍后的说明会阻止刚刚提出的所有选项:

配置完成后,JdbcTemplate实例就是线程安全的.如果您的应用程序访问多个数据库(可能需要多个DataSource,以及随后多个不同配置的JdbcTemplates),您可能需要多个JdbcTemplate实例.

换句话说,刚才提出的所有选项都会导致有多个JdbcTemplate实例(每个DAO一个),并且在文档说明在使用单个数据库时不需要这样做.

我要做的是直接注入JdbcTemplate需要它的各种DAO,所以我的问题是,这样做是否可以?而且,您是否也认为Spring参考文档是自相矛盾的?还是我的误会?

avi*_*iad 4

IMO,将 JdbcTemplate 注入到您的(多个)DAO 中没有问题。当您需要运行数据库查询时,该模板用于将您的 DAO“连接”到物理资源(数据库连接)。因此,如果 SessionFactory 和 TransactionManager 配置正确,您将不会遇到并发问题 - Spring 管理与持久层一起工作所需的 Bean 的生命周期。使用模板的优点是:

  1. JDBC模板管理自动与数据库交互所需的物理资源,例如创建和释放数据库连接。
  2. Spring JDBC 模板将标准 JDBC SQLException 转换为 RuntimeException。这使您能够更灵活地对错误做出反应。Spring JDBC 模板还将供应商特定的错误消息转换为更容易理解的错误消息