Spring data jpa и JdbcTemplate - Должен ли я закрыть соединение?

Должен ли я закрыть соединение или 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 не имеет встроенной поддержки Oracle Type в качестве возврата из PL/SQL)


person Accollativo    schedule 20.02.2019    source источник
comment
Да, в этом случае вам следует закрыть соединение.   -  person krokodilko    schedule 20.02.2019


Ответы (1)


Не пробовал, но если вы выполняете запрос SQL или PL/SQL из объекта Connection, вы не используете функции Spring JDBC для выполнения вашего запроса, поэтому вам не следует ожидать, что Spring закроет соединение для вас. Он не знает об активности провайдера источника данных по этому поводу.
Так что, вероятно, необходимо указать Connection.close().

Это теория, но вы можете легко ее проверить. Сохраните Connection в поле компонента и выполните проверку в начале метода.

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;
}

Теперь вызовите свой контроллер один раз и еще раз. Если вы получите исключение, вы знаете, почему.

person davidxxx    schedule 20.02.2019