Не удается открыть новое соединение, потому что существующее соединение все еще находится в текущем потоке - ActiveJDBC
Я получаю эту ошибку Cannot open a new connection because existing connection is still on current thread
спустя некоторое время. Я думаю, что ошибка довольно очевидна. Мой код такой:
String mySQLUrl = "jdbc: postgresql: //" + dataLayer.PostgreSQL_Host + "/" + dataLayer.PostgreSQL_Database;
Base.open ("org.postgresql.Driver", mySQLUrl, dataLayer.getPostgreSQLUser (), dataLayer.getPostgreSQLPassword ());
Чтобы избежать этой ошибки, я хотел бы создать фабрику соединений, но для этого мне нужно знать, как проверить, открыто ли соединение (и все еще действует), и вернуть его, в противном случае, создать его. Есть что-то построенное или я должен использовать старый добрый try-catch?:|
1 ответ
Если вы получаете это исключение, то это означает, что у вас все еще есть соединение с текущим потоком при открытии нового. Этот тип кода может привести к утечке соединения, поэтому среда не позволяет вам сделать это.
На этой странице: http://javalite.io/database_connection_management объясняется, что модели находят соединение в текущем потоке.
Поскольку вы не предоставляете никакого контекста для своего приложения, я приведу несколько примеров.
Если это пакетное приложение (автономное приложение), вам нужно открыть соединение, использовать его и закрыть:
try(DB db = Base.open(...)){
// your code here
}
Это гарантирует, что соединение закрыто и удалено из текущего потока. Если вы используете ActiveWeb, то вы можете использовать DBConnectionFilter
: http://javalite.io/database_configuration Как и в любом веб-приложении, вы должны открыть соединение (извлечь из пула соединений) до обработки запроса, использовать соединение в вашем контроллере, затем закрыть соединение (вернуться в пул). в конце запроса.
Если вы не используете ActiveWeb, вы можете написать простой фильтр сервлетов, который будет делать то же самое, вот один пример: ActiveJdbcFilter