如何处理数据库崩溃(Glassfish/MySQL)?

Posted

技术标签:

【中文标题】如何处理数据库崩溃(Glassfish/MySQL)?【英文标题】:How to handle database crashes (Glassfish/MySQL)? 【发布时间】:2012-10-16 15:52:02 【问题描述】:

我有一个包含 Glassfish 3.1.2.2、mysql 数据库和 Swing 客户端应用程序的 3 层应用程序。是否有可能处理数据库服务器崩溃?

我试图在我的应用程序运行期间停止 MySQL 服务。然后,每当我尝试通过我的外观会话 bean 之一访问数据库时,我都会得到 javax.ejb.EJBAccessException 异常。

我想通知用户数据库当前已关闭。此外,我想将我的应用程序设置为“睡眠模式”,直到数据库重新启动并运行。

什么是处理这种情况的好方法(并且可能是简单的)?

提前感谢您的帮助!

【问题讨论】:

好建议:youtube.com/watch?v=tQpBU4f2it0 搞笑,不得不笑你的评论 ;-) 我把标题从“fall-out”改成了“crash”…… 【参考方案1】:

A) 确保将 Glassfish 连接池配置为自动恢复/重新连接

在 Glassfish JDBC 连接池配置中,设置以下值:

属性:is-connection-validation-required, validate-atmost-once-period-in-seconds, connection-creation-retry-attempts, connection-validation-method, connection-creation-retry-interval-in-seconds, ping

Glassfish Configuration jdbc-connection-pool PropertiesGlassfish Admin - create-jdbc-connection-pool subcommand

步骤:

    假设 Glassfish 正在运行(例如,在 Netbeans 服务选项卡中启动服务器,打开服务器并右键单击 Glassfish),那么您应该运行域管理服务器 在网络浏览器中打开管理控制台:http://localhost:4848(或使用您在安装期间指定的任何端口。 在左侧,在 Common Tasks 菜单下,打开 Resources -> JDBC 并单击 JDBC Connection Pools 单击您的连接池 POOL NAME(或单击“新建”按钮创建一个新的) 选择高级选项卡并输入: 最多验证一次:(例如 60)秒 创建重试尝试:(例如 3) 重试间隔:(例如 10)以秒为单位 连接验证:(勾选)必需 验证方法:(例如自动提交) 其他所需的高级属性 选择常规选项卡并输入: Ping(打勾) 其他所需的常规属性

B) 实施应用程序错误处理/数据库监控和警报

    强制:捕获“基础架构级别”的致命用户错误并提醒支持人员。

    创建一个简单的 JMX 类来发送通知并调用它的方法 当发生致命错误时JMX MBean Class which sends notifications。您可以使用 JMX 监控控制台来观察服务器的状态 - 其中一些控制台发送电子邮件警报(例如 JManage 和 RHQ),并且有用于从 HTTP/AJax 或其他语言访问的桥梁(例如 Jolokia 可以使用 javascript/perl/ java API 来访问 JMX 通知)。

    使用Google Calendar API 将错误消息发送到支持人员的谷歌日历(1 或 2 分钟后)。然后配置谷歌日历以发送电子邮件/短信通知 - 将向支持人员近实时地直接提供错误警报。这受 Google 使用限制(每天 10,000 次查询的礼貌限制,因此请确保您的应用没有超级错误,并使用逻辑来限制每小时/每天/每周发送的消息数量)

    理想:监控数据库(可能还有应用服务器)并提醒支持人员出现中断

    Zabbix 开源内置了 mySQL 监控和警报 - 轻量级但需要设置和配置 Hyperic 开源具有用于 mySQL 监控和内置警报的扩展插件 - 重量级,设置和配置可能很复杂 Nagois 开源是 *nix 操作系统的默认值 - 重量很重,设置和配置可能很复杂

    在所有情况下,设置都不会立即发生 - 最好作为一个单独的迷你项目实施并正确执行 - 最好让支持人员参与其中。

    如果这些“超出范围”,则创建您自己的简单监视器:

    一个 EJB 计时器,用于针对您的 DB 运行计划的简单测试查询 - 如果它失败发送警报(通过 JMX/Google 日历/Java 邮件/SMS 网关 API)。或者使用 Quartz 开源调度器来做同样的工作

【讨论】:

嗨,格伦,非常感谢您的详尽回答 :-) 我会尝试一下您的建议。【参考方案2】:

它自己的连接池会监控数据库的状态。您可以创建一个拦截器并在 db 出现故障时拾取。容器将尝试重新连接,但您不一定知道它何时成功。一旦检测到错误,您需要在某处设置信号量。然后你必须启动一个计时器来定期检查数据库的状态,并在信号量返回后重置它。最后,您必须对应用进行编码以尊重信号量。

这是一个高级建议。祝你好运。

或者,您也许可以使用 JMX 挂钩所有事件...不过我不确定。

【讨论】:

感谢普雷斯顿的建议。这听起来很复杂,但我会尝试使用 JMX :-)

以上是关于如何处理数据库崩溃(Glassfish/MySQL)?的主要内容,如果未能解决你的问题,请参考以下文章

断开互联网连接时如何处理 NSJSONSerialization 崩溃

滚动表格视图时,iOS 应用程序随机崩溃,不确定如何处理引发的错误

如何处理 terraform 进程崩溃并避免重试时资源泄漏?

如何处理通过 System.Diagnostics.Process 启动的进程中的崩溃?

tvOS:如何处理 TabBar 和 UICollectionView 之间的焦点更改并防止崩溃

Delphi 用dbnavigator和dbgrid链接以后,使用dbnavigator控件的删除时会使程序崩溃,该如何处理