在Spring Boot中,jdbcTemplate在执行查询后是否会自动关闭连接一次? 在这种情况下,我正在使用jdbcTemplate(它连接到teradata)执行查询,但在执行查询后会话没有关闭。我该如何关闭会话?
这是我的dao文件 -
@Component
public class DDLReviewDao {
@Autowired
@Qualifier("devbJdbc")
private JdbcTemplate jdbcTemplate;
public static final Logger logger = LogManager.getLogger(DDLReviewDao.class);
public List<DDLObject> getDDLReviewData(DDLQuery ddlQuery) {
String selectSql = MacroGenerator.generateMacro(ddlQuery);
List<DDLObject> ddlObject = jdbcTemplate.query(selectSql, new DDLMapper());
logger.info(ddlObject);
return ddlObject;
}
}
答案 0 :(得分:1)
JdbcTemplate
从javax.sql.DataSource
实现获取其连接 - 将其传递给其构造函数link。
DataSource
可以基本(为每个请求创建Connection
个对象)或汇集(有连接池,只有&# 39;借用给定请求的一个用途。
因此,似乎连接没有关闭,因为您已将一些池数据源传递给名为JdbcTemplate
的{{1}}。如果您真的想要关闭所有打开的连接来执行devbJdbc
工作,您可以使用基本的JdbcTemplate
实施:DataSource
就像这样:
org.springframework.jdbc.datasource.SimpleDriverDataSource
答案 1 :(得分:0)
在Spring Boot中,jdbcTemplate不会关闭连接 在执行查询后自动执行一次?
它应该关闭连接还是将其返回到连接池(如果汇集了DataSource)?
public static void doReleaseConnection(Connection con, DataSource dataSource) throws SQLException {
if (con == null) {
return;
}
if (dataSource != null) {
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
if (conHolder != null && connectionEquals(conHolder, con)) {
// It's the transactional Connection: Don't close it.
conHolder.released();
return;
}
}
logger.debug("Returning JDBC Connection to DataSource");
doCloseConnection(con, dataSource);
}
和
public static void doCloseConnection(Connection con, DataSource dataSource) throws SQLException {
if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) {
con.close();
}
}
最有可能的是,如果汇集了DataSource实例,则会释放连接以供重用而不会关闭。
答案 2 :(得分:0)
根据spring boot docs,您可以为弹簧池分配最大连接数,如下所示:
@CrossOrigin
@RequestMapping(value = "/blaa/{startDate}/{endDate}", method = RequestMethod.GET)
public ResponseEntity<List<Nodes>> listsOfbla(@PathVariable Long startDate,
@PathVariable Long endDate) {
startEndDateRequestTotal.inc();
List<Nodes> listOfbla= NodesService.getFromToData(startDate, endDate);
LOG.info("GET Request was made with two paramaters ", startDate, endDate);
for (int i = 0; i < listOfbla (); i++) {
if (listOfbla(i).getStampm().equals(startDate)) {
for (int j = 0; j < listOfbla (); j++) {
if (listOfbla(j).getStampm().equals(endDate)) {
return new ResponseEntity<List<Nodes>>listOfbla HttpStatus.OK);
}
}
} else {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
}
if (listOfbla.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
LOG.info("Retruning Nodes objects from specified date");
return new ResponseEntity<List<Nodes>>(listOfbla, HttpStatus.OK);
}
这显然只适用于嵌入式网络服务器。如果要将其部署到类似Jboss的东西,则必须在Server配置文件中配置该属性。