Singleton vs原型JdbcTemplate

时间:2013-07-01 08:25:06

标签: spring jdbc singleton spring-jdbc

在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;
        }

    }

2 个答案:

答案 0 :(得分:3)

来自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个并发用户),并且在spring上下文中定义了整个应用程序的一个jdbcTemplate对象。这很好。

答案 1 :(得分:1)

直接注入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;
    }
}
通过SQLException提出的{p> JdbcCompanyDAO也将通过UserSQLExceptionTranslator运行,即使它看起来没有注册翻译。