【发布时间】:2012-01-15 17:26:46
【问题描述】:
如何获取 Oracle 数据库的当前 Connection 对象?我在 Spring 3.0.5 中使用 JDBC 模块。
【问题讨论】:
如何获取 Oracle 数据库的当前 Connection 对象?我在 Spring 3.0.5 中使用 JDBC 模块。
【问题讨论】:
从DataSource bean 中获取Connection。
您可以通过使用 Spring 依赖注入将其注入到您的 bean 中来访问数据源,或者通过静态访问 ApplicationContext:
DataSource ds = (DataSource)ApplicationContextProvider.getApplicationContext().getBean("dataSource");
Connection c = ds.getConnection();
【讨论】:
DataSourceUtils.getConnection()。它没有保留对上次使用的连接的引用,所以我认为没有办法获取它。
使用DataSourceUtils.getConnection()。
它返回与当前事务关联的连接,如果有的话。
【讨论】:
只是一个信息: 我使用的是Spring JDBC Template,它为我保存了当前的连接对象,可以如下接收。
Connection con;
con = getJdbcTemplate().getDataSource().getConnection();
【讨论】:
JdbcTemplate 可以很容易地作为字段注入:@Autowired JdbcTemplate jdbcTemplate;
我不确定最初发布此问题时是否可以使用此方法,但是,在最新版本的 Spring 中执行此操作的首选方法似乎是使用 JdbcTemplate 和 PreparedStatementCreator。请参阅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 会处理它。
【讨论】: