数据移植

关键词: 移植 数据库 数据 系统

数据移植(精选七篇)

数据移植 篇1

1 数据库移植的理论分析

数据库移植工程在全球已经有很广泛的应用, 同时也出现了不少现成的不同产品间的数据库产品移植工具。然而, 由于各种数据库产品之间的实现还是有很多根本架构上的不同, 采用的SQL标准也不尽相同, 这个导致了在很多问题上, 并不是简单的语法变化就可以实现保证正确性的数据库转换。完全依赖数据库产品可能存在一些正确性的隐患, 因此, 很多地方还似乎要根据具体分析来进行人工参与的。这样的话, 我们决定在数据库移植开发的前期借助数据库产品中的自动移植工具省去我们很多的重复工作, 但在某些关键性问题上仍然需要我们人为的工作, 或者对工具进行相应具体的配置。Oracle是以高级结构化查询语言 (SQL) 为基础的企业级大型关系数据库, 通俗地讲它是用方便逻辑管理的语言操纵大量有规律数据的集合, 也是目前最流行的客户/服务器 (CLIENT/Server) 体系结构的数据库之一。而SQL Server 2005也同样是拥有很多优越特性的基于客户/服务器体系结构的数据库。相较而言, 进行Oracle移植工作有公司项目的商业目的。一般来说, 我们把数据库中用来储存和表示数据的实体成为对象 (Object) , 它通常包括数据的逻辑存储空间, 表 (Table) , 索引 (Index) , 视图 (View) , 约束 (Constraint) , 触发器 (Trigger) 和存储过程 (Store Procedure) 等等相关组成部分。在本次移植工作中, 我们要做的工作是把原先在Oracle上的所有相关数据、程序、服务等等全部移植到全新的SQL Server环境, 因此基于两者数据库架构和原理的一些不同, 这些数据库对象也有很大的不同。而一个完整的数据库系统一般分成数据库服务器端部分和应用程序部分, 两者互相结合。而数据库又包括数据库对象和数据库数据。所以我们进行数据库移植的工作就大致大致可以分成一下几个部分:存储空间的移植、具体对象得数据库移植与数据移植。

2 存储空间的移植

进行数据库的移植先要进行数据库后台级别的移植, 再进行Code级别的移植。我们商业网站的数据库建立在Oracle上的, 一共有18个数据库分散在大小不等的100多个逻辑设备。为此我们就在新的SQL Server数据库中, 创建相对应的18个方案, 来完成存储空间移植的工作。特别是对于表的分区, 一般情况下我们应该能够将数据大致平均地分部在各个分区上。由于网站系统中数据是以时间为单位分部的, 因此将主要数据按月份分为12个区是顺理成章的。不过另一方面, 网站的计算是每天晚上启动的, 启动以后会计算当月或者前一个月的数据, 因此, 在某一个时间单元里面, 数据库对数据的访问也是集中在某个月份的。也就是说这样的分区方法并没有达到我们提高数据表访问并行度从而提高性能的目的, 也无法很好得解决磁盘竞争冲突等问题。由此我们引入了新的分区方法-Hash分区。对数据表的Hash分区可以很好的解决以上所说的并发度和竞争冲突的问题, 不过也存在它的缺陷。所以, 经过针对PnA系统的分析和讨论, 我们决定选择区间和Hash组合的分区方式, 这样既做到了各个分区数据量的大致均等, 又使不同的fund分区存放, 提高了系统访问的并发度。

3 具体对象的数据库移植

在商业网站具体对象的数据库移植, 这些具体对象包括:表、索引、视图以及数据类型。面来具体介绍了数字类型数据库如何实现它在新SQL Server环境中的移植工作。数字类型数据库中是最常见的一种对象类型, 它本身并不复杂, 转换起来也比较方便。可是往往有时由于具体的要求, 表中存放数据对精度的要求比普通数据高很多, 这样就出现一定问题了。特别是商业网站系统, 平时每天都涉及大量的网络数据I/O和相关的计算, 需要最大程度地保证数据精度, 减少计算误差, 保障客户利益。在网站系统中, 原来的数据库上用Oracle中的float类型来表示浮点数, 为了提升精度, 在新的SQL Server系统中我们用NUMBER来表示各种数字, 进行各种计算。Number类型的数字根据其参数的不同, 可以表示成各种精度的整数或者小数, 比如Number (1, 2) , 等等。然而有一个问题需要注意, 我们发现, 简单地将Oracle中的float替换成SQL Server中的Number会产生一个问题。让我们看一个例子。在我们处理的计算中间过程中, 需要从数库里取出一个浮点数并在之后的应用中和其他计算结果相比较, 要求误差在于分之一以内。假设我们读取的是14.9875, 那么我们在Oracle系统中, 用这样的语句来读取并为以后的比较作准备:Select round (value, 3) from table1。相同的, Oracle中我们也用同样的语句来读取。可是我们却发现, 在Oracle中select的结果是14.987, 而在SQL Server中, 这个结果变成了14.988。为了作测试, 我们分别在我们的两个Server上运行如下的语句, 来定位问题的所在。Oracle:Select round (14.9875, 3) ;SQL Server:Select round (14.9875, 3) from dual。

4 数据移植

当存储空间移植完成以后, 我们就可以进行数据的移植。数据的移植在整个移植过程中显得非常重要, 因为它是后面移植工作的基础, 也是保证移植正确性的关键所在。选择一种高效的方式来实现数据移植是十分恰当而有必要的。首先在从Oracle到SQL Server的数据库移植过程中, SQL Server提供的数据库工具OMWB具备了数据移植的功能。不过为了将Oracle中不同的数据库和SQL Server中不同的Schema对应起来, 我们只能选择一种合适的手工参与结合数据库工具的方法, 来实施数据移植的工作。开发人员手工参与的方法有很多, 当然, 最简单直接的就是通过ODBC/JDBC来实现, 然而这是一种比较低效的方法, 在数据量小的时候还可以适用, 在数据量暴增成千上万倍的今天, 这样做带来的只能是速度上的极其低下。我们尝试过对一张千万行级别的表进行了移植, 整个工作要花几天的时间, 并且中间不能间断, 万一有什么意外发生, 前面的工作都将前功尽弃。因此, 这并不是一个好方法。事实上, 网站大部分数据其实都集中在某一部分大表中, 在最终用户环境中, 我们运用基于Oracle的相关脚本来配合我们实现数据库中的数据移植。因为脚本工具相对于ODBC等方法来说, 对数据的操作更加直接, 不需要繁琐的额外过程, 效率特别高。对于我们的两个数据库系统来说, 有很多脚本工具可以选择, 我们只需选择各个数据库产品中相对高效、易于控制的脚本来帮助我们实现就可以了。最后, 由于网络数据库系统的数据敏感性, 我们最后要对移植的结果作出详细严格的测试, 以有效的手段证明数据移植的准确性。我们的目标是移植前后数据相同或在一个很小的可以容忍的误差范围内。前文涉及到这类问题的有空串的移植、浮点精度等问题, 这些都需要我们以适当质量保证手段来确保一致性。

总之, 我们简单总结和介绍了在我们商业网站系统的数据库移植过程中所碰到的和可能碰到的各种问题, 并提出相应的解决方法。不过我们在数据库移植过程中需要根据具体情况对各个方面作出出合适的转换。在实际转换过程中, 我们就根据不同的特点, 提出了不同的数据策略。

