首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个JdbcTemplate实例?

多个JdbcTemplate实例?
EN

Stack Overflow用户
提问于 2012-02-27 05:38:40
回答 3查看 18.4K关注 0票数 23

据我所知,DataSourceJdbcTemplates都是threadsafe,因此您可以配置单个JdbcTemplate实例,然后安全地将此共享引用注入多个DAO(或存储库)。另外,DataSource应该是singleton,因为它管理连接池。

官方的Spring文档JdbcTemplate最佳实践解释了备选方案(手册的节选用斜体字表示,我的注释放在方括号内:

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

然而,后面的一份说明不鼓励刚才提出的所有备选办法:

一旦配置完毕,JdbcTemplate实例就是线程安全。如果应用程序访问多个数据库(这需要多个JdbcTemplate,随后需要多个不同配置的JdbcTemplates ),则可能需要多个JdbcTemplates实例。

换句话说,刚才提供的所有选项都将导致多个JdbcTemplate实例(每个DAO一个),就在docs说在处理单个数据库时这是不必要的。

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

EN

回答 3

Stack Overflow用户

发布于 2012-02-27 07:45:10

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

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

Stack Overflow用户

发布于 2014-07-24 03:54:59

因此,应该有两种情况:

我们不改变DAO中的JdbcTemplate属性,我们可以定义如下:

代码语言:javascript
复制
<bean id="tlmJDBCTemplate" class="org.springframework.jdbc.core.JdbcTemplate"             <property name="dataSource" ref="plmTlmDataSource"/>        
    </bean>

注意:大多数时候我们不会更改JdbcTemplate属性,因为它是不必要的。

我们在DAO中改变JdbcTemplate属性,我们应该扩展JdbcDaoSupport。

代码语言:javascript
复制
State:
•   fetchSize: If this variable is set to a non-zero value, it will be used for setting the fetchSize property on statements used for query processing(JDBC Driver default)
•   maxRows: If this variable is set to a non-zero value, it will be used for setting the maxRows property on statements used for query processing(JDBC Driver default)
•   queryTimeout: If this variable is set to a non-zero value, it will be used for setting the queryTimeout property on statements used for query processing.(JDBC Driver default)
•   skipResultsProcessing: If this variable is set to true then all results checking will be bypassed for any callable statement processing.  This can be used to avoid a bug in some older Oracle JDBC drivers like 10.1.0.2.(false)
•   skipUndeclaredResults: If this variable is set to true then all results from a stored procedure call that don't have a corresponding SqlOutParameter declaration will be bypassed. All other results processing will be take place unless the variable {@code skipResultsProcessing} is set to {@code true}(false)
•   resultsMapCaseInsensitive: If this variable is set to true then execution of a CallableStatement will return the results in a Map that uses case insensitive names for the parameters if Commons Collections is available on the classpath.(false)
  1. JdbcDaoSupport 公共抽象类JdbcDaoSupport扩展了DaoSupport { 私有JdbcTemplate jdbcTemplate;/** *将JDBC DataSource设置为此DAO使用。*/公共最终无效setDataSource(DataSource dataSource) { if (this.jdbcTemplate == null this.jdbcTemplate.getDataSource dataSource != this.jdbcTemplate.getDataSource()) { this.jdbcTemplate = createJdbcTemplate(dataSource);initTemplateConfig();}

摘要:我不认为春天给导游的练习是最好的。

票数 1
EN

Stack Overflow用户

发布于 2020-07-07 03:03:16

这么多年之后,再看到这个问题,我想我们可以先用单例创建"Jdbc模板“,然后注入到DAO,所以它只是模板的一个实例。

代码语言:javascript
复制
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

然后,您可以将模板注入DAO或DAO扩展JdbcDaoSupport。

代码语言:javascript
复制
public final void setJdbcTemplate(JdbcTemplate jdbcTemplate)
{
   this.jdbcTemplate = jdbcTemplate;
   initTemplateConfig();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9460507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档