嵌入式Java运行平台数据库引擎的应用研究
注:|表示多选个,<>表示某定义项目,[]表示可选项目,…代表循环省略表示。
(3)动作执行层
动作执行层是整个DB组件的核心和关键,因为所有的DB操作最终都由该层完成,同时用户也可以跳过上面的两层,直接调用该层的API,以实现相同的数据操作功能。下面介绍其主要设计要点和思路。
2.3 数据的表达与存储
由于嵌入式系统的资源十分有限,不能引入复杂的算法和数据存储格式,同时由于Java对二进制数据的处理十分不便,本文最终采用CSV格式来保存表数据。其要点是:
①各字段数据之间采用「,」分开;
②如果字段数据本身包含有「,」,则将整个字段数据用引号「」括起来;
③如果字段数据本身包含有引号「”」,则将引号「”」改写为两个重叠的引号「””」,依次类推。其次,每个记录占文本文件的个行,每一个数据表与一个物理数据文件一一对应。
采用这种方式处理的优点是:
①全部数据都是采用字符串保存,Java处理起来十分方便;
②对不定长字段的保存处理与定长字段处理统一,不需要额外的附加处理,而且存储效率高;
③对多字节文字的处理程序不需要额外的编码转换处理,由
JVM平台本身的功能可以自动完成。
当然,采用这种处理方式也存在其不足之处:
①由于在数据文件中,每条记录的长度不定,数据即使局部更新,也必须重写整个文件;
②由于同样原因,单条记录的检索难于直接定位,而必须读入整个数据文件。
为弥补由此产生的性能下降,本文采用数据Cache加以克服。也就是说,尽可能将数据缓存在内存中,通过减少对物理文件的读写操作来提高数据的性能。
2.4 多线程数据存取的同步与互斥
在Java虚拟机环境下,没有多进程的概念,但对于多任务的处理提供了多线程的手段。本DB引擎组件是公共组件,供上层多个应用程序组件共同使用。由于上层的每个应用程序组件本身由一个或数个线程来执行,因此,DB引擎组件必须考虑多个线程同时存取某个数据时可能引起的冲突问题。对于该问题的解决办法,一般是采用DB锁定的方法。关于DB锁定,进一步细分的话,可区分为读锁和写锁;根据锁定粒度的粗细可分为按表锁、按Page锁、按记录锁等,不一而足。
为设计和实现的简单起见,本DB引擎组件提供按表锁定的方式,同时不区分读写锁之间的区别。这样,大大简化了SQL语句的分析和处理过程,并且可以直接把锁定操作与表的open操作相关联,锁解除与表的close操作相关联。实现时,对应表对象Table的每一个实例,设置一个field变量,用于保存锁定状态,再利用Java语言提供的synchronized手段同,可以较为方便地实现数据表的锁定功能。代表示例如下:
//表锁定。为了避免死锁,有超时判断逻辑
synchronized void lock()throws DBError{
long t2,t1;
t1=System.currentTimeMillis();
//由于可能出现在wait语句被唤醒而却得不到表锁的情况,为提高超时逻辑判断精度,采用循环
while(isLocked){
try{
wait(DBError.TIMEOUT/10);
《嵌入式Java运行平台数据库引擎的应用研究(第3页)》