在Java中检测操作系统睡眠和唤醒事件

在Java中检测操作系统睡眠和唤醒事件,java,mysql,database-connection,sleep,Java,Mysql,Database Connection,Sleep,Java程序是否有办法检测操作系统何时将进入睡眠状态,或者如果没有,至少可以检测到唤醒 实际问题是,在特定的应用程序中,许多MySQL数据库操作都是在后台运行的。在Windows计算机上进行测试时,这些数据库事务在睡眠/唤醒周期后被中断,导致程序中出现大量错误情况。这些错误通常如下所示: java.net.SocketException MESSAGE: Software caused connection abort: recv failed java.net.SocketException

Java程序是否有办法检测操作系统何时将进入睡眠状态,或者如果没有,至少可以检测到唤醒

实际问题是,在特定的应用程序中,许多MySQL数据库操作都是在后台运行的。在Windows计算机上进行测试时,这些数据库事务在睡眠/唤醒周期后被中断,导致程序中出现大量错误情况。这些错误通常如下所示:

java.net.SocketException MESSAGE: Software caused connection abort: recv failed java.net.SocketException 消息:软件导致的连接中止:recv失败
如果我们能够对“将很快入睡”事件做出反应,我们可以尝试暂停后台操作以抢先解决问题。不太理想的情况是,如果我们能够对“刚刚唤醒”事件做出反应,我们至少可以抑制错误消息。

您可以通过定期比较当前系统时间和以前的系统时间来检测唤醒

编辑:下面是一个示例,它可以帮助您检测机器何时进入睡眠状态:

我知道这并不完全是您想要的,但也许正确的答案是,在编写代码时,假设您的套接字不一定能正常工作。连接可能会崩溃的原因有很多,例如,因为DB被关闭进行维护,或者因为有人被您的以太网电缆绊倒。我认为,如果有人在你的应用程序运行时拔出网络电缆,你也会遇到类似的错误问题,而且这些情况并非闻所未闻,因此,尝试优雅地处理这些情况可能是更好的方法。

你可以只使用JNI或JNA来捕获操作系统中的睡眠/唤醒事件


从中,您必须创建一个窗口处理程序和一个空窗口来接收WM_POWERBROADCAST事件。然后,这个窗口过程可以在Java代码中调用事件函数来冒泡消息

如果数据库真的崩溃了,或者有人拉了一根电缆,我认为错误消息实际上是正常的!如果请求是可恢复的,则不会。有时是,有时不是。有时它是暂时的,以至于用户从未注意到,但系统本身却注意到了。你应该能够处理该事件。我使用C3PO来完成这项工作,它能够在从池中返回应用程序之前验证连接。遗憾的是,没有JNI无法完成这项工作,但链接似乎是一个很好的开始。是的,JNI的开发和调试可能会很困难。我们发现关键是在Java中保留尽可能多的逻辑,并且只使用JNI作为桥接器来对C API进行低级调用。