在Spring的JdbcTemplate中对数据库的操作进行了封装,具体的执行代码放在了这个类的execute()方法中。
首先,在JdbcTemplate.java中,对execute()方法进行了重载,有着好几个execute方法。
在下面这段代码中,我觉得值得学习的一个地方就是他的catch()部分。
一般的,只要在finally块中加入了数据库以及statement关闭代码即可,但是在这里,作者在catch块中也加入了数据库关闭代码,其理由就是,防止潜在的数据库连接池死锁。
之前做的项目,用数据库连接池发现无法释放连接,会不会就是这个原因呢? Maybe~
PS:这部分注释是源代码中自带的。
另外,从关闭Statement与Connection的方法名字就可以看出,他们的关闭原理其实是不一样的。Statement确实是关闭,而Connection是返回到数据库连接池之中。
//-------------------------------------------------------------------------
// Methods dealing with static SQL (java.sql.Statement)
//-------------------------------------------------------------------------
public Object execute(StatementCallback action) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Connection con = DataSourceUtils.getConnection(getDataSource());
Statement stmt = null;
try {
Connection conToUse = con;
if (this.nativeJdbcExtractor != null &&
this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
}
stmt = conToUse.createStatement();
applyStatementSettings(stmt);
Statement stmtToUse = stmt;
if (this.nativeJdbcExtractor != null) {
stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
}
Object result = action.doInStatement(stmtToUse);
handleWarnings(stmt);
return result;
}
catch (SQLException ex) {
// Release Connection early, to avoid potential connection pool deadlock
// in the case when the exception translator hasn't been initialized yet.
JdbcUtils.closeStatement(stmt);
stmt = null;
DataSourceUtils.releaseConnection(con, getDataSource());
con = null;
throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
}
finally {
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
分享到:
相关推荐
spring事务与数据库操作
本源码以简单易懂的方式,讲述了spring动态切换数据库的原理和做法,内附有指导文件,按照说明操作,即可实现spring的数据库动态切换
Spring.Net+Nhibernate多数据库操作示例代码
该demo包含spring boot 下使用jpa规范操作数据库的例子,包含同个项目多个数据库实例,存储过程操作,原始sql操作返回结果转换成DTO等例子。
spring boot mysql数据库操作
Hibernate是一款优秀的ORM框架,能够连接并操作数据库,包括保存和修改数据。Spring MVC是Java的web框架,能够将Hibernate集成进去,完成数据的CRUD。Hibernate使用方便,配置响应的XML文件即可。由于spring3.x,基于...
struts2 spring jpa操作数据库 级联数据 hibernate
struts2+spring+hibernate(实现XML和Annotation两种方式操作数据库) 项目描述: 框架及版本:struts2 + spring3.0 + hibernate3.3 所实现的功能说明 把两个对象存入到数据库中 1、一种方法采用XML文件映射的方式 2...
本项目为spring操作MySQL数据库的一个小例子,实现了数据库增删查改,外部jar包和数据库齐全,下载导入到eclipse运行即可
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二...
Spring Data JPA数据库操作教程.zip
spring-data-mongodb增强工具包,简化 CRUD 操作,提供类mybatis plus的数据库操作。传统关系型数据库及围绕它们构建的orm在项目开发中有很多难用的痛点,而mongodb这种文档性数据库的出现,完美的解决了sql数据库在...
NULL 博文链接:https://chenjingbo.iteye.com/blog/916577
spring famework 操作数据库使用jdbc示例代码
spring对多个数据库进行事务管理,配置分布式事务
在大数据量、高并发的场景下,批量更新数据库是一个常见的操作。然而,不同的批量更新方法可能带来截然不同的性能表现。 通过实际测试对比了Spring Boot中6种MySQL批量更新方式的效率,并详细记录了每种方法在处理...
国产数据库操作示例
基于Spring简化数据库操作的研究及应用,李涛,徐宁,随着Internet的发展,基于B/S架构开发的J2EE项目需要频繁的进行数据库操作。然而java提供的JDBC API过于复杂,代码过于冗余。本文主要是针
spring boot2+mybatis操作mysql数据库demospring boot2+mybatis操作mysql数据库demospring boot2+mybatis操作mysql数据库demo
作为Nosql家族的一员,图存数据库在推荐系统,社交关系等领域拥有广泛应用。本项目基于Spring-data-neo4j,整合图存数据库Noe4j, 实现增删改查的功能。主要功能包括: 1.基于spring-data-neo4j 3.2.0通过REST远程...