3

Вопрос по java, mysql – Ошибка в соединении MySQL при доступе к удаленному серверу

Я & APOS; веhosted a MySQL DBвwebserver, Я & APOS; веgranted all privledgesи разрешеноmy IP to connect to this database remotelyс моего локального компьютера. Он подключен, и я могу извлечь данные из базы данных в мое приложение Java Swing. Но ...

2 ответа

2

Это довольно распространенная проблема в MySQL, которая, к сожалению, возникает, как правило, только после запуска, когда приложение работает в течение некоторого продолжительного времени, в отличие от короткого цикла разработки.

MySQL закрывает соединения, не уведомляя своих клиентов, и, если вы попытаетесь использовать соединение с тайм-аутом, возникает не слишком многозначительное исключение. например, вы можете периодически проверять соединение с помощью некоторого тривиального оператора SQL, чтобы избежать тайм-аута.

Рекомендуется использовать пул соединений (чтобы избежать проблем, когда слишком много пользователей обращаются к БД одновременно), например, DBCP, в общем. DBCP может быть легко добавлен в ваше приложение, и вы можете установить его только как квази-драйвер JDBC. Там вы можете установить вещи правильно.

Я скопировал эту конфигурацию DBCP из одного из моих проектов:

                 MaxActive=20,
                 MaxWait=60000,
                 TestWhileIdle=true,
                 TimeBetweenEvictionRunsMillis=300000,
                 MinEvictableIdleTimeMillis=300000,
                 TestOnBorrow=true,
                 ValidationQuery='SELECT 1'

Update: В качестве очень простого решения вы можете попытаться перехватить исключение при доступе и в этом случае открыть новое соединение.

3

Убедитесь, что вы не используете мертвое соединение JDBC. В зависимости от того, как вы создаете соединение jdbc, они могут бездействовать. Если вы используете одно и то же соединение снова и снова, протестируйте соединение, прежде чем пытаться выполнить запрос, и получите новое, если оно было закрыто mysql.

ОБНОВИТЬ:

Вы создаете новое соединение везде, кроме getResult (), в котором трассировка стека идентифицирует ошибку. Вы можете создать новое соединение, как и везде, или улучшить инкапсуляцию getConnection (). Другими словами, измените getConnection (), чтобы он возвращал статическое соединение, хранящееся в вашем классе, при условии, что оно не равно нулю и все еще действует. В противном случае создайте новое соединение и верните его.

Похожие вопросы