Не удается открыть новое соединение, потому что существующее соединение все еще находится в текущем потоке - 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

Другие вопросы по тегам