摘要:在商业网站运行中, 数据库移植的根本目的在于系统升级, 解决当前系统功能上和性能上存在的问题。所以, 在我们的移植工程中首先要保证逻辑的正确, 做到移植前后的等价性, 然后要对移植后的系统进行性能调优。该文为此具体探讨了商业网站的Oracle数据库移植为SQL Server数据库的理论与应用分析。

关键词:数据库移植,SQL Server,Oracle

参考文献

[1]张晓, 张羽.远程数据库迁移技术研究[J].计算机应用研究, 2005 (4) .

数据移植 篇2

你想要从Windows转换到Linux上去吗? 好的, 就像其他已经走过这一步的用户和企业一样,你可能也是出于Linux的稳定性和开源标准的可靠性而转换系统。 现在你所要做的一切就是仔细地准备好这次转换。

在这里,仔细准备不仅仅意味着在你的系统上装上Linux-不管是你现有的还是一台全新的电脑-它也包括了你的文件、书签、参数和系统设置等。并且在某些情况下需要去找到一款和你以前所使用的Windows应用所相当的开源应用。

Linux安装过程的本身会因发行版本的不同而各有差异,因此你如果事先没有掌握一定的知识,那就先放下这篇文章,先去熟悉一下安装流程再说。 尽管现在的安装流程要比以前简便很多,但尽可能的去熟悉它对你总会有所帮助。 这个方法能够让你就如何移植你的数据和用户设置做出最佳计划,并且防止意外情况的发生。

数据移植的三种方法

有三种基本方法可以将你的用户设置和数据从Windows移植到Linux中:

让Ubuntu Linux替你去做。Ubuntu是目前市面上最为流行的一个Linux发行套件,也是在安装过程中唯一带有内建移植工具的发行套件。

使用第三方应用。

自己动手。

很明显,第三种方法对专业知识的要求是三个方法中最高的,但是它也可以提供给你最大程度上的灵活性,因为你是在自行建立和定制你的系统。

说到灵活性最大化,相比在你现有的电脑上改换操作系统,在一台已装有Linux的新电脑上进行移植将会来的更容易些。 在有一台新电脑的情况下,你可以将那些不确定的东西原封不动的留在旧电脑的系统里。 如果你不得不在你目前装有Windows的电脑上安装运行Linux,那么切记要在移植前备份好你所有的数据。

首先,做备份

不管你采用的是哪一种方法,在移植之前最最首要的事情就是将你无法恢复的所有数据做一个完整的备份。 如果你选择将文件移植成新的格式,那么你要保留好原来的那些文件-如果有某个文件在目前无法被正确转换,你始终有原文件在手里。

尽可能将你的备份做成一个与平台无关的格式,并且将它拷贝到一个在任何平台上都可以读取的设备中。 这样一来,不管你今后是否要在Windows还是Linux中恢复一些数据,你不会碰到任何的意外情况。

最简单的方法就是将所有的文件拷贝到另外一个可以在Linux下读取的磁碟中。 大部分的Linux发行套件本身都可以读取FAT32和NTFS格式的磁碟,所以你可以将你的文件拷贝到另外一个格式化成上述两种Windows格式的硬盘中,这样的话你就可以在Linux下方便的读取那些数据了。 由于FAT32不支持大于4GB的个人文件,因此我推荐你使用NTFS的分区格式。

方法之一是将原始数据压缩成.tgz或.zip格式,大部分普通的压缩软件都可以做到这一点。 在Windows系统上,7-zip压缩软件暂时是我的最佳选择,因为它既是开源软件,又是免费软件。 如果你也想使用这款软件,那么在压缩时选择.zip或.gzip/.tar文件格式,而不是它默认的.7z压缩格式,

该软件在Linux下的格式为p7zip,不过既然市面上的每一个Linux发行套件都通用.zip和.gzip的格式,那么就用它们吧。

顺便说一下,你从一个平台迁移到另一个平台上的东西越多,你就越需要去重新考虑如何安排和分配储存。 如果你想要将文件移植到一个全新的操作系统中的话,那么你最好现在就重新规划一下你的储存结构。 现在的硬盘已经很便宜了,因此将数据存储到第二个硬盘上不再是一个奢侈的空谈,而且从长远来看它能为你省下很多的工作。 (以我自己来说,我就把我的个人文件存放在第二个硬盘上,和操作系统所在的硬盘分隔开来,而第三个硬盘上全是我的音乐图书馆。)

让UBUNTU替你去做

Ubuntu Linux能尽可能的将移植到Linux上的工作做到简单化,它能够让你从现有的Windows系统上将用户文件甚至一些系统定制的用户设置自动移植到Linux中。

目前,Ubuntu似乎是市面上唯一的一个在安装流程中带有此类工具的主流Linux发行套件,尽管这种情况会随着Linux的成长和普及而改变。 如果你现在就想转换到Linux上,并且你希望你的发行套件可以在移植过程中助你一臂之力,那么Ubuntu是目前最好的选择。

当你开始安装Ubuntu时,它会扫描现有系统里的硬件并查看是否装有Windows系统。 如果它找到一个,它就会列出该Windows系统中的所有用户来让你选择移植哪个用户以及拷贝哪种类型的数据到Ubuntu上。 这些选项并不是十分细节化和具体化的-你无法精确的选择到某个具体的文件,而是文件的大致类别-但这个功能却很实用。 比方说,你可以选择你的Internet Explorer收藏夹,或者你目前正在使用的壁纸,你的头像,以及我的文件,我的音乐和我的图片夹中的内容。

Ubuntu升级器的另一个好处是: 它可以不管数据的来源和目的地。 如果在你的某个分区或者硬盘中装有Windows,而你现在想要在Windows所在的位置之外安装Ubuntu,那么升级器就会替你拷贝它所发现到的任何Windows设置和文件(并且/或者让它搬移你所指定的文件)。

这样一来,升级就完全没有破坏性了-这意味着原始文件将纹丝不动。 Ubuntu目前还不支持在Windows界面下转换到Ubuntu-也就是在常规的启动并进入Windows后,插入一张Ubuntu CD然后开始系统转换。目前要转换成Ubuntu系统就必须用Ubuntu的CD来直接启动。

如果你觉得好奇,你可以在Ubuntu发行套件的wiki上阅读一下关于将来Ubuntu移植特性的指南。 举个例子,比方说Mozilla Thunderbird就是其中一个Ubuntu的开发员想要在未来从中移植设置和数据的第三方程序。 在它的规划蓝图上也包括了在Windows界面下转换成Ubuntu的功能。

使用第三方应用

如果你所使用的Linux发行套件并没有自带移植工具,并且你不喜欢自己动手来移植所有东西,那么有不少第三方的工具可以帮你减轻负担。 不管如何,在这里要预先提醒一下,这些工具原本是为企业用户而不是个人用户开发的-它们最适合帮助系统管理员来进行大批量的移植。

肾移植手术数据综合查询系统的建立 篇3

1 材料和方法

1.1 材料硬件

联想便携式电脑 (联想公司) , Windows XP操作系统 (Microsoft公司) , Office 2003办公软件 (Microsoft公司) , Microsoft Visual FoxPro 8.0数据库专用软件 (Microsoft公司) , Microsoft Excel软件 (Microsoft公司) , SPSS 10.0统计软件包。

