Spring 数据 jpa 和 JdbcTemplate - 我应该关闭连接吗?
Spring data jpa and JdbcTemplate - Should I close connection?
我应该关闭连接还是Spring会处理它?
@Autowired
MyRepository myRepository;
@Autowired
@Qualifier("myJdbc")
JdbcTemplate myJdbc;
@GetMapping("/v1/controlla-abilitazione")
public Set<String> controlloAbilitazione() {
try {
Connection conn = myJdbc.getDataSource().getConnection();
//Here I use previous connection to call an oracle PL/SQL via basic oracle jdbc
//Should I close connection?
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
(我知道我可以使用 Spring 来处理 PL/SQL,但是 Spring 没有对来自 [=16 的 return 的 Oracle Type 的原生支持=])
未尝试,但如果您从 Connection
对象执行 SQL 或 PL/SQL 查询,则不会使用 Spring JDBC 功能执行您的查询,因此您不应期望 Spring 会为您关闭连接。它不知道数据源提供者activity。
所以 Connection.close()
应该是必需的。
这是一个理论,但您可以很容易地检查它。将 Connection
存储在 bean 的一个字段中,并在方法的开头进行检查。
Connection conn;
@GetMapping("/v1/controlla-abilitazione")
public Set<String> controlloAbilitazione() {
if (conn != null && !conn.isClosed){
throw new RuntimeException("Oh it was not closed");
}
try {
conn = myJdbc.getDataSource().getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
现在一次又一次地调用你的控制器。如果你得到异常,你知道为什么。
我应该关闭连接还是Spring会处理它?
@Autowired
MyRepository myRepository;
@Autowired
@Qualifier("myJdbc")
JdbcTemplate myJdbc;
@GetMapping("/v1/controlla-abilitazione")
public Set<String> controlloAbilitazione() {
try {
Connection conn = myJdbc.getDataSource().getConnection();
//Here I use previous connection to call an oracle PL/SQL via basic oracle jdbc
//Should I close connection?
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
(我知道我可以使用 Spring 来处理 PL/SQL,但是 Spring 没有对来自 [=16 的 return 的 Oracle Type 的原生支持=])
未尝试,但如果您从 Connection
对象执行 SQL 或 PL/SQL 查询,则不会使用 Spring JDBC 功能执行您的查询,因此您不应期望 Spring 会为您关闭连接。它不知道数据源提供者activity。
所以 Connection.close()
应该是必需的。
这是一个理论,但您可以很容易地检查它。将 Connection
存储在 bean 的一个字段中,并在方法的开头进行检查。
Connection conn;
@GetMapping("/v1/controlla-abilitazione")
public Set<String> controlloAbilitazione() {
if (conn != null && !conn.isClosed){
throw new RuntimeException("Oh it was not closed");
}
try {
conn = myJdbc.getDataSource().getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
现在一次又一次地调用你的控制器。如果你得到异常,你知道为什么。