场景: 为了提高数据处理性能,应用启动把数据库数据加载内存中,在java层使用HashMap维护内存数据,java逐条传输数据给native处理;当增删改查时,内存和数据库同时更新
问题: 由于jni的缘故,高频度调用jni处理数据,每条数据量不大,jni反而成为效率的瓶颈,效率太低
改进方向: 每次处理数据,native可以直接获取所有处理数据,不需要java逐条传输;不影响数据同步(增删改查)
改进方法
方法一: 空间换时间。应用启动把数据一次性传递给jni,在native维护一个数组
存在问题:
1、 每条数据量比较小,当数据量很大时,也有几十兆甚至更大,此时java、native各拷贝一份,内存成本太大
2、 数据量大,jni一次性传输时间成本大
方法二: 空间换时间。使用android中nio中的ByteBuffer实现java、native层内存共享
存在问题:
1、 每条数据量比较小,当数据量很大时,也有几十兆甚至更大,此时java、native各拷贝一份,内存成本太大
方法三: 应用启动时,在native层操作数据库,加载数据数据到内存,java层不再加载;数据库维护由java层实现,增删时调用jni接口实现native内存数据维护
存在风险:
1、 增删频度。如果增删频度太高,对jni频繁调用也会存在时效问题
方法四: 使用内存数据库,java、native可以同时操作数据库
存在风险:
1、 多线程、多进程读写,同步问题,是否会影响到性能
支持java、native的内存数据库:LMDB、SQL、