1.2 广东省第二人民医院实施的活体捐肾和尸体捐肾移植手术患者385例的临床资料, 其中男性240例, 女性145例;

年龄18~73岁, 平均 (45.2±12.9) 岁。

1.3 方法

1.3.1 数据集的字段设定与确立

数据采集字段, 能全面涵盖每一个患者的一般情况、整个发病过程、治疗和随访资料, 并将对应设定字段的信息, 完整输入Microsoft Excel表格。

根据患者术前、手术、术后过程涉及的因素, 设定字段包括患者ID号、姓名、性别、年龄、入院时间、入院科室、首次住院日期、末次出院日期、确诊日期、确诊时年龄、发病到确诊时间、病程、生活习惯和特殊生活习惯、入院诊断、出院诊断、手术医师、经管医师;病理号、病理诊断;术前血尿常规、主要生化检查及肾脏功能分级、分期, 术后血尿常规、主要生化检查及肾脏功;术前免疫检查、术前辅助检查:B超、CT、MR、心电图、胸片/胸透;术前治疗:药物、透析及方法、频率;术前使用免疫球蛋白时间、量;术后使用免疫球蛋白时间、量;手术时间、麻醉方式、手术持续时间、手术中出血量、术前、术后输血种类及数量;术后各项指标及生活质量, 术后排气时间、术后下床活动时间、住院天数、手术费用、住院总费用等130余个不同字段。

1.3.2 数据库建立方法

应用计算机数据库管理技术, 通过Excel表格与FoxPro数据动态连接的方法, 进行肾移植综合查询系统数据库的构建和编程, 从而实现肾移植手术资料的资源共享。

创建可输入、编辑或查看、查询数据, 拥有原始数据库字段框架的窗体。其后应用FoxPro专用数据库程序编译系统进行程序编译, 建立主程序。主程序主要包括以下几个方面的内容:系统的名称, 数据查询系统、数据储存系统、数据交换系统和数据报表系统等, 设置系统内部程序能够运行的环境。

2 结果

成功创建了肾移植综合数据库, 完整导入了本院肾移植手术患者的信息。所建立的肾移植综合查询系统的具有以下的主要功能:

2.1 用户管理和身份的验证功能

为保证患者隐私, 系统对进入系统的用户进行身份验证, 用户都要求拥有一个合法的用户名和密码, 才能够进入系统。系统管理员, 应用系统管理员的身份对系统中的用户进行管理。

2.2 数据的录入

可采用人工录入和电子病历相互对接录入。

2.3 数据查询与统计分析功能

可以对系统的肾移植数据的任意查询, 所需的相关资料可按照各种检索条件进行自由查询。数据可直接与统计软件SPSS、Excel之间实现数据转换、调用, 进行复杂的统计分析。通过对数据库内部病例资料综合分析, 或选取具有某一共同特征的病例进行分析, 进一步发现许多有价值的最佳治疗方案, 同时比较新方法、新术式的治疗效果, 为临床治疗提供科学的指导。通过各地交流, 对不同地域的资料进行对比研究, 分析差异原因, 尤其是流行病学差别的调查研究, 大大减少了人力、物力投入, 缩短临床科研的周期。

2.4 输入输出功能与网络共享功能

系统窗体的设定了报表、资料显示和输出的功能, 通过浏览器可以查看、编辑、汇报及个体资料视图显示、提取、自动生存参数、表等功能, 创建的报表可用来汇总和比较一组数据, 显示分组信息及实现数据的输出, 方便与其他单位共享资源, 交流有关数据。资料可以和Excel、Word等格式的文件相互转换, 满足不同需求, 通过互联网可以方便地与其他医疗协作单位共享资源, 交流有关数据, 实现多中心、大样本的临床协同科研攻关。

3 讨论

肾移植患者个体间生存期从几个月到几十年不等, 即便相同治疗方案, 也有相当大的差异, 这可能与个体差异及总体患者高危组患者所占比例不同有关。尽管目前肾移植的治疗已取得不小的进步, 但患者所处危险组的情况对生存期的影响仍超出治疗方案的作用[1,2,3,4]。因此, 详尽掌握患者疾病资料, 阐明各种疾病相关因素并进行合适的危险组分层, 有利于科学评价、指导治疗、正确评估患者预后。但目前对零碎和无序的临床资料进行人工检索、整理、统计时繁琐、耗时费力、易出错或丢失资料, 不利于临床科研工作的深入开展, 为分析带来了相当大的困难。

随着数据库系统的建立和发展, 电脑及网络已愈来愈广泛地应用于医学的各个领域[5,6,7]。但目前比较实用的单一疾病专科数据库管理系统尚少见, 而这正是临床及科研工作者为深入认识某一疾病所必需的。建立肾移植查询系统的目的首要是实现肾移植手术的任意查询, 其次是统计分析功能、输入输出功能、网络共享功能。在医院的医疗系统中, 患者的各项信息已经存在于系统中, 其包含了患者的各种信息, 但是各种信息的查询不能以患者手术为主要分类, 进行查询的时候必须多次反复地以不同条件进行查询, 并往往有很多遗漏和错误。因此建立一个独立的肾移植综合查询系统是对目前系统的一个有益补充。

数据库是按照数据结构来组织、存储和管理数据的仓库;在日常工作中, 常常需要把某些相关的数据放进“仓库”, 并根据管理的需要进行相应的处理。建立数据库的文件有其特殊的要求: (1) 尽量减少数据的重复, 使数据具有最小的冗余度。 (2) 提高数据的利用率, 使众多用户都能共享数据资源。 (3) 注意保持数据的完整性。 (4) 注意同一数据描述方法的一致性, 使数据操作不致发生混乱。 (5) 对于某些需要保密的数据, 必须增设保密措施。 (6) 数据的查找率高, 根据需要数据应能被及时维护。此外, 数据库技术还为用户提供了非常简便的使用手段。

肾移植综合查询系统在逻辑上由自定义表和数据表应用组成。自定义表包括从基础数据中选取字段、增加新字段、给新数据库命名、形成新数据表。数据表应用包括数据的快速导入、统计、查询、排序、报表输出。系统的主要操作包括肾移植数据资料的录入和现存数据资料的自由查询。实现的方法是对FoxPro数据库进行编程[8]。它不仅支持客户/服务器 (C/S) 结构, 而且具有与其他软件 (如Excel、Word) 高度共享和交换数据的能力。作者依靠Microsoft Visual FoxPro8.0数据库专用软件的各种优越特点, 建立的数据库, 人机界面友好, 而且在关系、关联形式、动态数据交换及链接、与其他Office应用程序紧密集成等方面均有很大的优越性, 对肾移植资料进行结构化管理, 方便数据的查询、存储和共享, 维护了数据的一致性、安全性, 更重要的是它易学易用、功能强大, 大大降低了临床、科研的工作量, 可节约时间, 缩短研究周期;对估测患者预后、指导临床治疗、发现新的疾病危险因素、准确评价治疗方案的疗效、缩短认识疾病发生发展过程都将会起到较好作用, 完全能满足临床科研工作者的需要。

参考文献

