избавление от предупреждения MySQL SSL при использовании Java, JDBC и C3P0

#java #mysql #jdbc #c3p0

#java #mysql #jdbc #c3p0

Вопрос:

У меня есть простое приложение JDBC (не использующее Spring или Hibernate), которое подключается к MySQL. В рабочей среде соединение MySQL использует SSL, но оно не использует SSL в режиме разработки. В режиме разработки я добавил "amp;useSSL=false" URL-адрес базы данных, чтобы предотвратить заполнение моих файлов журналов предупреждением MySQL «Установление SSL-соединения без проверки подлинности сервера не рекомендуется».

Теперь я добавляю пул подключений к базе данных, используя C3P0. Вместо получения соединения от DriverManager.getConnection , я получаю соединение от C3P0, вызывая POOL.getConnection() .

Код, который устанавливает C3P0, довольно прост:

 POOL = new ComboPooledDataSource();
POOL.setDriverClass("com.mysql.cj.jdbc.Driver");
POOL.setJdbcUrl(DB_URL);
POOL.setUser(USER);
POOL.setPassword(PASSWORD);
 

Проблема в том, что это не работает. Если строка DB_URL содержит "amp;useSSL=false" , то POOL.getConnection() зависает. Я удалился "amp;useSSL=false" из DB_URL , и все работает нормально, за исключением того, что теперь я получаю предупреждения MySQL SSL.

Может кто-нибудь посоветовать мне, как правильно настроить C3P0, чтобы я больше не получал предупреждения MySQL SSL?

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

1. Используете ли вы тот же драйвер в старой ситуации? c3p0 также вызывает DriverManager.getConnection ; так что, если один работает, другой тоже должен. Рассмотрите возможность публикации вашего старого кода.

2. Отметьте — драйвер один и тот же («com.mysql.cj.jdbc.Driver») в обоих случаях.

Ответ №1:

Соединения JDBC автоматически собирают предупреждения, которые необходимо активно проверять, чтобы их можно было увидеть. Большинство приложений никогда не проверяют их. c3p0 проверяет. Всякий раз, когда соединение возвращается, c3p0 проверяет, регистрирует и удаляет предупреждения о соединении, прежде чем снова сделать соединение доступным в пуле.

Если ведение журнала предупреждений вас раздражает, просто настройте свою библиотеку ведения журнала для их фильтрации. Все предупреждения регистрируются в INFO вызываемому регистратору com.mchange.v2.c3p0.SQLWarnings . Просто настройте любую библиотеку ведения журнала, которую вы используете, чтобы не регистрировать `com.mchange.v2.c3p0.SQLWarnings или фильтровать его до более высокого уровня серьезности, чем INFO.

См. SQLWarnings .

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

1. Это не совсем соответствует описанию проблемы, что «POOL.getConnection() зависает»

2. Это только в том случае, если poster предоставляет параметр подключения amp;useSSL=false , который, похоже, его СУБД не поддерживает. Если он использует SSL, т.Е. Если он пропускает amp;useSSL=false , то ему удается получить соединения, но получает предупреждение о том, что SSL-соединение относится к непроверяемому идентификатору. Очевидно, что лучше всего было бы настроить SSL с проверяемыми сертификатами, чтобы обеспечить безопасную, проверенную идентификацию. Но если пользователь не беспокоится об атаках типа «человек посередине» и просто хочет, чтобы предупреждения исчезли, их отключение при протоколировании сработает.