单例与原型 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
提出的SQLException
s 也将通过UserSQLExceptionTranslator
运行,即使看起来好像没有注册翻译。
【讨论】:
以上是关于单例与原型 JdbcTemplate的主要内容,如果未能解决你的问题,请参考以下文章