APP下载

基于SQLite数据库的历史航迹管理系统设计与开发

2020-12-07刘峰陈福良

计算机时代 2020年11期
关键词:数据库

刘峰 陈福良

摘  要: 为了解决指控系统中对实时目标历史航迹的显示需求,设计了一种基于SQLite数据库的历史航迹管理系统。结合当前指控系统的实际情況,将历史航迹管理系统划分为系统外部通信模块、态势处理模块、存储处理模块和人机交互模块。在商用计算机上对系统存储和查询性能进行了测试,测试结果满足指控系统的实际使用需求。

关键词: 指控系统; 历史航迹; 数据库; SQLite

中图分类号:TP311.1          文献标识码:A     文章编号:1006-8228(2020)11-58-05

Abstract: In order to solve the requirement of displaying the real-time target historical voyage track in the Command and Control System, this paper designs a historical track management system by using SQLite database. Combining with the actual situation of the current Command and Control System, the historical track management system is divided into external communication module, situation processing module, storage processing module and human-computer interaction module. The system is implemented on a commercial computer,and its storage and query performance are tested, the test results meet the actual requirements of the Command and Control System.

Key words: Command and Control System; historical track; database; SQLite

0 引言

随着舰船装备雷达系统的快速发展,在对目标定位过程中,产生海量的航迹数据,而现有的指控系统中,为了保证实时目标的响应时间,一般只支持目标少量历史航迹点的显示。但是在实际指挥引导的过程中,指挥员需要对目标的历史轨迹数据与实时航迹进行对比分析,特别是对一些重点关注的目标进行分析,以确定目标的威胁等级、具体型号。因此需要存储海量历史航迹数据,并支持指挥人员快速查询某批目标的历史航迹数据。

然而,现阶段历史轨迹存储管理技术不够完善[2],并且现有的航迹存储系统往往基于Hadoop、HBase等分布式计算存储框架[3],对整个指控系统的软件架构和资源占用要求比较高,因此如何适配指控系统,并做到高效地存储和查询历史航迹数据,成为本系统设计的重点和难点。

本文从此实际需求出发,设计了基于SQLite数据库的历史航迹管理系统,并采用Qt进行开发,以适配不同的操作系统。

1 系统架构

历史航迹管理系统接收指控系统内的实时态势报文和指挥人员的查询输入,按照输入的查询规则,从数据库中查询符合输入条件的数据,并将查询结果打包发送出去,将整个系统划分为外部通信模块、态势处理模块、存储处理模块、人机交互模块四个部分(见图1),其中外部通信模块采用接口适配的开发思想,适配整个系统与外部指控系统之间的通信协议,系统内部各个模块之间通过消息队列机制来进行数据同步。

外部通信模块把从指控系统获取到的目标态势数据转换为内部消息格式发送到态势处理模块,态势处理模块接收到内部消息数据,提取其中的位置信息,建立数据缓存队列,当队列长度到达一定阈值后,将队列中的数据发送至存储处理模块进行入库处理。存储处理模块负责对接收到的数据入库保存,同时,响应人机交互模块的查询请求,从本地SQLITE数据文件中载入符合条件的航迹数据信息。

人机交互模块接收人机交互界面的查询请求,调用存储处理模块提供的查询接口,返回满足用户查询请求的数据。

2 外部通信模块

外部通信模块目前采用服务总线(DDS)的方式获取数据,它是现阶段指控系统常用的信息传输的架构,用来完成指控系统内不同应用软件之间的信息交互。具体方式如图2所示,通过DDS历史航迹管理系统可以订阅系统内的实时态势情报态势,并转换为内部的信息格式发送给态势处理模块。

外部通信模块作为本系统与外部指控系统之间的通信协议转换中间层,可以将历史航迹管理系统与外部指控系统解耦,并且通过修改此模块可以达到适配采用不同通信架构的指控系统。

3 态势处理模块