[1]Babel N, Gabdrakhmanova L, Hammer M, et al.Induction of pre-transplant Epstein-Barr virus (EBV) infection by donor blood transfusion in EBV-seronegative recipients may reduce risk of post-transplant lymphoproliferative disease in adolescent renal transplant patients:report of two cases[J].Transpl Infect Dis, 2005, 7 (3/4) :133-136.

[2]Vincenti F, Luggen M.T cell costimulation:a rational target in thetherapeutic armamentarium for autoimmune diseases and transpl-antation[J].Annu Rev Med, 2007, 58:347-358.

[3]姜丽萍, 胡善联, 陈文.肾移植免疫抑制治疗方案的决策树分析[J].中国药房, 2007, 18 (2) :82-86.

[4]Keith DS, Cantarovich M, Paraskevas S, et al.Recipient age and risk of chronic allograft nephropathy in primary deceased donor kidney transplant[J].Transpl Int, 2006, 19 (8) :649-656.

[5]李开龙, 张建国.肾脏病临床数据库简介[J].中国中西医结合肾病杂志, 2003, 4 (3) :202-205.

[6]龙莉艳, 张桂云, 张磊.大型综合性医院文献信息系统建设思路[J].中华医院管理杂志, 2007, 23 (1) :33-35.

[7]姜丽萍, 胡善联.肾移植预后影响因素的COX模型分析[J].中华泌尿外科杂志, 2006, 27 (6) :515-517.

数据移植 篇4

1问题描述

对比CMP,JPA采用POJO作为实体对象,不需要实现EJBObject、EJBLocalObject、EJBHome和EJBLocalHome等众多接口,能够支持面向对象的高级特性,例如类之间的继承、多态,而且支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常SQL才提供的高级查询特性。本节以消费者(Customer)和信用卡(CreditCard)为例,说明从CMP移植到JPA过程中可能发生的逻辑错误。假设Customer和CreditCard是一对一双向关联关系,Customer实体关联CreditCard实体,CreditCard实体反向关联它的持有者。

采用CMP技术作为数据持久层,通常调用EJBHome的create的函数初始化Customer的实例cust和CreditCard的实例card,执行cust.setCard(card)后,按照EJB规范中的关联关系赋值规则,EJB容器会建立cust与card的引用,同时自动建立card与cust的关联关系,即判断card.getCustomer()==cust结论为真。

采用JPA技术作为数据持久层,直接使用POJO类初始化函数初始化Customer的实例cust和CreditCard的实例card,执行cust.setCard(card)后,仅仅建立了实例cust指向实例card的引用,即判断card.getCustomer()==cust结论为假。

CMP的实体类是虚类,EJB容器按照EJB规范实现CMP的实体虚类,实现了规范中的赋值规则,而JPA采用POJO作为实体类,只实现了简单的字段存取功能。在对遗留系统移植过程中,如果忽视关系赋值规则,可能发生严重的逻辑错误。

2CMP关系赋值规则

CMP实体组件间存在四种关联关系:一对一、一对多、多对一和多对多。每种关系按照双向关联和单向关联共存在七种可能的关系类型:一对一双向、一对一单向、一对多双向、一对多单向、多对一单向、多对多双向和多对多单向关联关系。由于多对一双向和一对多的双向关联关系是相同的概念,因此将它们合并为一种关系类型。

为了形象描述CMP关联关系赋值规则,本文采用直观的图示来描述:以大写字母A和B表示CMP实体对象;以小写字母后接数字a1,...,an,b1,...,bn表示CMP实体对象的实例;方法getA或者getB返回的是A或者B对象的实例或者实例集合;方法setA或者setB设置对象A或者B实例或者实例集合;实心箭头表示引用;表达式表示执行的操作;空心箭头表示执行表达式后的实例之间的关联状态。图1~图6展示了七种类型的关联关系的赋值规则。

对于a.setB(b)赋值操作,本文称a为引用方,b为被引用方,a的原引用方bOld,b的原引用方aOld,b到a的关系为a到b的逆向关系。关联关系赋值规则具有以下特点,具体见表1:

(“√”代表建立关系;“×”代表删除关系;“―”代表无操作)

表1中有特别之处,对于一对一单向和一对多单向关联关系的赋值操作包含有删除aOld→b关系,因此对于一对一单向和一对多单向关联关系存在着隐式逆向关联关系,否则仅仅从关联对象b无法获知其原关联对象aOld。

3解决方案

JPA采用的是POJO作为实体对象,它对于实体对象中字段的存取函数的实现比较简洁,例如获取函数方法体一般直接返回实体对象类中的成员变量,设置函数方法体一般直接将输入参数直接赋值到实体对象类中的成员变量。从上节对CMP关系赋值规则的分析,对遗留系统中CMP数据持久层向JPA移植过程中,如果忽视CMP实体间的关联关系赋值规则,则会引起严重的逻辑错误。本文将通过增强POJO实体源代码的方法来保证移植应用的逻辑一致性。本节首先描述源代码增强算法,然后给出算法实现方案,最后介绍测试用例。

3.1算法描述

本文使用伪代码描述算法,描述三种重要操作的算法:赋值操作、集合对象的增加(add)和删除(remove)操作。相关符号定义如下:R(a, b)表示a对b的关系;AddRelation(a, b)表示建立a到b的关系;DelRelation(a, b)表示拆除a到b的关系;(1n)表示一对多双向关系。算法中不区分显式关联关系和隐式关联关系,忽略取值为空等异常情况的判断。

(1)赋值操作a.setB(b)

BEGIN a.setB(b)

(2)集合增加元素a.getB().add(b)

(3)集合删除元素a.getB().remove(b)

3.2算法实现

本文采用Eclipse的抽象语法树AST[6](Abstract Syntax Tree)工具对JPA的简单Java对象进行源代码级的增强。抽象语法树采用XML直观地表示源代码的语法结构,对AST遍历和操作十分方便。

根据EJB规范,CMP中的集合对象类型只可能是java.util.Collection和java.util.Set两种类型,使用JDK(Java SE Development Kit)中的集合实现类ArrayList、LinkedList、HashSet、TreeSet等是无法满足CMP的关联关系赋值规则的,必须新实现这两个集合类接口。本文通过继承java.util.ArrayList实现java.util.Collection接口,通过继承java.util.HashSet实现java.util.Set接口,为了保证正确处理关联关系的赋值规则,重写六个函数add、addAll、remove、removeAll、clear和retainAll。函数add和remove为基础函数,其他函数包括addAll、removeAll、clear、retainAll的实现是对元素逐个迭代调用add和remove基础函数完成元素的添加或删除与元素对应的逆向关联关系的建立或者删除。

使用AST工具对简单Java对象的代码级增强过程如下:逐个读取简单Java对象源文件,遍历源文件,查找到关联关系设置函数,读取函数声明前的注释(Annotation),获取关联关系类别及关联方向,在函数体内加入本文提出的算法。对于简单Java对象中的集合对象变量,均以本文新实现的集合对象初始化。对于一对一单向和一对多单向关联关系,需要在简单Java对象中加入非序列化(transient)字典(Map)变量,记录隐式关联关系

3.3测试

