2013-07-01 47 views
1

在Spring文檔使用的JdbcTemplate是創造每類new模板你...辛格爾頓VS原型的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中使用,它將生成與DAO一樣多的JdbcTemplate實例,對吧?但在第二種情況下,只會有一個JdbcTemplate實例,因爲Spring在默認情況下將其bean作爲單例管理。由於這個原因,我認爲第二種方式看起來好多了。有沒有辦法像案例1一樣使用JdbcTemplate? –

+0

@JuneyoungOh JdbcTemplate有一些屬性影響從給定實例執行的所有查詢(例如'setFetchSize(int fetchSize)','setQueryTimeout(int queryTimeout)'等等)。所以如果你使用其中的一個並且需要不同部分的不同設置的應用程序 - 您需要JdbcTemplate的多個實例。 –

+0

感謝您的解釋。這是一個有用的答案,我沒有考慮這些情況。祝你有美好的一天 –

回答

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對象,在spring上下文中定義。這工作正常。

1

直接注入JdbcTemplate的一個缺點是您需要/決定使用SQLExceptionTranslator

如果您的JdbcTemplate是單身人士,則在任何類別中設置SQLExceptionTranslator都會影響使用該模板的所有類。通過JdbcCompanyDAO提出

例如...

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旨意也通過UserSQLExceptionTranslator即使它看起來像沒有翻譯註冊運行。