Проблема с подключением к Postgresql с использованием JDBC

#java #postgresql #jdbc

#java #postgresql #jdbc

Вопрос:

У меня есть устаревшее веб-приложение на базе Java, которое использовало Oracle 7. Сейчас я переношу Oracle 7 на PostgreSQL. У нас было обычное подключение JDBC с Oracle, поскольку мы не использовали какие-либо фреймворки, такие как Hibernate, iBatis и т.д., Поэтому мы создали соединение, пул соединений программно и использовали это. Это прекрасно работает для Oracle DB.

Но как часть миграции, когда я меняю данные PostgreSQL и пытаюсь подключить базу данных к своему приложению. Только при первом вызове базы данных соединение теряется, и в журналах я вижу проблему SQL: 08003. Поскольку это веб-приложение, мы создаем war и развертываем его на сервере apache-tomcat-8.5.50. Версия PostgreSQL postgresql-42.2.18.jar .

Я проверил много блогов, но я не могу понять, почему возникает эта проблема.

Код:

 public DBConnection(String dbUrl, String user, char[] pwd) throws SQLException {
    String errMsg = "Failed to get connection for login: "   user   " in URL = "   dbUrl;           
    try {
        // Connect to database
      mTheConnection = DriverManager.getConnection(dbUrl, user, new String(pwd));
        if (mTheConnection == null) {
            throw new SQLException (errMsg);
        }   
        mTheConnection.setAutoCommit(false);
    } catch (SQLException x) {
        throw new SQLException(errMsg);
    }
    finally{
        mTheConnection.close();
    }
}
 

Комментарии:

1. Без кода Java, соответствующего полного сообщения об ошибке и, в идеале, трассировки стека на это невозможно ответить.

2. Вот код: public DbConnection(String dbUrl, String user, char[] pwd) вызывает исключение SQLException { String errMsg = «Не удалось получить соединение для входа в систему: » user » в URL = » dbUrl; попробуйте { // Подключиться к базе данных mTheConnection = DriverManager.getConnection(dbUrl, пользователь, новая строка(pwd)); if (mTheConnection == null) { выбросить новое исключение SQLException (errMsg); } mTheConnection. setAutoCommit(false); } catch (SQLException x) { выбросить новое SQLException(errMsg); } наконец{ mTheConnection.close(); } }

Ответ №1:

Очевидно, что этот код никогда не сможет работать — вы закрываете соединение в finally блоке. Этот конструктор не может быть завершен с функционирующим соединением.

Обратите также внимание, что что-то вроде этого:

 } catch (SQLException x) {
    throw new SQLException(errMsg);
}
 

одним словом, глупо. Вы берете совершенно полезную информацию и выбрасываете ее, заменяя ее совершенно бесполезной информацией. Если вы хотите добавить информацию о пользователе и URL-адресе в исключение (я бы не стал этого делать, вряд ли это будет особенно уместно), включите исключение, которое вы переносите, в качестве причины ( new SQLException(msg, x) ) , чтобы вы могли видеть там данные.

SQLException содержит массу полезной информации. Выбрасывая x , вы не сможете увидеть всю эту полезную информацию.

мы создали соединение, пул соединений программно и использовали это.

Приведенный выше код не является пулом соединений.

DBConnection

В соглашении Java говорится, что вы пишете DbConnection . Кроме того, что вы не используете венгерскую нотацию в своих полях (это connection , а не mTheConnection ).

if (mTheConnection == null) {

Этого никогда не может случиться, это мертвый код. getConnection не может вернуть значение null. Конечно, в маловероятном случае, если это произойдет, ваш код выдает это исключение SQLException, таким образом, управление перемещается в блок finally , где close() вызывается по нулевой ссылке, которая выдает NPE, который перезаписывает ваше исключение SQLException(errMsg). Этот код представляет собой полный беспорядок.

Мой совет? Выбросьте все это наружу. Возьмите HikariCP и используйте это.