按照上述七类关联关系的图例,依次编写测试用例[7],部署到EJB3应用服务器中,进行容器内测试。本文以图1所示的一对一双向关联关系赋值规则为示例主要测试用例如下:assurtTrue((b2==a1.getB()) && (a2.getB() == null) && (b1.getA() == null) && (a1==b2.getA()))。经过测试,证明本文提出的源码增强方法能够满足CMP原有的赋值规则。

4总结及下一步工作展望

本文分析了EJB2.0和EJB2.1中容器管理Bean的关联关系赋值的复杂规则,针对CMP向JPA移植过程中可能发生的逻辑错误问题,提出了对JPA中简单Java对象进行源代码增强方法,保障了移植遗留应用的逻辑一致性。JPA和JDO以及Hibernate等O/R mapping框架都非常相似,该方法亦适用于CMP向Hibernate、JDO等ORM映射工具的移植。下一步工作是将本文提出的算法采用面向方面的编程(AOP)技术和Java字节码增强[8]技术动态加入到事务环境中,使得POJO关联关系的赋值规则只在事务环境内有效。

摘要:针对EJB2的容器管理Bean向Java持久化API移植可能出现逻辑错误的问题,全面归纳了容器管理Bean之间七种类型的关联关系的赋值规则,提出了处理各种关联关系赋值规则的通用算法,利用Eclipse的抽象语法树工具实现该算法,对Java持久化API的简单Java对象的源代码自动修改,保障了移植后的应用与基于EJB2技术的遗留系统的逻辑一致性。

关键词:容器管理Bean,JAVA持久化API,赋值规则,抽象语法

参考文献

[1]何成万,余秋惠.JDO初探.计算机工程,2002,28(6):282~283,286

[2]邢波.用ibatis提升一类数据库检索查询的性能.计算机应用与软件,2007,24(12):205~207

[3]田坷,谢世波,方马.J2EE数据库持久层的解决方案.计算机工程,2003,29(22):93~95

[4]Sun Microsystems.JSR-000220Enterprise JavaBeans v.3.0[EB/OL].[2006-5-8]http://jcp.org/aboutJava/communi-typrocess/final/jsr220/index.html.

[5]Sun Microsystems.Enterprise JavaBeans Specification Version:2.1[EB/OL].[2003-11-24].http://java.sun.com/prod-ucts/ejb/docs.html.

