单例与原型 JdbcTemplate

Posted

技术标签:

【中文标题】单例与原型 JdbcTemplate【英文标题】:Singleton vs prototype JdbcTemplate 【发布时间】:2013-07-01 08:25:06 【问题描述】:

在 Spring 文档中,推荐使用 JdbcTemplate 的方法是为您在其中使用它的每个类创建 new 模板...

public class JdbcCorporateEventDao implements CorporateEventDao 

    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) 
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    


我想知道,与在上下文中将jdbctemplate 定义为单例并直接将其注入Dao 相比,此解决方案有什么优势

 public class JdbcCorporateEventDao implements CorporateEventDao 
        @Autowired
        private JdbcTemplate jdbcTemplate;

        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) 
            this.jdbcTemplate = jdbcTemplate;
        

    

【问题讨论】:

有点晚了,但我也很好奇。如果在 case1 中使用,它会生成与 DAO 一样多的 JdbcTemplate 实例,对吧?但在第二种情况下,将只有一个 JdbcTemplate 实例,因为 spring 默认将其 bean 管理为单例。因此,我认为第二种方式看起来要好得多。有没有办法像案例1一样使用JdbcTemplate? @JuneyoungOh JdbcTemplate 有一些属性会影响从给定实例执行的所有查询(例如setFetchSize(int fetchSize)setQueryTimeout(int queryTimeout) 等)因此,如果您使用其中之一并且需要针对不同部分的不同设置应用程序 - 您需要多个 JdbcTemplate 实例。 感谢您的解释。这是一个有用的答案,我没有考虑这些情况。祝你有美好的一天bb spring JdbcTemplate 和 sql-connection 之间有什么关联,如果有的话?有 4 个 JdbcTemplate 对象是否意味着我们已经与 sql server 建立了 4 个连接? @elMowgli JdbcTemplate 依赖于 DataSource - JdbcTemplate(DataSource dataSource)。通常 DataSource 充当连接池 - 例如当 JdbcTemplate 必须执行和 SQL 语句时,它从 DataSource(Pool) 获取一个连接,执行该语句,然后返回 Pool 中的连接。 【参考方案1】:

来自 JdbcTemplate 的类级文档:

 * Can be used within a service implementation via direct instantiation
 * with a DataSource reference, or get prepared in an application context
 * and given to services as bean reference.

两者都可以。这里我有一个大型应用程序(50 个 DAO,100 个并发用户),整个应用程序有一个 jdbcTemplate 对象,在 spring 上下文中定义。这很好用。

【讨论】:

【参考方案2】:

直接注入JdbcTemplate 的一个缺点是您是否需要/决定使用SQLExceptionTranslator

如果您的 JdbcTemplate 是单例,则在任何类中设置 SQLExceptionTranslator 会影响使用该模板的所有类。

例如...

public class JbdcUserDAO implements UserDAO

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public JbdcUserDAO() 
        this.jdbcTemplate.setExceptionTranslator(new UserSQLExceptionTranslator());
    

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) 
        this.jdbcTemplate = jdbcTemplate;
    


public class JdbcCompanyDAO implements CompanyDAO

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public JdbcCompanyDAO() 

    

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) 
        this.jdbcTemplate = jdbcTemplate;
    

通过JdbcCompanyDAO 提出的SQLExceptions 也将通过UserSQLExceptionTranslator 运行,即使看起来好像没有注册翻译。

【讨论】:

以上是关于单例与原型 JdbcTemplate的主要内容,如果未能解决你的问题,请参考以下文章

PHP:单例与静态类 [重复]

单例与多例的理解

如何使用 Swift 3 将单例与 Alamofire 一起使用?

@Component单例与并发

Java并发笔记——单例与双重检测

并发编程:单例与多线程