8

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

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

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

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

提前感谢您的帮助!

4

2 回答 2

31

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 配置 jdbc-connection-pool 属性
Glassfish 管理员 - create-jdbc-connection-pool 子命令

脚步:

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

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

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

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

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

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

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

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

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

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

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

这是一个高水平的建议。祝你好运。

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

于 2012-10-28T15:25:53.363 回答