[6]G.Fischer,J.Lusiardi,J.Wolff von Gudenberg.Abstract Syntax Trees-and their Role in Model Driven Software Development.International Conference on Software Engineering Advances(ECSEA'07),2007,pages:38.

[7]郑人杰.计算机软件测试技术.北京:清华大学出版社,1992.

数据移植 篇5

1 硬件系统组成

虚拟仪器的硬件包括:传感器、调理电路、BNC-2120接线端子盒、PCI-6024E数据采集卡和PC机。

National Instruments BNC-2120 系列屏蔽接线盒在BNC连接器上贴有标签, 可以方便地将模拟输入、模拟输出、数字I/O和计数器/定时器信号连接到M系列或E系列的DAQ设备上。丰富的接线端子为数据采集系统的移植提供了有力的条件, 降低了开发周期, 提高了系统的有效利用率。

PCI-6024E是美国NI公司生产的多功能接口卡, 它集12位A/D转换器、12位D/A转换器、16路单端接地的模拟输入通道、8或24位并行输入输出线 (5V/TTL) 及两路24位定时器与计数器于一体。支持DMA方式和双缓冲区模式, 保证了实时信号不间断采集与存储。双极性时, 输入电压范围选择0.1、1.0、10.0、20.0V 4种, 最高采样率为200kB/s, 主要完成数据采集功能[3]。实际应用中, BNC双绞屏蔽线与信号源相连, BNC端口与BNC-2120接线端子盒的BNC接线端子连接, 信号源的类型和数量发生变化时, 只需要更改BNC接线端子的类型与数量, 便可实现仪器的可移植性。

2011-02-21

2 Lab VIEW软件程序设计

2.1 Lab VIEW数据采集辅助工具

程序设计中, 利用NI-Measurement & Automation工具在设备与接口中找到数据采集卡PCI-6024E, 根据数据采集卡参数进行数据采集配置, 其中包括信号类型、输入 (单端或差分输入) 模式分辨率、输入范围、采样速率、精度和噪声等。根据采集信号类型合理的配置采集模块, 能准确有效地采集到所需信号。

2.2 数据采集程序的搭建

根据需创建的任务类型, 可用多种方法创建程序代码。NI-DAQmx提供了多种VI程序以建立数据采集任务, 较为方便快捷的是DAQ Assistant (数据采集助手) , 用于创建虚拟通道并可以直接设置测试范围、采集点数、采集方式等基本选项, 利用DAQ Assistant功能可以搭建较为简单的数据采集系统, 满足基本的采集要求。Lab VIEW 8.2还提供了10个用于数据采集的底层VI以详细配置数据采集任务并完成程序代码的设计, 这10个数据采集底层VI基本可以完成80%的数据采集任务, 针对性强, 易于修改和整定。

在数据采集的框图程序设计中, 可以直接对数据采集底层VI的各种参数进行修改。通过NI-DAQmx创建虚拟通道函数, 创建一个虚拟通道并添加成一个任务, 也创建多个虚拟通道并将它们都添加至一个任务, 这种简单方便的编程方式更加利于快速搭建起数据采集系统, 同时所建立的数据采集系统可以实现多路单一类型的信号采集, 也可以实现多路多种类型的信号采集。根据采集信号类型与数量的不同可以选择不同的通道来改变采集任务, 真正做到软件即是硬件的功能实现。

3 实验范例

利用上述实验平台与程序, 在实验室环境下同时对示波器标准正弦信号与方波信号进行数据采集, 只需要将BNC接线端子与信号发生器相连就可以实现采集系统的移植, 修改相应的参数, 得到所采集的信号。

4 结束语

Lab VIEW作为一种图形化编程设计语言, 对于虚拟测试系统, 具有强大且方便快捷的功能。以Lab VIEW作为系统开发平台, 利用可以与Lab VIEW兼容的PCI-6024E数据采集卡, 通过使用与其配套的NI-DAmx和NI-Measurement & Automation等方便实用的工具, 能够快速有效地建立起数据采集系统, 减少开发时间, 同时利用BNC-2120多功能接线盒, 可以方便地实现数据采集系统的移植和重复利用。该系统中, 硬件系统结构简单, 软件编程快速方便, 人机界面友好, 并且可以方便地对系统进行扩充与修改, 实现了对信号的实时采集、显示、数据的自动储存和报警等功能。

摘要:以Lab VIEW图形化编程软件为开发平台, 结合BNC2120接线端子盒与NI PCI-6024E数据采集卡设计快速有效、多功能可移植性数据采集系统。

关键词:Lab VIEW,BNC2120,PCI-6024E,可移植

参考文献

[1]胡仁喜, 王恒海, 齐东明等.Lab VIEW 8.2.1虚拟仪器实例指导教程[M].北京:机械工业出版社, 2007.

[2]刘海东, 刘磊, 江桦.基于PCI总线的多功能虚拟仪器[J].信息工程大学学报, 2006, 7 (6) :176~178.

数据移植 篇6

关键词:嵌入式数据库,MIPS处理器,SQLite,加密算法

0 引 言

嵌入式数据库是指运行在本机上、不用启动服务端的轻型数据库,它与应用程序紧密集成,被应用程序所启动,并伴随应用程序的退出而终止。嵌入式数据库嵌入到了应用程序进程中,消除了传统数据库客户端与服务器之间通讯开销。嵌入式数据库是轻量级的数据库,运行时只需要占用较少的内存。同时,嵌入式数据库是使用C代码编写的,对于嵌入式设备,其速度更快,资源占用更少。从目前嵌入式应用的发展趋势来看,嵌入式数据库的实现必须实现可定制、可裁剪,即系统选择的技术路线要面向具体的行业应用,因而研究源码开放的嵌入式数据库具有特殊意义。

1 嵌入式数据库

1.1 嵌入式数据库的特点

通常,我们采用数据库来实现对数据的存储、检索等功能。像MySQL这类基于C/S结构的关系型数据库系统,虽然代表着目前数据库应用的主流,却并不能满足所有应用场合的需要。在某些特殊应用场合,比如在嵌入式系统中,由于系统的硬件软件资源都有限,这些数据库产品就明显有一些臃肿,甚至是不可实现的。在这些情况下,嵌入式数据库的优势就特别明显了。嵌入式数据库的一个很重要的特点是它们的体积非常小,编译后的产品也不过几十kB,可以很方便地应用在掌上电脑、PDA、车载设备、移动电话等MySQL、SQL Server这些大中型数据库不可实现的嵌入式设备上。

1.2 Berkeley DB和SQLite的比较

Berkeley DB和SQLite是源码开放的嵌入式数据库系统。体积小巧,速度又很快。但是他们各具特点。

Berkeley DB不是关系型的数据库,不能应用标准的SQL语句对数据库操作,对它的操作要调用专用的API实现。SQLite的SQL语言很大程度上实现了ANSI SQL92标准,特别是支持视图、触发器、事务,支持嵌套SQL。它通过SQL编译器(SQL Complier)来实现SQL语言对数据库进行操作,支持大部分的SQL命令,并可以将数据文件放在内存中和存储介质中。

Berkeley DB为许多编程语言提供了实用的API接口,包括C、C++、Java、Perl、Tcl、Python和PHP等。它适用平台UNIX/POSIX systems、Win32以及嵌入式操作系统WinCE、VxWorks等。SQLite通过Wrapper实现了与其它语言的连接。所谓Wrapper即对SQLite提供的接口进行封装,使其它语言可以访问、使用SQLite。SQLite本身提供C和Tcl的接口,世界各地的程序员还提供了各种语言的SQLite的接口封装,如Python、C++、Java、.Net等几乎所有流行的语言基本都有。

Berkeley DB没有数据库服务器的概念,使用简单的函数调用接口来完成所有的数据库操作,不使用SQL语言;接口简明实用,避免了对结构化查询语言进行解析和处理所需的开销,提高了执行速度;速度极快,可靠性高,但学习起来有一定难度。SQLite则简单易用,速度也很快,但功能却较Berkeley略有逊色,比如加密功能、二进制数据的处理等。

Berkeley DB虽然是开源的产品,但对某些条件下的应用却不是免费的,而且价格颇为昂贵。SQLite是源代码完全开放的,可以免费用于任何用途,包括商业目的。

基于以上比较,我们选取了SQLite作为我们的数据库。

1.3 SQLite特点

SQLite是D.Richard Hipp在2000年开发的一个小型嵌入式数据库。它是完全独立的,不具外部依赖性,可以较为方便地应用于嵌入式系统中。其源代码完全开放,可以免费使用。SQLite虽然是个极端轻量级的关系数据库,却保留了数据库的大部分特征。它提供了对SQL92标准的大多数支持:支持多表和索引、事务、视图、触发和一系列的用户接口及驱动。其主要特征如下:

(1) 支持原子的、一致的、独立的和持久的(ACID)事务特性,即使系统崩溃和掉电。

(2) 零配置(Zero2configuration),无需安装和管理。

(3) 一个完整的数据库存储在单一磁盘文件中。

(4) 数据库文件可以在不同字节顺序的机器间自由共享。

(5) 支持数据库大小至2 TB。

(6) 字符串和二进制大对象(BLOBs)的大小仅被有效内存限制

(7) 源码体积小,编译后低于250 kB。

(8) 大部分的操作比关系型数据库引擎要快。

(9) 简单易用的API,支持标准的SQL语句数据库操作。

(10) 基于KEY—VAL模型的数据存储模型,兼容各种复杂应用场合。

2 基于MIPS的嵌入式数据库SQLite的移植

MIPS是世界上很流行的一种RISC处理器。MIPS的意思是无内部互锁流水级的微处理器,其机制是尽量利用软件方法来避免流水线中的数据相关问题。MIPS处理器以及其高性能的处理能力被广泛应用于宽带接入、路由器、调制解调设备、电视、游戏机、打印机、办公用品、DVD播放、IPTV机顶盒等领域。由于嵌入式系统的特点,有很多应用程序不能像在PC机上那么方便。我们必须根据嵌入式系统的硬件特点对其进行移植,下面介绍基于MIPS的嵌入式数据库SQLite的移植。

SQLite嵌入式数据库式以源代码的方式提供给用户,我们可以很方便的从互联网上下载,然后根据自己项目的具体情况和硬件平台,对其源代码进行相应的修改、编译和应用。

2.1 下载源代码

(1) 在自己的工作主机上建立一个目录/home/sqlite。

(2) 从http://www.sqlite.org/下载SQLite 最新的版本sqlite-3.6.23.1.tar.gz,并将其保存到/home/sqlite目录下。

使用命令:wget http://www.sqlite.org/sqlite-amalgamation-3.6.23.1.tar.gz。

(3) 通过下列命令解压缩sqlite-amalgamation-3.6.23.1.tar.gz并将文件和目录从归档文件中抽取出来:

解压抽取完成之后将会在/home/sqlite目录下生成一个sqlite-3.6.23.1/子目录,在该目录中包含了编译所需要的所有源文件和配置脚本。SQLite3的所有源代码文件都位于sqlite-3.6.23.1/目录下。

2.2 安装交叉编译工具

由于编译好的程序是运行在嵌入式系统上的,因此编译时的配置和所用的工具跟硬件环境息息相关。我们用到的主处理器是MIPS架构的,所以必须安装MIPS的交叉编译工具。

(1) 创建/home/crosstool目录,将MIPS的交叉工具链安装到此目录下(用的是现成的安装包),并运行以下命令:

# export PATH=/home/crosstool/bin:$PATH

(2) 用″echo$PATH″命令查看PATH中是否已经包含交叉编译工具mips-linux-gcc。如果包含,说明交叉编译工具链已经安装,可以进行下一步了。

2.3 修改编译文件

和在PC环境下应用SQLite3相同,SQLite3完全支持嵌入式交叉编译与应用。通过sqlite-3.6.23.1/目录下的configure脚本来生成Makefile文件。并通过configure配置SQLite3的具体特性。

(1) 首先通过下面的命令生成Makefile

(2)通过configure配置SQLite3的专属特性

(3) 运行一下命令编译sqlite

# make

编译完成之后,将在sqlite-3.6.23.1/目录下生成静态链接库.libs/libsqlite3.a。头文件sqlite3.h,这就是所需要的两个文件了。

2.4 运行SQLite

这里以SQLite官方站点中的测试程序对移植到mips-Linux上的SQLite3进行测试。将测试程序下载到/home/test下。用下面的命令进行编译。

#mipsel-unclibc-gcc -I/home/sqlite/ sqlite-3.6.23.1-L /home/lsqlite/ sqlite-3.6.23.1/.libs-o test test.c-lsqlite3-ldl

将test下载到MIPS板上,用以下命令修改test权限

#chmod+x test

接下来就可以测试test程序了。test程序接受两个参数:第一个参数为数据库文件名,第二个参数为要执行的SQL语句。

通过以上过程,可以成功地将SQLITE移植到MIPS上。然后就可以进一步地应用开发。

3 SQLite加密算法

SQLite不提供网络访问服务,它使用单一文件存储数据库的结构和内容。这使得数据库非常轻便,而且便于移植。数据库没有用户管理、访问控制和授权机制,它利用操作系统对文件的访问控制能力实施文件级别访问控制。即:凡是操作系统的合法用户,只要该用户对数据库文件具有读/写权限,就可以直接访问数据库文件。开源的SQLite数据库不提供加密机制,因此不提供数据级的保密性。此外SQLite的存储格式简单,不需专门的工具使用任何文本编辑器都可以查看文件的内容。

为了保持SQLite的优点,同时提供其安全性,我们可以对其数据库进行加密。数据库加密有两种方式:1)在数据库管理系统DBMS(Data BaseManagementSystem)中实现加密功能,即在从数据库中读数据和向数据库中写数据时执行加解密操作;2)应用层加密,即在应用程序中对数据库的某些字段的值进行加密,DBMS管理的是加密后的密文。SQLite源码中预留了加密接口,可以实现DBMS级的加密

