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

时间:2012-10-26 11:18:36

标签: java mysql exception glassfish

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

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

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

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:30)

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 Properties
Glassfish Admin - create-jdbc-connection-pool subcommand

步骤:

  1. 假设Glassfish正在运行(例如,在Netbeans服务选项卡中启动服务器,打开服务器并右键单击Glassfish),那么您应该运行域管理服务器
  2. 在网络浏览器中打开管理控制台:http://localhost:4848(或使用您在安装期间指定的任何端口。
  3. 在左侧的Common Tasks菜单下,打开Resources - > JDBC并单击JDBC连接池
  4. 单击您的连接池POOL NAME(或通过单击“新建”按钮创建一个新的)
  5. 选择高级标签&输入:
  6. 最多验证一次:(例如60),以秒为单位
  7. Creation Retry Attempts :(例如3)
  8. 重试间隔:(例如10)秒(
  9. 连接验证:(勾选)必需
  10. 验证方法:(例如自动提交)
  11. 所需的其他高级属性
  12. 选择“常规”选项卡&输入:
  13. Ping(勾选)
  14. 所需的其他常规属性
  15. B)实施应用程序错误处理/数据库监控&警报

    1. 必填:陷入“基础架构级”致命用户错误并提醒支持人员。

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

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

    2. 理想:监控数据库(可能是应用服务器)并提醒支持人员停电

      • Zabbix开源内置mySQL监控和警报 - 重量轻但需要设置和安装。构造
      • Hyperic开源有用于mySQL监控和内置警报的扩展插件 - 重量很大,设置和安装都很复杂。配置
      • Nagois开源是* nix操作系统的默认设置 - 重量很大,设置和配置都很复杂

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

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

      • 针对您的数据库运行计划的简单测试查询的EJB计时器 - 如果失败则发送警报(通过JMX / Google Calendar / Java Mail / SMS网关API)。或使用Quartz开源调度程序执行相同的工作

答案 1 :(得分:1)

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

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

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