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

Nic*_*tti 8 java spring jdbc

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

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

Dav*_*ton 7

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

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

  • 回答我自己,[来自文档](http://static.springsource.org/spring/docs/current/spring-framework-reference/html/jdbc.html):* JdbcTemplate 类的实例一旦配置就是线程安全的。这很重要,因为这意味着您可以配置 JdbcTemplate 的单个实例,然后将此共享引用安全地注入多个 DAO(或存储库)。JdbcTemplate 是有状态的,因为它维护对 DataSource 的引用,但此状态不是会话状态。* (7认同)

Bil*_*ras 6

虽然创建一个新的 JdbcTemplate 没有太多的开销,但没有什么意义。JdbcDaoSupport 类,一个用于处理基于 JdbcTemplate 的 DAO 的抽象类,始终允许每个 DAO 注入一个数据源(并且在幕后实例化一个基于该数据源的 JdbcTemplate)或注入一个 JdbcTemplate。由于您可以执行任一操作,因此如果您希望通过设置以下一个或多个属性来自定义 JdbcTemplate,则只能执行后者:

  • 取大小
  • 忽略警告
  • 最大行数
  • 本机Jdbc提取器
  • 查询超时
  • 跳过结果处理
  • 异常翻译器

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