synchronized与lock 对象锁、互斥锁、共享锁以及公平锁和非公平锁
ormlite
基于注解和反射的的方式,导致ormlite性能有着一定的损失(注解其实也是利用了反射的原理)
优点:文档较全面,社区活跃,有好的维护,使用简单,易上手。
缺点:基于反射,效率较低
反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。
GreenDao
greenDAO与上述两种ORM框架不同,其原理不是根据反射进行数据库的各项操作,而是一开始就人工生成业务需要的Model和DAO文件,业务中可以直接调用相应的DAO文件进行数据库操作,从而避免了因反射带来的性能损耗和效率低下。
优点:效率很高,插入和更新的速度是sqlite的2倍,加载实体的速度是ormlite的4.5倍。
文件较小(<100K),占用更少的内存 ,但是需要create Dao,操作实体灵活:支持get,update,delete等操作
另外GreenDao支持Protocol buffers协议数据的直接存储 ,如果通过protobuf协议和服务器交互,不需要任何的映射。
缺点:
但是由于需要人工生成model和DAO文件,所以greenDAO的配置就略显复杂。
Android Sqlite框架 GreenDao的源码分析笔记
GreenDao源码简要分析
采用IdentityScope缓存key(主键)-model,加锁
数据的操作缓存只有在load的时候缓存才去缓存查找是否存在,存在直接返回
Sqlite之主键乱序和GreenDao设计的坑
.db-journal该文件是sqlite的一个临时的日志文件,主要用于sqlite事务回滚机制,在事务开始时产生,在事务结束时删除;当程序发生崩溃或者系统断电时该文件将留在磁上,以便下次程序运行时进行事务回滚。
在android采用的这种模式下,.db-journal文件是永久的留在磁盘上不会被自动清除的,如果没有发生事务回滚那么.db-journal文件的大小为0,这样就避免了每次生成和删除.db-journal文件的开销。
android 的数据库系统用的是sqlite ,sqlite的每一个数据库其实都是一个.db文件,它的同步锁也就精确到数据库级了,不能跟别的数据库有表锁,行锁。
所以对写实在有要求的,可以使用多个数据库文件。[这也就是为什么IM在同步一万个联系人里,采用两个数据库的原因]
Realm
Realm是C++实现。当它用原生对象格式(native object format)来存储数据时,这些对象不会带着其语言特有的格式原封不动地存在磁盘上,而是通过C++引擎存储在一个全局的表中。这使得Realm可以通过各种语言来访问数据,还包括各种即时查询。
相比关系数据库,这种混合了对象和表的方式的优势在于它视图查询(graph query)更高效——甚至在相对老旧的智能手机上,查询深度嵌套的对象图也不会影响系统反应速度。Realm发布的基准测试(benchmark)结果称,在普通操作上,Realm的速度最快要达到原始的SQLite的10倍。