#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 и используйте это.