据我了解,DataSource
和 JdbcTemplates
都是 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 的生命周期。使用模板的优点是:
- JDBC 模板管理自动与数据库交互所需的物理资源,例如创建和释放数据库连接。
- Spring JDBC 模板将标准 JDBC SQLExceptions 转换为 RuntimeExceptions。这使您可以更灵活地对错误使用react。 Spring JDBC 模板还将供应商特定的错误消息转换为更易于理解的错误消息
关于java - 是否有多个 JdbcTemplate 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460507/