态势处理模块将从外部通信模块接收到的数据发送至存储处理模块。SQLite数据库作为一种文件数据库,存储数据操作相当于文件操作,而态势数据通过网络进行接收,因此为了解决数据接收与数据库文件读写速度不匹配的问题,采用数据缓存队列对态势数据进行预先保存,整个运行流程如图3所示。

态势处理模块创建态势数据接收线程,对接收到的态势数据,提取其中的位置信息,缓存到内部数据队列中,当队列中的数据达到一定数量(此阈值可根据实际每秒中接收到的报文数量进行设置,目前设置为1000)时,将整个数据队列,通过事件的方式发送到数据库处理模块,进行入库保存,程序流程图如图4所示。

4 存储处理模块

4.1 模块设计

存储处理模块采用SQLite数据库进行航迹数据存储,SQLite作为一种轻量级数据库,支持单生产者多消费者的设计模式,因此存储处理模块在初始化时,预先创建数据库写入线程以及数据库查询线程。

数据写入线程通过Qt事件消息队列接收态势处理模块打包发送的态势数据,数据读取线程则响应人机交互模块转发的外部查询请求,采用多线程处理模式,创建数据存储和数据查询线程,提升系统对外部查询请求的响应,具体结构如图5所示。

4.2 库表设计

本系统主要提供单批目标在一段时间内的航迹位置数据,为了提高查询的效率,每批目标单独建立库表,单个批号表中包含时间、经度、纬度、目标类型、航速、航向等列,用来存储目标的位置数据,并以时间顺序进行保存,目标库表如图6所示。

目前指控系统单日接收的态势数据量在千万级,单个目标表日增加数据在5万行左右的,随着时间积累,如果不对时间进行处理的话,存储的数据量将逐渐增加,导致整个数据库查询性能的下降。为了解决此问题,存储目标航迹数据时,使用多个数据庫文件来保存历史航迹数据,具体做法为:以天为周期,使用当前日期为名称,每天自动建立对应日期的数据库文件。减少库表中目标记录,显著提升查询的时间性能。

4.3 数据写入线程

数据写入线程初始化时,将根据当前系统时间,创建对应日期的db文件,通过事务方式将从态势处理模块接收到的数据写入数据库,具体的伪代码如下:

Begin

CreateSQLITEFile(time)

ConnectDB()

Transction() //开启事务

