我正在设计一个严重依赖数据库的应用程序。我需要我的应用程序能够抵御数据库连接的短暂丢失(例如网络停机几秒钟)。人们用于解决这类问题的常用模式是什么?我可以在数据库访问层上做些什么来优雅地处理与db的网络连接中的小故障(我正在使用hibernate + oracle jdbc + dbcp pool)。
答案 0 :(得分:2)
我假设您已隐藏DAO后面的每个数据库访问或类似的东西。
现在围绕这些DAO创建包装器,尝试调用它们,如果发生异常,请等待一秒钟然后重试。当然,这会在db-outage期间导致应用程序“挂起”,但是当数据库可用时它将恢复生效。
如果这是不可接受的,你必须将切口移到靠近ui层的位置。请考虑以下方法。
用户导致a 请求。
将所有请求信息包装在一条消息中并将其放入队列中。
返回给用户,告诉他他的请求会在短时间内得到处理。
在队列中注册的worker将处理该请求,并在存在数据库问题时重试。
请注意,您现在处于并发领域。因此,您必须处理引用已被删除的实体的请求。
阅读'最终一致性'
由于你正在使用hibernate,你将不得不处理延迟加载。连接中断会导致会话中断,所以对你来说最好不要使用延迟加载,而是使用分离的对象。