如何处理数据库崩溃(Glassfish / MySQL)?
我有一个使用Glassfish 3.1.2.2,MySQL数据库和Swing客户端应用程序的3层应用程序。 是否有可能处理数据库服务器崩溃?
我试图在我的应用程序运行期间停止MySQL服务。 每当我尝试通过我的一个外观会话bean访问数据库时,我都会得到javax.ejb.EJBAccessExceptionexception。
我想通知用户数据库当前已关闭。 此外,我想将我的应用程序设置为“睡眠模式”,直到数据库启动并再次运行。
处理这种情况会有什么好处(也可能是简单的)方法?
感谢您的帮助!
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 Admin – create-jdbc-connection-pool子命令
脚步:
- 假设Glassfish正在运行(例如,在Netbeans服务选项卡中启动服务器,打开服务器并右键单击Glassfish),那么您应该运行Domain Admin Server
- 在Web浏览器中打开管理控制台:
http://localhost:4848
(或使用您在安装期间指定的任何端口。 - 在左侧的Common Tasks菜单下,打开Resources – > JDBC并单击JDBC Connection Pools
- 单击您的连接池POOL NAME(或单击“新建”按钮创建一个新的)
- 选择高级选项卡并输入:
- 最多validation一次:(例如60),以秒为单位
- 创作重试尝试:(例如3)
- 重试间隔:(例如10)秒
- 连接validation:(勾选)必需
- validation方法:(例如自动提交)
- 其他所需的高级属性
- 选择常规选项卡并输入:
- Ping(勾选)
- 其他一般属性如期望
B)实现应用程序error handling/数据库监视和警报
-
强制性:陷阱“基础架构级”致命用户错误和警报支持人员。
创建一个简单的JMX类来发送通知并在发生致命错误时调用其方法JMX MBean Class发送通知 。 您可以使用JMX监视器控制台来观察服务器的状态 – 其中一些控制台发送电子邮件警报(例如JManage和RHQ),并且有用于从HTTP / AJax或其他语言访问的桥接器(例如, Jolokia可以使用javascript / perl / java API访问JMX通知)。
使用Google Calendar API将错误消息发送给支持员工的Google日历(将来1或2分钟)。 然后配置谷歌日历以发送电子邮件/短信通知 – 将提供错误警报直接支持员工近实时。 这受到Google使用限制(每天10,000次查询的礼貌限制,因此请确保您的应用不是超级错误,并使用逻辑来限制每小时/每天/每周发送的邮件数量)
-
理想的:监控数据库(可能是应用服务器)并提醒支持人员中断
- Zabbix开源内置mySQL监控和警报 – 重量轻但需要设置和配置
- Hyperic开源有用于mySQL监控和内置警报的扩展插件 – 重量很大,设置和配置都很复杂
- Nagois开源是* nix操作系统的默认设置 – 重量很大,设置和配置都很复杂
在所有情况下,设置不会立即发生 – 最好作为一个单独的迷你项目实施并做正确 – 最好让支持人员参与其中。
如果这些“超出范围”,那么创建自己的简单监视器:
- 用于对数据库运行计划的简单测试查询的EJB计时器 – 如果失败则发送警报(通过JMX / Google Calendar / Java Mail / SMS网关API)。 或者使用Quartz开源调度程序来完成同样的工作
在它自己的连接池将监视数据库的状态。 您可以创建一个拦截器,并在db关闭时启动。 容器将尝试重新连接,但您不一定知道它何时成功。 一旦检测到错误,就需要在某处设置信号量。 然后你必须启动一个计时器来定期检查数据库的状态,并在它返回后重置信号量。 最后,您必须编写应用程序以尊重信号量。
这是一个高级别的建议。 祝你好运。
或者,您可以使用JMX挂钩所有事件……但我不确定。
- javaexception会终止整个java应用程序吗?
- JPA RollbackException持久化事务导致后续有效事务失败?
- 为什么直接将Arrays.asList()分配给var时会出现AssertionError?
- 无法从无处构建Hibernate SessionFactoryexception
- 为什么并行性ForkJoinPool加倍我的exception?
- e.printStackTrace和System.out.println(e)之间的区别
- 线程“main”java.util.NoSuchElementException中的exception
- 是否可以忽略exception?
- Java异步exception:我能抓住它们吗?