java - 是否有多个 JdbcTemplate 实例?

标签 java spring jdbctemplate

据我了解,DataSourceJdbcTemplates 都是 threadsafe,所以 您可以配置 的单个实例>JdbcTemplate 然后安全地将这个共享引用注入(inject)到多个 DAO(或存储库)中DataSource也应该是 Spring 单例,因为它管理连接池。

官方Spring Documentation JdbcTemplate best practices解释了替代方案(手册的摘录用斜体表示,方括号内是我的注释:

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

但是,稍后的说明不鼓励刚才提出的所有选项:

Once configured, a JdbcTemplate instance is threadsafe. You may want multiple JdbcTemplate instances if your application accesses multiple databases, which requires multiple DataSources, and subsequently multiple differently configured JdbcTemplates.

换句话说,刚刚提供的所有选项都将导致拥有多个 JdbcTemplate 实例(每个 DAO 一个),并且就在文档说使用单个数据库时没有必要之后。

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

最佳答案

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

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

关于java - 是否有多个 JdbcTemplate 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460507/

相关文章:

java - 在 Spring Boot 中使用 JSP 中的自定义标记文件

java - MySQL 在简单 INSERT 操作上非法混合排序规则 '='

java - 关闭 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping detectorHandlers

java - 在 Spring jdbc 中使用 jdbctemplate 返回 boolean 值

jdbc - 如何在 SimpleJdbcTemplate 上设置QueryTimeout?

spring - 迭代 ResultSet 时 JDBC 失去连接

java - 带有 @OneToMany 的随机 LazyInitializationException

Java将集合放入 map

java - 无法在带有未定义终止符的 channel 上接收 tcp(模式为服务器)消息

Spring-MongoDB geonear 不使用额外的字段