Java 在每个查询中实例化一个新的JdbcTemplate,还是在任何地方都注入一个新的JdbcTemplate?

Java 在每个查询中实例化一个新的JdbcTemplate,还是在任何地方都注入一个新的JdbcTemplate?,java,spring,jdbc,Java,Spring,Jdbc,我有一个Java库,在这里我使用Spring的JDBC支持通过JDBC访问数据库。对于我需要访问的每个表,这个库大约包含一个DAO类,超过一百个。目前,每当我需要执行新的查询时,我都会实例化一个新的JdbcTemplate或它的一个变体。这被认为是一种良好的做法,还是应该尽可能地重用单个JdbcTemplate?事实上,我在书籍或在线文档中看到了这两种方法的示例 上下文是一个J2EE应用程序,但理想情况下,代码应该在不同的上下文中可用,例如在脱机测试或命令行支持工具中。注入一个,为什么要麻烦实例

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


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

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


我看到的大多数示例都是在配置中实现的,我甚至不确定我是否见过在演示/测试代码之外手动实例化它们。我认为手工操作没有什么好处,如果在Spring之外进行,则没有任何好处。

尽管创建新的JdbcTemplate不会带来太多开销,但也没有什么意义。JdbcDaoSupport类是一个抽象类,用于一致地处理基于JdbcTemplate的DAO,它允许每个DAO注入一个数据源(并在封面下基于该数据源实例化一个JdbcTemplate)或注入一个JdbcTemplate。由于您可以选择其中一种方法,因此只有在您希望通过设置以下一个或多个属性来自定义JdbcTemplate时,您才会选择后者:

  • 获取大小
  • 忽视警告
  • 麦克斯罗
  • nativeJdbcExtractor
  • 查询超时
  • 技能预处理
  • 例外转换器

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

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

我继承了此库,并且它已经以这种方式编写。请注意,继续实例化模板可能是一种不好的做法。我自己回答:一旦配置了JdbcTemplate类的实例,它就是线程安全的。这很重要,因为这意味着您可以配置JdbcTemplate的单个实例,然后将此共享引用安全地注入多个DAO(或存储库)。JdbcTemplate是有状态的,因为它维护对数据源的引用,但这种状态不是对话状态。@stivlo我错过了这一点,谢谢。我认为这就解决了问题。是的,一般都支持注入JdbcTemplate,它是线程安全的。如果您只想为一次调用微调属性(例如:fetchSize),和/或您已经有了用于其他目的的数据源,那么您可能希望通过new实例化,而不是添加额外的需要注入的JdbcTemplate依赖项。但是,如果您在多个位置使用具有相同属性的JdbcTemplate,并且不需要数据源,那么我将始终使用injection。您可以为要设置的每个特定属性集设置一个JdbcTemplate,并在需要时注入。