在微服务监控平台的项目中,领导为了运维更加简单,也是考虑到该系统没有涉及到太多的业务,要求使用sqlite数据库。
这个数据库我也是第一次使用,上手不难,与mysql的语法基本一致,有一些的函数操作不太一样,但是不难修改。
其实在刚开始了解这个的数据库的时候我并不觉的这个数据库是适合我们这个项目的,这个数据库有个致命的弱点:不支持并发写。
但是我们的监控平台,需要记录很多实时的日志,也有很对的定时器去不断的更新数据库,所以在刚开始使用的时候,经常锁库
也不是没有解决办法,在这个项目中我们有两个服务在操作该数据库,就更难控制并发的了。最终也是进行了一系列的处理,将对数据库的操纵控制为单线程的操作。
下面是具体的方法:
(1)将两个服务中对数据库的操作进行抽象,独立成一个服务。【在多个服务中是没办法控制单线程访问的,所以这一步是必然。具体的操作:新建一个服务,用于与数据库交互,并提供接口供其他服务调用,将其他服务中的数据库操作全部放到该服务中,通过请求该服务完成数据库的操作】
(2)对抽象出来的数据库服务,将其对数据库的服务进行同步,这里我是用了AOP实现。
package com.googosoft.db.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; /** * @author songyan * @version 2020年2月15日 上午10:14:06 * @desc */ @Aspect @Component public class BrokerAspect { @Around("execution(* com.googosoft.db.dao.*.*.*(..))") public Object Around(ProceedingJoinPoint point){ synchronized (this) { try { return point.proceed(); } catch (Throwable e) { e.printStackTrace(); } } return null; } }
对所有的dao层方法进行同步,保证同一时间,只有一个线程在访问数据库。
我自己的一些观点:
(1)使用sqlite数据库最大的好处就是使用起来特别的简单,不管是应用,还是数据,粘贴到PC就能使用,非常便捷。
(2)但是我认为在并发的情况下还是使用mysql数据库更方便一些,无需做这些抽离的工作,大大减小代码的复杂程度;而且在抽离的过程中,无疑增加了代码的层数;而且服务间的调用增大了网络开销,降低了响应速度。
(3)对与响应速度的问题,我才用了给系统加缓存的方式,提高了响应速度,效果也是极其明显的。【https://www.cnblogs.com/excellencesy/p/12376126.html】