Вопрос по sleep, java, database-connection, mysql – Обнаружение событий сна и пробуждения ОС в Java

7

Есть ли способ для Java-программы определить, когда операционная система собирается перейти в спящий режим или нет, по крайней мере, обнаружив пробуждение?

Фактическая проблема заключается в том, что в конкретном приложении ряд операций с базой данных MySQL выполняется в фоновом режиме. При тестировании на компьютере с Windows эти транзакции базы данных прерываются после цикла сна / пробуждения, что вызывает массу ошибок в программе. Эти ошибки обычно выглядят примерно так:

java.net.SocketException
MESSAGE: Software caused connection abort: recv failed

Если бы мы могли отреагировать на «скоро поспим» событие, которое мы могли бы попытаться приостановить фоновые операции, предотвращая проблему. Менее в идеале, если бы мы могли реагировать на «только что проснулся»; Событие, которое мы могли бы по крайней мере подавить сообщения об ошибках.

Ваш Ответ

3   ответа
8

периодически сравнивая текущее системное время с предыдущим системным временем.

Изменить: вот пример, который выглядит так, как будто он поможет вам определить, когда машина будет спать: http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

Жаль, что это не может быть сделано без JNI, но ссылка кажется хорошим началом. Alexander Ljungberg
Да, JNI может быть проблемой для разработки и отладки. Мы обнаружили, что ключ состоит в том, чтобы сохранить как можно больше логики в Java и просто использовать JNI в качестве моста для низкоуровневых вызовов C API.
2

пробуждения из ОС.

ОтСобытия Windows Power (MSDN)вам нужно будет создать обработчик окна и нулевое окно для получения событий WM_POWERBROADCAST. Эта оконная процедура может затем вызвать функцию события в вашем Java-коде, чтобы всплыть сообщение.

3

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

Нет, если запрос был восстановим. Иногда это так, иногда это не так. Иногда это так, что пользователь никогда не замечает, а сама система. Вы должны быть в состоянии справиться с этим событием.
Если база данных дает сбой или кто-то тянет за кабель, я думаю, что сообщения об ошибках действительно будут в порядке! Alexander Ljungberg
Я использовал C3PO именно для этого, он может проверять соединения, прежде чем возвращать их приложение из пула.

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