Примерно через неделю go, приложение весенней загрузки в среде разработки (AWS экземпляр EC2), которое до этого момента успешно подключалось к MySql с использованием SSL, внезапно прекратило подключение. Вот выборка из бесполезной трассировки стека:
### Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
### The error may exist in com/domain/app/data/mybatis/mappers/SomeMapper.xml
### The error may involve com.domain.app.data.mybatis.mappers.SomeMapper.getUserByUsername
### The error occurred while executing a query
### Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:93)
at com.sun.proxy.$Proxy91.getUserByUsername(Unknown Source)
at com.domain.app.security.SomeService.loadUserByUsername(SomeService.java:32)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:108)
... 96 more
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
...
Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
Некоторые факты:
- Точно такая же сборка приложения работает при запуске с моего локального компьютера (с идентичной информацией о подключении к базе данных). Предположительно, неверно настроенный код приложения исключен.
- mysql находится в отдельном экземпляре EC2, и я могу подключиться к mysql из интерфейса командной строки на «неисправном» экземпляре EC2. Проблемы безопасности / ACL предположительно исключены.
- Строка подключения имеет следующий вид: jdb c: mysql: // xxxx: 3306 / db_name? UseSSL = true & verifyServerCertificate = true & requireSSL = true & autoReconnect = true, {db имя пользователя}, {пароль базы данных}. Опять же, эта строка работает при использовании с моей собственной машины.
- Примерно через две недели go сертификаты ssl, подписанные CA, были добавлены в приложение весенней загрузки в хранилище ключей java. Те же сертификаты не были добавлены в mysql, который использует самогенерируемые и самозаверяющие сертификаты. Существует небольшой, хотя и маловероятный шанс, что приложение не тестировалось с тех пор в неисправной среде - хотя я почти уверен, что с тех пор я использовал эту среду.
Мое текущее мнение что, возможно, новые сертификаты в приложении dev каким-то образом конфликтуют с самогенерируемыми и самоподписанными сертификатами mysql, что может не происходить локально на моей машине. Но я не знаю, с чего начать проверку или тестирование этой теории.
Я устранял эту неполадку около 7 часов, в том числе черт побери в Google и читал множество ответов SO на связанные вопросы. Приносим извинения, если на этот вопрос был дан какой-то ответ, которого я не понимаю.
Может ли кто-нибудь из вас указать мне какие-то ответы или указания по устранению неполадок?