在开源的SQLite代码中,已经预留了加密接口,主要包括四个函数的原型:在sqlite3.h中提供了sqlite3_key()和sqlite3_rekey()函数的原型,前者用于指定数据库使用的密钥,后者用于为数据库重新设定密钥;在文件attach.c中提供了密钥与数据库关联的接口函数,即函数sqlite3CodecGetKey()和sqlite3CodecAttach,前者用于返回数据库的当前密钥,后者用于将密钥及页面编码函数与数据库进行关联。要实现SQLite数据库的加密功能,必须给出这几个关键函数的具体实现,同时还要提供数据加解密函数、页面编码函数等必备函数。

密码学是一个庞大复杂的学科,作为普通的数据库开发者不可能为了加密SQLite而耗费大量时间去学习这门学科,我们只需要在sqlite3_key接口中调用一些加密API即可(如OpenSSL)。本文采用了比DES更为先进的使用Rijndael算法的AES实现了SQLite的加密接口。Rijndael是一个反复运算的加密算法,它允许可变动的数据区块及密钥的长度。数据区块与密钥长度的变动是各自独立的。Rijndael算法在网上很容易找到C语言的代码,我们只需要将其代码抽出来,加到上面所说的加密接口中,重新编译,即可以得到已经可以加密的数据库SQLite。到这里,你就可以在你的程序中使用这个AES加密的SQLite库了。加密数据库的方法,就是在打开数据库后,在进行读写操作前,用自己指定的密匙调用SQLite的加密函数:

#sqlite3_key(pdb,″abcde″,5);

其中,pdb是刚刚打开的数据库的指针,abcde是密匙,5代表密匙长度

4 结束语

嵌入式系统的特点就在于其应用的针对性很强,本设计针对MIPS平台,对SQLite进行了移植,并针对SQLite没有加密算法的弱点进行了改进,经过测试,成功地在MIPS平台上实现了SQLite数据库的加密。对其他基于MIPS的处理器的嵌入式系统的开发设计具有很好的参考意义。并且通过在不同的编译环境中实现设计的运行,对不同的GCC编译器对程序移植的影响和需要修改的要点积累了一些经验,为今后的开发工作打下了良好的基础。

参考文献

[1]熊志金.基于ARM的嵌入式电力远程监测系统的研究[D].武汉:武汉理工大学自动化学院,2004.

[2]黄布毅,张晓华.基于ARM-Linux的SQLite嵌入式数据库技术[J].单片机与嵌入式系统应用,2005(4):2124.

[3]廖顺和.嵌入式数据库加密方法分析与研究[J].计算机应用与软件,2008,25(11):256258.

[4]董淳光.SQLITE3加密总结[EB/OL].(20070814)[20090409].ht-tp://www.sqlite.com.cn/bbs/topicdisp.asp?tid=1402.

数据移植 篇7

My SQL是目前最流行的开放源代码数据库管理系统,它为Internet网站、搜索引擎、数据仓库、任务关键的软件应用和系统提供动力。目前的MySQL数据库版本没有支持基于嵌入式Linux平台的交叉编译,这使很多嵌入式爱好者使用起来非常不方便,甚至放弃使用MySQL数据库的方案。

MySQL在嵌入式上的应用主要有两种,一种是使用交叉编译出的MySQL的嵌入式应用程序,使用MySQL语句对本地或是远程数据库进行访问;另外一种是使用MySQL提供的C语言API函数编写符合用户要求的应用程序,对数据库进行访问。前者的使用与其在什么平台下工作是没有区别的,都是使用MySQL语句对数据库进行操作。关于第二种方式的研究还未见有报道,本文主要对第二种应用方式进行介绍。

1 My SQL数据库的交叉编译和移植

1.1 My SQL数据库在PC-Linux平台上的编译和安装

因为My SQL完全支持在PC-Linux平台上的编译,所以在这里的编译步骤比较简单也比较顺利。同时,在下面对MySQL交叉编译时,也会需要用到在PC-Linux编译的相关文件。本文使用的宿主机平台为PC机-RedHat 9.0,MySQL源码包版本为5.0.18。

(1)通过configure脚本生成Makefile,

在终端内输入:

设定安装路径,其他配置均为默认。

(2)编译。使用make指令进行MySQL源码的编译。

(3)安装。使用make install指令进行MySQL的安装。

(4)运行。安装完成后,运行MySQL程序的时候出现错误:

这是由于mysql默认的mysql.sock是在/var/lib/mysql/mysql.sock,但Linux系统总是自动去目录/tmp/下查找,所以会报错。该问题可以通过创建符号链接的方式解决,即使用ln指令为mysql.sock文件增加软连接。

1.2 MySQL数据库在嵌入式Linux平台上的交叉编译和安装

本文使用arm-linux-gcc 3.4.1作为交叉编译器。目标机ARM芯片为Samsung 2440,目标机内核版本为2.6.13。MySQL源码包版本为Mysql-5.0.18。

(1)移植ncurses库。ncurses提供字符终端处理库。ncurse库通过对终端原始控制代码的封装,向用户提供了一个灵活高效的应用程序接口函数。

ncurses是MySQL编译的依赖库,因此必须对Ncurses进行交叉编译,创建库文件之后,才能够对MySQL数据库进行交叉编译。如果不进行ncurses库的移植,生成Makefile时会出现如下错误:

本文采用的ncurse库版本为5.4。

首先,使用configure脚本生成Makefile:

然后,运行make和make install命令即可完成交叉编译。

(2)通过configure脚本生成Makefile文件。配置参数如下,在终端内输入:

