【问题标题】:How to get current Connection object in Spring JDBC如何在 Spring JDBC 中获取当前的 Connection 对象
【发布时间】:2012-01-15 17:26:46
【问题描述】:

如何获取 Oracle 数据库的当前 Connection 对象?我在 Spring 3.0.5 中使用 JDBC 模块。

【问题讨论】:

    标签: java oracle spring jdbc


    【解决方案1】:

    DataSource bean 中获取Connection

    您可以通过使用 Spring 依赖注入将其注入到您的 bean 中来访问数据源,或者通过静态访问 ApplicationContext

    DataSource ds = (DataSource)ApplicationContextProvider.getApplicationContext().getBean("dataSource");
    Connection c = ds.getConnection();
    

    【讨论】:

    • 但它不会返回当前连接,而是返回新连接。我需要返回当前连接。情况是:我创建了连接,我需要它在另一个地方使用但在同一个连接中
    • 你是如何创建连接的?请粘贴源代码。
    • 我使用 Spring JDBC 模板实例创建了连接
    • JDBCTemplate 每次运行其方法之一时都会在内部使用DataSourceUtils.getConnection()。它没有保留对上次使用的连接的引用,所以我认为没有办法获取它。
    • @vlcik 请分享。
    【解决方案2】:

    使用DataSourceUtils.getConnection()

    它返回与当前事务关联的连接,如果有的话。

    【讨论】:

    • 我不使用事务。您上面的一段代码创建了另一个连接实例,这对我来说是个问题。我需要我较早创建的当前实例
    • @user330847:如果是这样,你所说的“当前连接”是什么意思,你到底想实现什么?
    • 我要调用Oracle存储过程。我通过创建 JDBC 模板实例成功创建了连接。之后我执行可调用语句并返回结果集。现在,我想解析结果集并将其映射到值对象。在这个解析过程中,我需要获取开始时创建的连接。此连接是“当前连接”。我不知道如何获得这个当前连接
    • @user330847:如果您不需要共享与该连接关联的事务,为什么还需要相同的连接?
    • 这个方法在 Spring 5 中不存在。
    【解决方案3】:

    只是一个信息: 我使用的是Spring JDBC Template,它为我保存了当前的连接对象,可以如下接收。

    Connection con;
    con = getJdbcTemplate().getDataSource().getConnection();
    

    【讨论】:

    • 对于那些可能不知道的人,JdbcTemplate 可以很容易地作为字段注入:@Autowired JdbcTemplate jdbcTemplate;
    • conn使用后必须关闭,否则需要创建spring事务并使用DataSourceUtils.getConnection()
    【解决方案4】:

    我不确定最初发布此问题时是否可以使用此方法,但是,在最新版本的 Spring 中执行此操作的首选方法似乎是使用 JdbcTemplatePreparedStatementCreator。请参阅https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#query-org.springframework.jdbc.core.PreparedStatementCreator-org.springframework.jdbc.core.PreparedStatementSetter-org.springframework.jdbc.core.ResultSetExtractor- 或任何其他将PreparedStatementCreator 作为第一个参数的query 方法:

    jdbcTemplate.query(con -> {
      // add required logic here
      return con.prepareStatement("sql");
     }, rs -> {
           //process row
    });
    

    与其他提供的答案相比,这具有优势(DataSourceUtils.getConnection()jdbcTemplate.getDataSource().getConnection(),因为 分配了新连接,它使用与调用任何其他 @ 相同的连接管理987654329@ 查询方法。因此您也不必担心关闭/释放连接,因为 spring 会处理它。

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多