从SpringJDBC获取java.sql.connection:getJdbcTemplate()

从SpringJDBC获取java.sql.connection:getJdbcTemplate(),java,sql,spring,connection,jdbctemplate,Java,Sql,Spring,Connection,Jdbctemplate,在我的应用程序中,我们试图从Spring获取java.sql.Connection Connection conn=DataSourceUtils.getConnection(this.getJdbcTemplate().getDataSource()); 我使用这个连接对象来设置prepare语句并执行查询以获得结果集 我知道,当我们使用jdbcTemplate时,打开连接、关闭连接等的负担由spring自己承担,我们不需要在代码中显式处理 但是在这种情况下我有点困惑,因为我们显式地从jd

在我的应用程序中,我们试图从Spring获取java.sql.Connection


Connection conn=DataSourceUtils.getConnection(this.getJdbcTemplate().getDataSource());

我使用这个连接对象来设置prepare语句并执行查询以获得结果集

我知道,当我们使用jdbcTemplate时,打开连接、关闭连接等的负担由spring自己承担,我们不需要在代码中显式处理

但是在这种情况下我有点困惑,因为我们显式地从jdbcTemplate获取连接对象,所以我们是否需要在代码中显式地处理连接关闭?我们正在使用连接池

提前谢谢


BD

这取决于您配置的数据源类型(在您的情况下,它是配置了连接池的数据源)因此,DatasourceUtils getConnection使用相同的数据源,因此您创建的连接对象将被池化,这意味着如果您在此连接对象上调用close,连接将不会实际关闭,而是返回到连接池,如上所述,这取决于您将如何获得连接关闭连接或将其返回池

然而,当您使用JbbcTemplate时,根本不需要处理连接,因为Spring将为您处理这一点

您应该定义一个行映射器来处理所有的结果集处理,然后在JdbcTemplate上调用适当的方法来为您执行该语句。然后,将显示Spring代码

  • 给你一个开放的连接
  • 对结果集执行查询过程
  • 使用行映射器将其映射到域对象
  • 关闭结果集
  • 关闭连接或将其返回池

请参阅其中详细解释了您必须做什么以及Spring为您做了什么。

如果您有jdbc模板,为什么要这样做?如果出于某种原因确实需要做一些低级工作,您可以使用
execute
,它会为您提供一个
ConnectionCallback
。实际上,这段代码是很久以前由其他人编写的,所以我不确定我们为什么要使用它。但作为重新分解的一部分,我在看这个代码我知道这一点,但我的疑问是我们是否需要显式地conn.close。事务完成后,连接是否会返回池,因为我们从JDBCTemplate获取了连接对象如果您使用Spring事务,则根据文档:-“connection conn=DataSourceUtils.getConnection(dataSource);如果现有事务已经有一个已同步(链接)的连接否则,方法调用将触发新连接的创建,该连接(可选)与任何现有事务同步,并可在该事务中进行后续重用。”因此无需显式conn.close,因为spring事务提交/回滚将负责释放到池的连接。