For(int i=0; i

bool isCreate=JugeTime

if isCreate

CreateSQLITEFile(time)

ConnectDB()

Insert_sql()

Commit() //提交事务

End

其中,函数CreateSQLITEFile(time)根据传入的1970s的绝对时间,生成相应日期的数据库文件;ConnectDB()函数的作用是连接本机的SQLite数据库文件,采用QSqlDatabase类来进行数据库操作;函数JugeTime()用来判断态势数据的时间是否超过今天日期,如果超过,则需要重新建立新的日期的数据库文件;函数Transction()设置开始事务,采用事务方式的原因是当SQLite插入数据时,默认将单条Insert语句作为事务进行操作,有多少条数据就会产生多少次磁盘操作,而循环使用Insert语句插入数据库的效率远低于通过事务方式插入[4];函数Commit()提交事务,完成整个写入数据库操作。具体流程图如图7所示。

4.4 数据读取线程

数据读取线程接收人机交互模块发送的查询请求,定义查询请求结构如图8所示。

其中uIP表示查询请求方的IP地址,iBatch表示查询的目标批号,dfStartTime,dfEndTime表示航迹数据的起始时间。当接收到查询请求时,数据读取线程首先根据查询的起始时间,生成需要读取的数据库文件列表,按照查询的时间顺序,依次打开数据库文件,调用SQLite查询接口,查询目标批号的航迹数据,对查询到的数据,分包发送至人机交互模块,由人机交互模块将查询数据发送给查询方,伪代码如下:

Beigin

sql_query=CreateSql(QueryCtrl)

namelist=GetSQLITEDBfileName(start, end)

For(int i=0; i

OpenDBFile(filename)

data=Query_sql(sql_query)

Package(data)

End

其中,函数CreateSql(QueryCtrl),根据接收到的查询请求,生成相应的sql语句;函数GetSQLITEDBfileName(start,end),根据查询请求中的起始时间,生成需要读取db文件列表;函数OpenDBFile(filename)根据输入的文件名称,连接数据库db文件;函数Query_sql(querystring)执行生成的sql查询语句,返回从SQLite数据库查询到的历史航迹数据;函数Package(data)将查询到的航迹数据打包,并将打包后的查询结果通过数据服务总线发送至请求方,具体流程图如图9所示。

5 人机交互模块

主要响应外部其他应用软件的查询指令,由于态势处理模块设计缓存队列缓存数据,为了保证查询结果的时效性,接收到查询指令后,人机交互模块发送更新指令到态势处理模块,接收到更新指令后,态势处理模块会将当前缓存队列中的所有数据发送到存储处理模块进行入库保存,存储处理模块写入线程完成后将通过Qt事件,传递信号给人机交互模块,当收到数据写入完成信号时,再将查询请求转发至存储处理模块,此时存储模块再处理数据查询请求,整个时序如图10所示。

6 试验测试

6.1 试验测试环境

在商用计算机上测试软件性能,测试环境如下。

⑴ 硬件环境:处理器:Intel(R)Core(TM)i7-7700K CPU@4.2GHz,内存:16GB。

⑵ 软件环境:Win7 64位操作系统。

6.2 试验测试结果分析

⑴ 数据写入性能测试

每隔2s发送1000批航迹点,并将缓存队列阈值设置为1000,共进行5组测试,取10次试验的平均耗时为测试结果,记录时间性能测试结果如表1所示。

⑵ 数据查询性能测试

查询符合时间范围的航迹数据,共进行5组测试,取10次试验的平均耗時为测试结果,数据查询性能测试结果如表2所示。

根据实际测试结果,系统平均写入时间为197.2ms,平均读取时间为49.2ms,远低于航迹发送周期2s,满足指控系统对历史航迹存储和查询的需求。

7 结束语

本文针对指控系统中对目标历史航迹数据存储和查询的需求,设计了系统的总体框架,明确了系统内部的信息流程以及和外部指控系统间的通信方式,并在此基础上划分了具体工作的各个功能模块,采用Qt对各个功能模块进行开发实现。通过对软件存储数据和查询数据的时间性能进行测试,本系统符合历史航迹存储量大、查询性能高和跨平台的要求,可以满足指控系统对实时目标历史航迹显示的需求。

参考文献(References):

[1] Sunny Kumar Aditya & Vikash KumarKarn.Android SQLite Essentials[M].Packt Publishing Limited,2014.8.26.

[2] 格兰特·艾伦,迈克·欧文斯.SQLite 权威指南(第2版)[M].电子工业出版社,2012.

[3] 程栋.SQLite数据库在数据分发服务中的应用[J].信息技术,2014.6.

[4] 盛凯,刘忠,周德超.基于PostGIS的历史航迹重演分析系统设计与开发[J].海军工程大学学报,2017.10.

[5] 孟凡君,曹伟,管志强.海量雷达数据异常轨迹分析[J].电子科技,2017(30)-1.

[6] 孙晓全,熊永岭,张艳娜.Android系统中SQLite数据库使用效率研究[J].电子设计工程,2015.4.

[7] 林培杰,朱安南,程树英.Android数据库SQLite性能优化[J].计算机系统应用,2014.23.

[8] 王丹,孔祥伟,何良.SQLite轻型数据库在试飞领域的应用[J].中国科技信息.2019.9.

[9] 孙成.基于智能设备的嵌入式数据库安全性研究[D].吉林大学,2015.

猜你喜欢

数据库
超星数据库录入证
本刊加入数据库的声明
两种新的非确定数据库上的Top-K查询
国外数据库高被引论文排行TOP10
国内主要期刊数据库