将数据写入数据库时,如果占时无法连接数据库时,怎样保存这些数据

通过java程序将数据存入数据库,当数据库占时无法连接或者其他原因无法将数据写入数据库时,这些数据应该怎么处理,才能保证这些数据不能够丢弃;是不是应该将数据通过file保存到本地,等到数据库正常再写入数据库?
请问有没有更好的方法处理这样的问题。

5个回答

可以使用基于缓存的中间件来解决,比如说redis,当数据产生时先不要直接往数据落地的数据库中写入,先存在redis中,接着去往数据落地的数据库中写入,当存储成功了就处理掉redis中的数据,如果写入没有成功根据你的业务需要再设计写入失败的逻辑,是失败立即在发起一次存储还是等后面再进行存储都可以。

weixin_41763995
_鹿慕溪水 redis的数据也是可以做持久化的,redis只是基于你自己的服务器;服务器宕机这个是不可预测的,你只能从解决方案入手,比如说做redis集群,你的服务也会有宕机的时候,那你的服务也需要做成集群,最少得有两套环境,我之前的回答只是针对你问题中提到的写入数据库由于某种原因导致写入失败的一种解决方案,并不是针对服务、数据库宕机的情况。
5 个月之前 回复
wen_xkang
wen_xkang 这个是可以的,但是当redis中有大量数据时,突然服务器断电了,数据还是会丢的
5 个月之前 回复

你这是悖论,就算保存的本地了,那怎么查呢?比如用户下了一个订单,你保存到file中,反馈客户下单成功,但是客户却无法查询到数据。
如果数据库都无法连接了,为了保证事务的完整性或数据的一致性,应该是返回给用户系统异常了。
正常来说你应该确保的数据库24小时工作,但还是要分场景,可能你进行了服务拆分,就要引入MQ和考虑分布式事务的处理。

guangcaiwudong
Kevin.Y.K 回复wen_xkang: 看了你上面的回复,redis都不能满足你的需求,还要考虑断电、断网,那这个问题就不是程序能解决的问题,是设备运维的问题,你需要保证服务器和数据库24小时工作,上云服务、做集群、故障报警等等
5 个月之前 回复
wen_xkang
wen_xkang 我这个是做数据采集的服务程序的,所有和前端无关,只要保证数据不丢失,后期做分析用就行;我的意思是如果写入数据库不成功,就将数据以file或者其他方式保存到本地,等数据库正常后再将这些数据写入到数据库
5 个月之前 回复

那你可以先统一把数据存到文件中。然后另起一个任务专门从文件中读数据存入数据库。采集的时候可以给每条数据加上唯一编号。分批插入,当数据库异常时定时重试。

存到另一个可访问的数据库中,到时候直接同步过去就行

你不想引入中间件的话,那么你就加个失败策略,在存入数据库失败的时候,将其持久化到本地磁盘。
最好的消息就是没有消息
启动一个定时任务 定期查询文件是否有数据存在,在数据库恢复的时候,如果存在则将其数据重新插入数据库。
其实各种中间件,都是要数据持久化到本地磁盘,来保证数据的不丢失

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问