2013-07-01 5 views
1

В документации Spring рекомендуемый способ использования JdbcTemplate является создание new шаблон для каждого класса вы используете его в ...Singleton против прототипа JdbcTemplate

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

    } 
+0

Немного поздно, но мне также любопытно. Если используется в case1, он будет генерировать экземпляры JdbcTemplate столько же, сколько DAO, правильно? но во втором случае будет только один экземпляр JdbcTemplate, так как весна управляет своим bean-компонентом как singleton по умолчанию. По этой причине, я думаю, второй способ выглядит намного лучше. Есть ли способ использовать JdbcTemplate как case 1? –

+0

@JuneyoungOh JdbcTemplate имеет некоторые свойства, которые влияют на все запросы, выполняемые из данного экземпляра (например, 'setFetchSize (int fetchSize)', 'setQueryTimeout (int queryTimeout)' и т. Д.). Поэтому, если вы используете один из них и нуждаетесь в разных настройках для разных частей приложения - вам нужно несколько экземпляров JdbcTemplate. –

+0

Спасибо за объяснение. Это был полезный ответ, я не думал об этих случаях. Хороший день bb –

ответ

2

из документации класса уровня 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 для всего приложения, определенный в весеннем контексте. Это прекрасно работает.

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 s поднятые через JdbcCompanyDAO также будет проходить через UserSQLExceptionTranslator, даже если он выглядит не переводчик не зарегистрирован.

Смежные вопросы