其中,CC=arm-linux-gcc为配置交叉编译器参数,--with-named-curses-libs为ncurses库文件路径参数,–with-charset=gb2312为支持gb2312中文编码显示参数。

在生成Makefile的时候发生错误:

configure脚本强制退出,终端上显示“return type of sprintf:error:cannot run test program while cross compiling”以及“error:Your compiler cannot convert a longlong valueto a float!”等错误提示。

经过检查configure脚本,发现脚本运行到检测crosscompile时就提示以上错误并强制退出,说明MySQL并不支持交叉编译,但为了让编译继续,只能在configure脚本中将多处这样的命令全都注释掉以让configure通过。只需注释掉强行退出的代码就可以,即注释“{(exit 1);exit 1;};”。

(3)交叉编译。在终端上输入make指令,开始对MySQL源码进行交叉编译。

a.发生错误“../extra/comp_err:../extra/

comp_err:cannot execute binary file”。

这是因为编译过程中要运行comp_err程序,但这个程序是ARM嵌入式系统上的二进制应用程序,在PC机上无法运行。解决方法是从上面编译好的PC-Linux相应目录下将comp_err程序拷贝出来,覆盖extra下的这个ARM系统的comp_err程序。在进行覆盖之前最好将交叉编译生成的comp_err程序进行备份。

b.当程序编译到mysql/sql目录下发生错误“./gen_lex_hash:cannot execute binary file”。

原因和解决方法基本和上面遇到的问题相同,但这里还要使用如下命令:

“touch–m sql/gen_lex_hash”。

上面的命令是刷新gen_lex_hash文件的最后修改时间,这样做的目的是告诉编译器gen_lex_hash文件已经是最新的了,防止编译器重新生成该文件,否则编译器检查gen_lex_hash和它的依赖文件的最后修改时间会发现gen_lex_hash比它的依赖文件更旧,就会重新交叉编译并生成该文件,如果这样的话不管做几次覆盖的工作,此类都还会再现。

c.当程序编译到mysql/sql目录下发生错误“gen_lex_hash.o:could not read symbols:File in wrong format”和“g++:../zlib/.libs/libz.so:No such file or directory”。

经过对Makefile文件的观察,发现这些错误都是在生成lex_hash.h文件的时候产生的,所以直接从编译好的PC-Linux版本中拷贝这个文件到此目录下,同样要执行“touch–m lex_hash.h”来改变最后修改时间。

(4)安装。运行make install命令。对交叉编译好的MySQL程序进行安装。这一步没有报错,在指定的目录下生成了交叉编译完成的运行在ARM上的文件,但进入这个目录的bin目录下可以看到这里有一个comp_err程序,它实际上是刚刚从PC-Linux拷贝过来覆盖的程序,在ARM上不能运行,需要把刚刚备份的comp_err程序重新覆盖回来,以保证它能在嵌入式Linux系统运行。

(5)移植与测试。将安装目录下的lib、include、bin等文件夹拷贝到ARM文件系统的相同位置,没有该文件夹的需要创建。

运行一个测试程序,出现错误:“bin/mysql:error while loading shared libraries:libmysqlclient.so.15:cannot open shared object file:No such file or directory”。

经检查发现该文件夹下确实有上述所说的文件,可以使用ln命令创建软链接。即在终端输入:“ln-s/usr/local/arm/lib/mysql/libmysqlclient.so.15/lib/libmysqlclient.so.15”即可。

2 MySQL数据库的应用

2.1 概述

利用MySQL数据库提供的C语言API通过网络登陆远程的数据库,获取数据并保存。系统框图如图1所示。

图1远程登录数据库系统框图(参见右栏)

2.2 开启MySQL数据库的远程登录权限

My SQL数据库的默认配置是无法使用远程客户端登录本地数据库的,若要开通远程登录功能,需要使用以下两个命令:a.GRANT ALL ON*.*TO admin@'%IDENTIFIED BY'admin'WITH GRANT OPTION;b.flush privileges;其中“%”表示任意的IP地址,也可以指定特定的IP地址。上面的两个命令是指管理员用户可以在任意的电脑上使用管理员用户名和密码来登录服务器上的MySQL数据库。

2.3 数据的查询与获取

当登陆到远程的My SQL数据库服务器之后,mysql_query()函数将被调用来发送查询语句到服务器上并执行。这种查询可以是MySQL服务器能够接受的任何有效的SQL查询。一旦查询已经进行,如果是SELECT查询的话,产生的结果集会带一个包含mysql_store_result()函数的变量,这个变量实际上是指向MYSQL_RES结构的指针。然后可以通过mysql_fetch_row()函数访问结果集中包含的记录,该函数可以每次读一条记录,使之进入特殊的MYSQL_ROW结构。这个结构仅仅是一个数组,每个元素代表记录的一个字段。一旦结果集中所有的记录都经过了检索,函数返回一个NULL值,然后需要运行mysql_free_result()函数重新分配结果集使用的内存。

但是,当获得满足SELECT查询语句条件的数据时,往往不知道满足该条件的数据有几条,如果使用结构体对获得的数据进行保存的话,则会出现内存浪费和溢出等问题。所以这里选择使用链表结构来进行数据的保存和进一步处理。

链表是可以动态地进行存储分配的一种结构,链表中的元素个数可以根据需要增加和减少。在这里使用的是单向链表,单向链表通常由一个头指针,用于指向链表头。链表的具体结构如图2所示。

下面是建立动态链表的程序示例:

通过这样,就可以对获得的满足查询语句条件的数据进一步地处理了。本文通过MiniGUI嵌入式图形界面支持系统创建界面,将查询相关信息显示出来。MiniGUI为应用程序定义了一组轻量级的窗口和图形设备接口。利用这些接口,每个应用程序可以建立多个主窗口,然后在这些主窗口中创建按钮、编辑框等控件。如图3所示,这是一个值班历史记录的查询界面,通过在界面

下部的查询框内填入相关查询条件,就可以使用网络登录远程的数据库进行查询,并将查询结果显示在界面上部的表格内。

3 结束语

对My SQL数据库和嵌入式Linux系统进行了简单介绍,重点描述了MySQL数据库在嵌入式Linux系统上的移植,并结合MiniGUI列举了一个在嵌入式系统上通过网络登录远程的MySQL数据库的相关应用。

参考文献

[1]Vaswani V.MySQL完全手册[M].北京:电子工业出版社,2004.

[2]张碧武,杨丰萍.基于嵌入式Linux的MySQL数据库的图形化管理[J].华东交通大学学报,2007(5):121-124.

[3]王卓,包杰.嵌入式Linux系统及其应用前景[J].单片机与嵌入式系统应用,2004(5):5-8.

[4]冯博,冯浩,徐莹.SQL实用教程[M].北京:清华大学出版社,2006.

本文来自 古文书网(www.gwbook.cn),转载请保留网址和出处

相关文章:

移植治疗02-21

冻融囊胚移植02-21

无线探测02-21

行星探测02-21

探测试验02-21

弹性刚度02-21

企业会计差异下的预算会计论文02-21

组织弹性02-21

弹性性能02-21

弹性处理02-21

注:本文为网友上传,旨在传播知识,不代表本站观点,与本站立场无关。若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:66553826@qq.com

上一篇:移植治疗 下一篇:弹性刚度