是否更好地在每个查询中实例化一个新的JdbcTemplate或在任何地方注入一个?

时间:2011-10-17 12:25:32

标签: java spring jdbc

我有一个Java库,我使用Spring的JDBC支持通过JDBC访问数据库。这个库大约包含我需要访问的每个表的DAO类,超过一百个。目前,每次我需要执行新查询时,我都会实例化一个新的JdbcTemplate或其变体之一。这被认为是好的做法还是我应该尽可能多地重用一个JdbcTemplate?我实际上已经在书籍或在线文档中看到了这两种方法的例子。

上下文是J2EE应用程序,但理想情况下,代码应该可以在不同的上下文中使用,例如在离线测试或命令行支持工具中。

3 个答案:

答案 0 :(得分:4)

注入一个,为什么还要实例化? (目前还不清楚你的意思是“通过Spring上下文实例化”还是“使用new实例化”。)

我见过的大多数样本都在配置中执行此操作,我甚至不确定我是否在演示/测试代码之外手动实例化它们。我认为手工制作没有什么好处,如果在Spring之外完成则为零。

答案 1 :(得分:3)

虽然创建一个新的JdbcTemplate没有太多开销,但没有太多意义。 JdbcDaoSupport类是一个用于处理基于JdbcTemplate的DAO的抽象类,它一致地允许每个DAO注入一个DataSource(并且覆盖底层实例化基于该DataSource的JdbcTemplate)或注入JdbcTemplate。既然你可以做任何一种,那么如果你想通过设置一个或多个以下属性来定制你的JdbcTemplate,那么你只会做后者:

  • FETCHSIZE
  • ignoreWarnings
  • maxRows进行
  • nativeJdbcExtractor
  • 的QueryTimeout
  • skipResultsProcessing
  • exceptionTranslator

对于这些属性的每个组合,您可能会有一个JdbcTemplate。所有这些都有默认值,因此只有在你要覆盖它们时才需要设置它们。根据DAO的多样性,您可能有一个或多个。或者在扩展JdbcDaoSupport的情况下,你可能没有,让每个DAO只将数据源包装在默认的JdbcTemplate底层。

答案 2 :(得分:0)

JdbcTemplate类的实例在配置后是线程安全的,因此您可以配置JdbcTemplate的单个实例,然后将此共享引用安全地注入多个DAO(或存储库)。有关详细信息:JdbcTemplate-idioms