当前位置:文档之家› 用ProC开发多线程应用程序-数据库专家

用ProC开发多线程应用程序-数据库专家

用ProC开发多线程应用程序-数据库专家
用ProC开发多线程应用程序-数据库专家

用Pro*C开发多线程应用程序-数据库专家

代码:

(注:本文来自Pro*C/C++ Precompiler Programmer's Guide Release 8.1.5)

如果你的操作系统不支持线程,本文暂不适合你。本文包含以下几个部分:

n 什么是多线程?

n Pro*C中的运行时上下文

n 运行时上下文的使用模式

n 多线程应用程序的用户接口

n 多线程例子

一.什么是多线程?

一个多线程的应用程序中,线程运行在共享的地址空间里。线程是在进程内部执行的“轻量”级子进程,它们共享代码段和数据段,但是有自己的程序计数器、寄存器和堆栈。全局变量和静态变量在线程之间是共享的,因此通常需要在程序中使用某种互斥机制来管理线程对这些变量的访问,互斥体Mutexes就是用来保证数据完整性的同步装置。

有关互斥体的更多讨论,参看多线程编程方面的文章。

Proc*C编译器通过以下方式支持开发多线程的Oracle应用程序(在支持线程的平台上):

n 用一个命令行编译选项来产生线程安全的代码

n 用内嵌的SQL语句和指令支持多线程

n 线程安全的Lib库和其他客户端Lib库

注意:也许你的平台支持某个特殊的线程包,但还是需要查看Oracle有关平台的文档,看看Oracle是否支持它。

二.Pro*C中的运行时上下文

为了在线程和数据库连接之间建立松散的结合,Pro*C引入了一个概念

runtime_context,我们称之为运行时上下文。一个运行时上下文包含了以下资源和信息:

n 与数据库服务器的连接

n 当前连接上使用的游标

n 内嵌的一些选项,如MODE,HOLD_CURSOR,RELEASE_CURSOR和SELECT_ERROR

不仅仅是简单的支持线程和连接之间的松散结合,Pro*C编译器还允许开发人员在线程和运行时上下文之间建立松散的结合,Pro*C允许在程序里为运行时上下文定义一个句柄,通过这个句柄,运行时上下文可以在线程之间切换。

例如,一个交互式应用程序创建了线程T1,来执行一个查询,并且返回了前10条记录,然后T1终止。在用户输入了必须的数据之后,程序又创建了线程T2,并且把T1使用的运行时上下文传给T2,这样T2可以在同一个游标上获取接下来10条的记录。

三.运行时上下文的使用模式

下面是在多线程的Pro*C程序中使用运行时上下文的两种可能模式:

n 多线程共享单个运行时上下文

n 多线程使用互相独立的运行时上下文

不管采用哪种模式,不能在同一时刻多个线程共享同一个运行时上下文。如果两个或两个以上的线程在同一时刻试图使用同一个运行时上下文,将会出现以下错误:SQL-02131: Runtime context in use。

1.多线程共享单个运行时上下文

2.多线程使用互相独立的运行时上下文

四.多线程应用程序的用户接口

Pro*C编译器提供以下接口来支持多线程:

n 命令行选项,THREADS=YES|NO

n 内嵌SQL语句和指令

n 线程安全的公共库函数

1.THREADS选项

在proc预编译命令行上指定THREADS=YES,Pro*C编译器将保证产生的C代码是线程安全的。如果指定了THREADS=YES, Pro*C将会检查每个包含SQL执行语句的函数,是否指定了这些语句是在哪个运行时上下文中执行的,若没有发现这类指定标识,编译

器就会返回错误。

2.内嵌SQL语句和指令

下列内嵌的SQL语句和指令用于支持多线程和运行时上下文的使用:

n EXEC SQL ENABLE THREADS;

n EXEC SQL CONTEXT ALLOCATE :context_var;

n EXEC SQL CONTEXT USE {:context_var/DEFAULT};

n EXEC SQL CONTEXT FREE :context_var;

在以上SQL语句中,context_var是运行时上下文句柄,它必须被定义成sql_context 类型:如sql_context context_var;

使用DEFAULT意味着接下来的SQL语句将使用默认的全局运行时上下文,直到另一条CONTEXT USE语句覆盖它。

n EXEC S QL ENABLE THREADS

这条可执行SQL语句初始化支持多线程的进程。它必须是程序中第一条可执行的SQL 语句。

n EXEC SQL CONTEXT ALLOCATE

这条可执行SQL语句分配并初始化了一块用于指向一个新的运行时上下文的内存,并返回标识该上下文的句柄变量,该变量必须声明为sql_context类型。

n EXEC SQL CONTEXT USE

这条指令性语句告诉编译器接下去执行的SQL语句将使用指定的运行时上下文,这里的运行时上下文必须在此前已经用CONTEXT ALLOCATE分配并初始化。

n EXEC SQL CONTEXT FREE

这条语句释放了运行时上下文句柄指定的内存,并把它设置空值。

3.编程时要考虑的问题

尽管Oracle保证SQL库是线程安全的,但是你还是有责任保证你的Pro*C代码是为能在多线程下正确运行而设计的,例如,你必须考虑全局变量和静态变量的。

另外,多线程要求对以下问题进行考虑:

n 把sqlca结构定义成线程安全的。典型的做法是在每个函数开始定义一个同名的局部变量。

n sqlda结构也和sqlca结构一样处理。

n 把程序里的宿主变量定义成线程安全的。也就是说要小心处理程序里的全局变量和静态变量。

n 避免同一时刻不同线程使用同一个运行时上下文。

五.多线程例子

下面的例子运行在Red Hat9和Oracle9上。程序目的是用两个线程同时往一个表里插10000条记录,每个线程都拥有自己的运行时上下文。

#include

#include

#include /* Linux线程库头文件 */

#include "sqlca.h" /* Oracle头文件 */

#define SQLCODE sqlca.sqlcode

static int insert_data( sql_context );

static int start();

int

main()

{

pthread_t tid1, tid2;

/* 创建两个线程*/

if( pthread_create( &tid1,NULL,(void *)start,NULL ) ){

printf( "创建线程失败!\n" );

exit(1);

}

if( p thread_create( &tid2,NULL,(void *)start,NULL ) ){ printf( "创建线程失败!\n" );

exit(1);

}

/* 等待线程退出*/

if( pthread_join( tid1,NULL ) ){

printf( "等待线程结束失败!\n" );

exit(1);

}

if( pthread_join( tid2,NULL ) ){

printf( "等待线程结束失败!\n" );

exit(1);

}

exit(0);

}

int

start()

{

sql_context context;

struct sqlca sqlca; /* 需要在此定义一个局部的sqlca */ char uid[] = "dev/888888";

/* 以下SQL语句的执行顺序不能更改 */

EXEC SQL ENABLE THREADS;

EXEC SQL CONTEXT ALLOCATE :context;

EXEC SQL CONTEXT USE :context;

EXEC SQL CONNECT :uid;

if( SQLCODE < 0 ){

printf( "创建数据库连接失败,%d:%s\n", SQLCODE,sqlca.sqlerrm.sqlerrmc); return -1;

}insert_data( context );

EXEC SQL COMMIT WORK RELEASE;

if( SQLCODE < 0 ){

printf( "断开数据库连接失败!%d:%s\n", SQLCODE,sqlca.sqlerrm.sqlerrmc ); return -1;

}

EXEC SQL CONTEXT FREE :context;

return 0;

}

static int

insert_data( context )

sql_context context;

{

struct sqlca sqlca; /* 需要在此定义一个局部的sqlca */

char name[11];

int age;

int i;

strcpy( name, "test" );

age = 20;

EXEC SQL CONTEXT USE :context; /* 指定执行SQL语句的上下文 */

for( i=0; i<10000; i++ ){

EXEC SQL INSERT INTO table1 VALUES ( :name, :age );

if( SQLCODE < 0 ){

printf( "插入纪录失败!%d:%s\n", SQLCODE, sqlca.sqlerrm.sqlerrmc ); return -1;

}

}

return 0;

}

数据库死锁问题总结

数据库死锁问题总结 1、死锁(Deadlock) 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造 成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系 统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力 协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象 死锁。一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每 个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记 录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发 生了死锁现象。计算机系统中,如果系统的资源分配策略不当,更常见的可能是 程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。 锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协 议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。(回滚 一个,让另一个进程顺利进行) 产生死锁的原因主要是: (1)系统资源不足。 (2)进程运行推进的顺序不合适。 (3)资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能 性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序 与速度不同,也可能产生死锁。 产生死锁的四个必要条件: (1)互斥条件:一个资源每次只能被一个进程使用。 (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 破解:静态分配(分配全部资源) (3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 破解:可剥夺 (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 破解:有序分配 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。 死锁的预防和解除:

数据库应用程序设计作业

您的本次作业分数为:97分单选题 1.【第06章】在Database Desktop程序中,____就是数据表所在的 子目录或数据库文件名的替代名称。 ? A 数据库别名 ? B DSN ? C BDE ? D ODBC 单选题 2.【第06章】在ODBC层次结构中,_____包含在ODBC32.DLL中, 对用户是透明的,其任务是管理ODBC驱动程序,是ODBC最重要的部件。 ? A 数据源名 ? B ODBC管理器 ? C ODBC API ? D 驱动程序管理器 单选题

3.【第06章】使用Database Desktop程序,不能完成下列的_____ 功能。 ? A 创建和维护数据库表 ? B 创建和维护数据库别名 ? C 执行SQL语句 ? D 创建三层结构的数据库程序 单选题 4.【第06章】应用程序用以请求一个连到ODBC数据源的连接 (Connection)的名字是_____。 ? A DSN ? B ADO ? C ODBC ? D Connection 单选题 5.【第07章】创建一个名为RS的视图,用来显示所有学生的学号, 姓名和平均成绩,下面正确的语句是_____。

? A SELECT STUDENT.学号,STUDENT.姓名,SKB.平均成绩WHERE STUDENT.学号= SKB.学号GROUP BY STUDENT.学号INTO CURSOR RS ? B CREATE VIEW RS AS SELECT STUDENT.学号,STUDENT.姓名,SKB. 平均成绩WHERE STUDENT.学号= SKB.学号GROUP BY STUDENT.学号 ? C SELECT STUDENT.学号,STUDENT.姓名,SKB 平均成绩WHERE STUDENT.学号= SKB.学号GROUP BY STUDENT.学号INTO CURSOR RS ? D CREATE VIEW RS AS SELECT STUDENT.学号,STUDENT.姓名,AVG(SKB.成绩) AS 平均成绩WHERE STUDENT.学号= SKB.学号GROUP BY STUDENT.学号 单选题 6.【第07章】要选出平均成绩超过80分的学生的学号和平均成绩,下 列正确的语句是____。 ? A SELECT 学号,平均成绩FROM SKB WHERE 平均成绩>=80 ? B SELECT 学号,AVG(成绩) AS 平均成绩FROM SKB WHERE 平均成绩>=80 ? C SELECT 学号,AVG(成绩) AS 平均成绩FROM SKB GROUP BY 学号HAVING 平均成绩>=80 ? D SELECT 学号,AVG(成绩) AS 平均成绩FROM SKB ORDER BY 学号HAVING 平均成绩>=80 单选题

数据库开发技术

《数据库开发技术》课程作业报告 设计题目工厂库存系统 姓名董犇 学号 5 专业班级计算机应技术2班 2011年12月7日

一、设计目的 (3) 二、设计要求和设计指标 (3) 三、设计容 (4) 3.1需求分析 (4) 3.2 E-R 图设计 (5) 3.3逻辑结构设计 (9) 3.4系统功能实现 (11) 3.4.1数据库建立 (11) 3.4.2 表的建立 (11) 3.4.3 表之间联系的设置 (12) 四、本设计改进建议 (12) 五.总结 (13) 六、主要参考文献 (13) 附录 (13)

一、设计目的 这个数据库设计,对掌握的知识的巩固。主要是SQL语句的的应用,以及逻辑思维能力锻炼。只有在实践中,才能更好地掌握知识。因为本来就是学以致用,这样学到的知识才有真正的价值。数据库设计的目的即设计目标从根本上来说就是要实现数据的共享和安全存取,从细化及技术上来说,一个优秀的数据库设计必须要最终实现用户对于数据共享的具体要求,必须要在满足于用户的数据存取要求的基础上实现对于数据的关联性及优化,必须实现数据的安全性及可移植性,以保证用户数据能够简单的进行移植,必须要实现数据库的可扩容性结构以保证数据库对于用户未来数据要求的兼容性。这是数据库的基本要求。虽然我们现在做的知识课程设计。既然做的是数据库,就应该有数据库的应该具有的功能。 二、设计要求和设计指标 库存管理系统是一个企事业单位不可缺少的一部分,它的容对于企业的决策者和管理者来说都是至关重要的,因此,库存管理系统应该能够为用户提供充足的信息和快捷的查询手段,但一直以来人们使用传统的人工方式管理库存,这种管理方式存在着许多缺点,诸如效率低,性差等,而且时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。对于每个企业来说,随着企业规模的不断扩大,产品数量的急剧增加,所生产产品的种类也会不断地更新与发展,有关产品的各种信息量也会成倍增长。面对庞大的产品信息量,如何有效地管理库存产品,对这些企业来说是非常重要的,库存管理的重点是销售信息能否及时反馈,从而确保企业运行效益。 库存管理的主要目标就是通过对仓库所有入出库活动的管理和控制及对库存数据有效的统计和分析,以保证企业生产中畅通的物流,使决策人员及早发现问题,采取相应措施,调整库存结构,缩短储备周期,加速资金周转,最大限度地降低库存占用,同时,通过周期性的仓库盘点,及时补救管理中的漏洞,使库存管理系统实时地反映企业中各个仓库的实际情况,为各类管理人员从不同侧面提供所需信息,以便协调企业经营收到更大效益,库存管理系统是协调企业生产

数据库应用与设计 (清华大学出版社)参考答案

《数据库应用与设计》习题参考答案 第1章习题参考答案 1、答案:数据库是长期储存在计算机设备上、相互关联的、可以被用户共享的数据集合。 2、答案:数据库中的数据共享带来如下好处:低冗余,保证数据的一致性,易于扩充。 但是数据库中的数据共享可能会引起并发访问的冲突,这就需要采用并发控制来 避免。 3、答案:因为概念数据模型可以真实地反映现实世界,被人们所理解。它是创建数据模型 的第一个阶段。 4、答案: 5、答案:因为多对多联系是一类比较复杂的联系,一般数据库管理系统也不直接支持多对 多联系(需要付出更大的代价),所以多对多联系通常需要转换成一对多联系的。 6、答案:存储数据独立性指当改变存储文件的组织方式或存储结构时,应用程序无需修改。 概念数据独立性指当概念文件的结构发生变化时,应用程序无需修改。 这两种数据独立性是通过三层结构获得的。在三层结构的方案中,CONCEPTUAL-ROUTINE保证了概念数据的独立性,而STORAGE-ROUTINE则保证了存储数据独立性。 7、答案:数据库模式是用数据描述语言对数据库结构的每一层的框架及结构进行的精确定 义。数据库模式分为存储模式(内模式)、概念模式(模式)、外部模式(子模式)。存储模式(内模式)定义了存储数据库结构,概念模式(模式)定义了概念数据库结构,外部模式(子模式)定义了外部数据库结构。 8、答案:用户程序通过DBMS修改一条记录时所发生的一系列事件如下: (1)用户程序A向DBMS发出修改一条记录的指令,这时,用户程序要给出外部文件名、记录的关键字值和要修改的信息。 (2)DBCS分析所接到的指令,访问对应的外部模式。

数据库开发工程师简历模板

个人简历 姓名:*** 性别:男 出生年月:*** 联系电话:138*** 学历:本科专业:电子信息科学与技术 工作经验:4年民族:汉 毕业学校:***化工大学 住址:*** 电子信箱:*** 自我简介: 1、大规模客户现场系统综合实施经历,积累了丰富的客户现场工作经验,并对应用软件weblogic,server,oracle和unix操作系统的使用熟练,掌握java开发。 2、一线应用系统远程支持维护工作,使得能够站在客户和公司等多角度看问题,同客户保持良好的沟通交流,有效解决客户问题,获得用户和单位好评。 3、不同层面上的运维支持管理经历、人员技术和业务培训经历。 4、多次获得单位嘉奖奖励和先进个人称号奖励。 求职意向: 目标职位:数据库管理员·数据库开发工程师| 系统集成工程师| ERP技术应用顾问·ERP实施工程师| 技术支持·维护经理| 高级软件工程师 目标行业:通信(设备·运营·增值服务) | 互联网·电子商务| 计算机软件| 计算机硬件·网络设备| IT服务·系统集成 期望薪资:面议 期望地区:*** 到岗时间:面议 工作经历: 至今***信息技术(集团)有限公司

高级系统工程师 1、应用中间件weblogic部署实施及测试优化。 2、客户应用软件现状调研分析。 3、客户应用软件架构及业务功能需求调研分析、应用整体优化方案设计。 4、项目架构中间件架构设计。 至今国家***总局***呼叫中心 技术主管 根据单位年度发展计划制定部门运维管理工作计划、技术发展目标。将年度计划分解 为季度计划并督促实施。积极了解行业发展动态,远景,结合本单位现实情况,选用 合适的技术、设备。协同单位各部门共同做好信息化发展和单位支撑系统的运维管理。 制定单位内部信息化建设方案,并监督执行。 1、完成单位呼叫中心系统升级方案制定; 2、根据单位发展战略的调整,对门户网站进行调整升级; 3、保证单位日常运营系统支撑和信息化建设; 4、提供单位员工的技术培训。 国家***总局***呼叫中心 运维管理 根据部门下发的年度支持维护指标和要求,为项目组制定相应的工作实施计划。完成 过程中根据完成情况和部门指标及要求的变化及时进行修订。技术维护过程中保持与 客户良好关系,维护客户管理,适时组织电话调查。定期组织业务技术学习、运维管 理流程学习,规范技术支持维护工作处理流程。 带领全组人员员满完成年度运维支持计划;解决多省市提起的严重的应用系统故障; 培养了部分业务技术骨干,为项目组和部门做好人才储备。 国家***总局***呼叫中心 技术支持工程师 1、负责上级分配省市的货运系统的实施工作(计划制定、具体实施操作及每日外出 工作汇报)。 2、负责全国各省市税局货运及款机系统的软件支持。 3、负责对新进技术支持岗位员工进行相关技术培训工作和帮助其早日胜任岗位工 作。 4、负责全国各省市税局税控系统应用(weblogic)及数据库(oracle)的初级支持诊断。 并根据问题的难度及其严重程序及时同相关部门反映沟疑难问题。 5、协助项目组长做好日常业务问题统计分析各记录在册,协助做好项目组日常运行 的维护,协助完成相关的报告和制作实用性的技术文档供内部使用。 6、接受并处理其他技术支持工程师转交的系统及疑难问题,确保整个支持小组按规 定流程正常运行。并对其出现的技术性错误予以说明和指导纠正。 7、工作过程中全面细致了解所负责系统的构成、运行,并且会利用各种方式阅读程 序(jsp及反编译的java程序)以帮助了解和解决遇到的系统问题。深入了解掌握 weblogic server的配置调整及oracle、AIX系统相关知识。 8、工作过程中认真负责,以客户切身利益为出发点,认真耐心地做好同客户的沟通, 全面细致地了解客户具体遇到的问题,积极快速的替客户解决问题。若非本人能力范 围内的或有需要确认的问题,需要同相关开发人员进行细致的沟通,以给客户最准确、

Windows多线程程序设计

Windows多线程程序设计- - 1、产生一个线程,只是个框架,没有具体实现。理解::CreateThread函数用法。 #include DWORD WINAPI ThreadFunc(LPVOID); int main() { HANDLE hThread; DWORD dwThreadID; hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(ThreadFunc), NULL, 0, &dwThreadID); ...; return 0; } DWORD WINAPI ThreadFunc(LPVOID lParam) { ...; return 0; } 2、一个真正运转的多线程程序,当你运行它的时候,你会发现(也可能会害怕),自己试试吧。说明了多线程程序是无法预测其行为的,每次运行都会有不同的结果。 #include #include using namespace std; DWORD WINAPI ThreadFunc(LPVOID); int main() { HANDLE hThread; DWORD dwThreadID; // 产生5个线程 for(int i=0; i<5; i++)

{ hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(ThreadFunc), (LPVOID)&i, 0, &dwThreadID); if(dwThreadID) cout << "Thread launched: " << i << endl; } // 必须等待线程结束,以后我们用更好的处理方法 Sleep(5000); return 0; } DWORD WINAPI ThreadFunc(LPVOID lParam) { int n = (int)lParam; for(int i=0; i<3; i++) { cout << n <<","<< n <<","<< n << ","< } return 0; } 3、使用CloseHandle函数来结束线程,应该是“来结束核心对象的”,详细要参见windows 多线程程序设计一书。 修改上面的程序,我们只简单的修改if语句。 if(dwThreadID) { cout << "Thread launched: " << i << endl; CloseHandle(dwThreadID); } 4、GetExitCodeThread函数的用法和用途,它传回的是线程函数的返回值,所以不能用GetExitCodeThread的返回值来判断线程是否结束。 #include #include using namespace std;

数据库原理作业

数据库原理作业 客观题预算成绩:100 分 题号:1 题型:单选题(请在以下几个选项中选择唯一正确答案) 在关系数据库设计中,设计关系模式是( )的任务 A、A)需求分析阶段 B、B)概念设计阶段 C、C)逻辑设计阶段 D、D)物理设计阶段 学员答案:C 正确性:正确 题号:2 题型:单选题(请在以下几个选项中选择唯一正确答案) 存取方法设计是数据库设计的( )阶段的任务。 A、一个1:1联系可以转换为一个独立的关系模式,也可以与联系的任意一端实体所对应的关系模式合并 B、一个1:n联系可以转换为一个独立的关系模式,也可以与联系的n端实体所对应的关系模式合并 C、一个m:n联系可以转换为一个独立的关系模式,也可以与联系的任意一端实体所对应的关系模式合并 D、三个或三个以上的实体间的多元联系转换为一个关系模式 学员答案:C 正确性:正确 题号:3 题型:单选题(请在以下几个选项中选择唯一正确答案) 数据流图属于数据库设计的哪个阶段的工具?( ) A、需求分析阶段 B、概念结构设计阶段 C、逻辑结构设计阶段 D、物理结构设计阶段 学员答案:A 正确性:正确 题号:4 题型:单选题(请在以下几个选项中选择唯一正确答案) 在数据库设计中,将ER图转换成关系数据模型的过程属于( )。 A、需求分析阶段 B、逻辑设计阶段 C、概念设计阶段 D、物理设计阶段 学员答案:B

正确性:正确 题号:5 题型:单选题(请在以下几个选项中选择唯一正确答案) 在数据库设计的需求分析阶段,描述数据与处理之间关系的方法是() A、ER图 B、业务流程图 C、数据流图 D、程序框图 学员答案:C 正确性:正确 题号:6 题型:单选题(请在以下几个选项中选择唯一正确答案) 建立索引属于数据库的() A、概念设计 B、逻辑设计 C、物理设计 D、实现与维护设计 学员答案:C 正确性:正确 题号:7 题型:单选题(请在以下几个选项中选择唯一正确答案) 在关系数据库设计中,设计关系模式是____的任务。 A、需求分析阶段 B、概念设计阶段 C、逻辑设计阶段 D、物理设计阶段 学员答案:C 正确性:正确 题号:8 题型:单选题(请在以下几个选项中选择唯一正确答案) 从E-R模型向关系模式转换时,一个m:n联系转换为关系模式时,该关系模式的码是 A、A)m端实体的码 B、B)n端实体的码 C、C)m端实体码与n端实体码的组合 D、D)重新选取其他属性 学员答案:C 正确性:正确 题号:9 题型:多选题(请在复选框中打勾,在以下几个选项中选择正确答案,答案可以

实验五 多线程程序设计(汽院含答案)

实验五多线程程序设计 实验目的 1.掌握Java语言中多线程编程的基本方法 2.掌握Runnable接口实现多线程的方法 3.掌握Thread类实现多线程的用法 实验导读 1.进程和线程的概念 进程是程序一次动态执行的过程,对应从代码加载、执行到执行结束这样一个完整的过程,也是进程自身从产生、发展到消亡的过程。 线程是比进程更小的执行单元,一个进程在执行过程中,可以产生多个线程。每个线程都有自身的产生、执行和消亡的过程。 2.线程的状态与生命周期 ●新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它 已经有了相应的内存空间和其他资源。 ●运行:线程创建之后就具备了运行的条件,一旦轮到它来享用CPU资源时,即JVM将CPU使用权 切换给该线程时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了(即run方法执行的过程)。 ●中断:有4种原因的中断,CPU资源从当前线程切换给其他线程、执行了sleep(int millsecond)方法、 执行了wait()方法、进入阻塞状态。 ●死亡:run方法结束。 3.线程的创建 在Java语言中,与线程支持密切相关的是https://www.doczj.com/doc/e14686442.html,ng.Thread类和https://www.doczj.com/doc/e14686442.html,ng.Runnable接口。Runnable接口定义很简单,只有一个run方法。任何一个类如果希望自己的实例能够以线程的形式执行,都可以来实现Runnable接口。 继承Thread类和实现Runnable接口,都可以用来创建Thread对象,效果上并没有什么不同。继承Thread 类的方法很明显的缺点就是这个类不能再继承其他的类了,而实现Runnable接口不会有这个麻烦。 另外,在继承Thread类的代码中,this其实就是指当前正在运行的线程对象,如果使用实现Runnable 接口的方式,要得到当前正在执行的线程,需要使用Thread.currentThread()方法。 线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。 注意:多次启动一个线程,或者启动一个已经运行的线程对象是非法的,会抛出IllegalThreadStateException异常对象。 4.线程的优先级 同一时刻在等待队列中的线程会有很多个,它们各自任务的重要性有所不同。为了加以区分,使工作安排和资源分配时间更为合理,每个线程可以被赋予不同的优先级,让任务比较急的线程拥有更高的优先级,从而更快地进入执行状态。 Java中提供了10个等级的线程优先级,最低为Thread.MIN_PRIORITY=1,最高为

数据库应用程序设计第一次离线作业答案

《数据库应用技术》作业 第六章 6、系统DSN 用户DSN 文档DSN 系统DSN 7、基于BDE的两层数据库应用程序、基于ADO的两层数据库应用程序、基于dbExpress 的两层数据库应用程序、基于InterBase的两层数据库应用程序 8、三层开发结构的数据库应用程序方法主要有三种:基于DataSnap技术开发的多层结构数据库应用程序、基于Bussiness Broker Server技术开发的多层数据库应用程序和基于逻辑三层结构的数据库应用程序。 9、ODBC各部件及层次关系图

10、 1)打开ODBC数据源管理器:执行【开始】->【控制面板】命令,在控制面板窗口中双击【性能维护】图标,再双击【管理工具】图标,然后再双击【数据源(ODBC)】图标,将会展示【ODBC数据源管理器】对话框 2)选择数据源类型并添加数据源:在【ODBC数据源管理器】对话框中单击【系统DSN】,再单“添加”按钮,出现【创建新数据源】对话框 3)选择驱动数据源的驱动程序:在【创建新数据源】对话框中,选择【Microsoft Access Driver (*.mdb)】后单击【完成】按钮,出现【ODBC Microsoft Access安装】对话框 4)设置数据源参数:在【数据源名】文本框中输入数据源名,在【说明】文本框中抒发说明信息。单击【选择】按钮,出现【选择数据库】对话框。在该对话框中选择对应的数据库名后单击【确定】按钮 5)在【ODBC Microsoft Access安装】对话框中单击【确定】按钮,完成数据源的配置。 11、 1)打开ODBC数据源管理器:执行【开始】->【控制面板】命令,在控制面板窗口中双击【性能维护】图标,再双击【管理工具】图标,然后再双击【数据源(ODBC)】图标,将会展示【ODBC数据源管理器】对话框 2)选择数据源类型并添加数据源:在【ODBC数据源管理器】对话框中单击【系统DSN】,再单“添加”按钮,出现【创建新数据源】对话框 3)选择驱动数据源的驱动程序:在【创建新数据源】对话框中,选择【SQL Server】后单击【完成】按钮,出现【创建到SQL Server的新数据源】对话框 4)为数据源命名并选择SQL 服务器:在【创建到SQL Server的新数据源】对话框的【名称】文本框中输入数据源名,在【描述】文本框中输入数据源的描述,在【服务器列表框中选择或输入SQL服务器的名称。设置好后单击【下一步】按钮,出现【创建到SQL Server 的新数据源】对话框(二) 5)设置登录ID和密码:在【创建到SQL Server的新数据源】对话框(二)中,选择【使用用户输入登录ID和密码的SQL Server验证】,然后在【登录ID】文本框中输入用户名,如系统管理员名为“sa”,在【密码】文本框中输入登录密码,如系统管理员的口令为tongaihong。登录ID和密码输入后,单击【下一步】按钮,出现【创建到SQL Server的新数据源】对话框(三) 6)选择数据库:在【创建到SQL Server的新数据源】对话框(三),选择【更改默认的数据库】,然后在其后的列表框中选择需要的数据库,单击【下一步】按钮,出现【创建SQL Server的新数据源】对话框(四)。通常该对话框不需要设置,单击【完成】按钮,出现【ODBC Microsoft SQL Server安装】对话框。在该对话框中列出了建立的数据源的所有相关信息。7)测试数据源:单击【测试数据源】按钮,出现【SQL Server数据源测试】对话框,如果测试成功经给出测试成功的信息 8)完成:单击【确定】按钮,退出【SQL Server数据源测试】对话框,出现【ODBC Microsoft SQL Server 安装】对话框,单击【确定】按钮,退出该对话框,出现【ODBC数据源管理器】对话框,可以看到系统数据源已经建立。单击【确定】按钮,退出该对话框,数据源名建立完毕。 12、 1)在Database Desktop应用程序中执行【Tools】->【Alias Manager】命令,出现【Alias Manager】对话框

企业数据库开发方案

文件编号: YS- 保密级别:内部文件- 威海易尚网络科技有限公司 威海易尚网络科技有限公司技术部 2015-8-15

客户名称、项目名称建设方案 一、项目背景简述 二十一世纪,网络与通信技术呈现迅猛的发展势头,在短短几年之内,智能终端使用率几乎覆盖了整个有效社会群体的99% 以上,其速度之快,令人咋舌。就在我们惊诧之际,我们还看到了微信、网购,智能生活等各种网络应用,在人们生活的方方面面,它们是以什么样的惊人的几何倍速, 正在增长着。 应该说,我们已经见证了网络和通信所带来的前所未有的市场效益, 我们感叹它的巨大力量以及发展潜力。但我们是否想过,能否将这些为我 所用,使之产生有利于企业的效应? 即便是在现在,对很多企业来说,这仍旧是一个具有前瞻性的问题。 这是一种挑战,一种机遇,是一种资源,更是一种方向! 我们看到,有实力的企业已经着手去考虑如何有效的依托网络技术, 结合当前成熟的应用程序和功能,去抓住这样一组资源和数据了。毫无疑 问,在合理的运作下,这必将为他们带来额外的诸多效益。 下边是几组针对操作提醒功能数据: (1)大型的银行,网银操作具有提醒功能;

(2)知名的支付机构,资金操作具有短信提醒功能; (3)知名的网购平台,订单操作具有相应的提醒功能。 二、需求与可行性分析 根据客户名称(修改后请更正颜色)初期提出的需求文档,以及与客 户进行的几次沟通,我们认为客户自主开发企业数据库并基于此建立CRM 系统已刻不容缓。 A、需求分析 (1)随着时间的经年更迭,旧系统所拥有的功能,已无法满足当前主流顾客软需求。 (2)限于早期的互联网技术手段,旧系统无法为当前的企业营销提供足够的数据支持和辅助作用。 (3)有数据表明,智能移动终端使用群体约等于年轻一代的消费群体,并与当前优质消费群体存在大部分重合,他们已逐步成为消费者主力军。 B、可行性论证 (1)网络技术、数据库技术,通信与相应的软件技术已经成熟。 (2)于企业内部建立管理系统已经非常普遍。 (3)企业建立 DBCENTER 并有效利用,长远的看,能达到提升效率、节 约成本,提升综合竞争力的目标。 (4)基于互联网开放标准的数据服务已经非常成熟,能与SC 程序媲美。三、关键技术

几种常用数据库的比较

几种常用数据库的比较 目前,商品化的数据库管理系统以关系型数据库为主导产品,技术比较成熟。面向对象的数据库管理系统虽然技术先进,数据库易于开发、维护,但尚未有成熟的产品。国际国内的主导关系型数据库管理系统有Oracle、Sybase、Informix和INGRES。这些产品都支持多平台,如UNIX、VMS、Windows,但支持的程度不一样。IBM的DB2也是成熟的关系型数据库。但是,DB2是内嵌于IBM的AS/400系列机中,只支持OS /400操作系统。 1.MySQL MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL AB开发、发布和支持。MySQL AB是一家基于MySQL 开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。MySQL是MySQL AB 的注册商标。 MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass- deployed)的软件中去。

与其他数据库管理系统相比,MySQL具有以下优势: (1)MySQL是一个关系数据库管理系统。 (2)MySQL是开源的。 (3)MySQL服务器是一个快速的、可靠的和易于使用的数据库服务器。 (4)MySQL服务器工作在客户/服务器或嵌入系统中。 (5)有大量的MySQL软件可以使用。 2.SQL Server SQL Server是由微软开发的数据库管理系统,是Web上最流行的用于存储数据的数据库,它已广泛用于电子商务、银行、保险、电力等与数据库有关的行业。 目前最新版本是SQL Server 2005,它只能在Windows上运行,操作系统的系统稳定性对数据库十分重要。并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。 SQL Server 提供了众多的Web和电子商务功能,如对XML 和Internet标准的丰富支持,通过Web对数据进行轻松安全的访问,具有强大的、灵活的、基于Web的和安全的应用程序管理等。而且,由于其易操作性及其友好的操作界面,深受广大用户的喜爱。

国家队信息化平台数据库软件设计与开发合同示范文本

国家队信息化平台数据库软件设计与开发合同示范 文本 In Order To Protect Their Legitimate Rights And Interests, The Cooperative Parties Reach A Consensus Through Consultation And Sign Into Documents, So As To Solve And Prevent Disputes And Achieve The Effect Of Common Interests 某某管理中心 XX年XX月

国家队信息化平台数据库软件设计与开 发合同示范文本 使用指引:此合同资料应用在协作多方为保障各自的合法权益,经过共同商量最终得出一致意见,特意签订成为文书材料,从而达到解决和预防纠纷实现共同利益的效果,文档经过下载可进行自定义修改,请根据实际需求进行调整与使用。 项目名称:_______________ 委托人:__________ (甲方) 研究开发人:_____________ (乙方) 签订地点:____省(市)____市、县(区) 签订日期:_______________ 有效期限:__________至__________ 填表说明 一、技术开发合同是指当事人之间就国家队信息化平 台的研究开发所订立的合同。

二、标的技术的内容、范围及要求 包括开发项目应达到的开发目的、使用范围、技术经济指标及效益情况。 三、研究开发计划 包括当事人各方实施开发项目的阶段进度、各个阶段要解决的技术问题、达到的目标和完成的期限等。 四、本合同书的履行方式(包括成果提交方式及数量) 1.产品设计、图纸、论文、报告等技术文件; 2.磁盘、光盘、磁带、计算机软件; 3.样品、样机; 4.成套技术设备。 五、技术情报和资料的保密 包括当事人各方情报和资料保密义务的内容、期限和泄漏技术秘密应承担的责任。

基于多线程的端口扫描程序课程设计报告

滁州学院 课程设计报告 课程名称: 设计题目:基于多线程的端口扫描程序 院部:计算机与信息工程学院 专业:网络工程 组别:第六组 起止日期: 2012 年12月31日~2013 年1月6日指导教师: 计算机与信息工程学院二○一二年制

课程设计任务书 目录 1 需求分析. 0 1..1 网络安全 0 1.2 课程背景 0 1.3 扫描器 0 1.4 多线程扫描器介绍 (1) 错误! 未定义书签。

错误! 未定义书签。 错误! 未定义书签。 错误! 未定义书签。 1.5 端口扫描 (2) 2 概要设计. (3) 2.1 整体框架设计 (3) 2.2 流程图描述 (3) 3 详细设计. (3) 3.1 端口扫描线程启动 (3) 3.2 GUI 图形界面 (5) 3.3 按钮监听及异常处理 (6) 4 调试与操作说明. (8) 4.1 运行界面 (8) 4.2 扫描结果 (8) 4.3 错误提示 (8) 5 课程设计总结与体会. (8) 6 参考文献. (9) 7 致谢. (9) 8 附录. 0 1 需求分析 1..1 网络安全二十一世纪是信息化、网络化的世纪,信息是社会发展的重要资源。信息安全保障能力是一个国家综合国力、经济竞争实力和生存能力的重要组成部分,是世界各国在奋力攀登的制高点。网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行。网络安全包括技术领域和非技术领域两大部分: 非技术领域包括一些制度、政策、管理、安全意识、实体安全

等方面的内容; 技术领域包括隐患扫描、防火墙、入侵检测、访问控制、虚拟专用网、CA 认证、操作系统等方面的内容。这些技术的目标是保证信息的可控性、可用性、保密性、完整性、和不可抵赖性。端口扫描属于安全探测技术范畴,对应于网络攻击技术中的网络信息收集技术。 1.2 课程背景 随着Internet 的不断发展,信息技术已成为促进经济发展、社会进步的巨大推动力。端口扫描技术是网络安全扫描技术一个重要的网络安全技术。与防火墙、入侵检测系统互相配合,能够有效提高网络的安全性。安全扫描是安全技术领域中重要的一类。通过扫描能自动检测远端或本地主机系统信息,包括主机的基本信息(如计算机名、域名、组名、操作系统 型等)、服务信息、用户信息以及漏洞信息,它的重要性在于能够对网络进行安全评估,及时发现安全隐患,防患于未然。 网络的安全状况取决于网络中最薄弱的环节,任何疏忽都有可能引入不安全的因素,最有效的方法是定期对网络系统进行安全分析,及时发现并修正存在的脆弱,保证系统安全。 国外安全扫描技术的历史可以追溯到20 世纪90 年代,当时因特网刚刚起步,但是在过去的十年内,扫描技术飞速发展,迄今为止,其扫描技术已经非常完善,但是在全面性,隐蔽性和智能性上还有待提高。安全扫描从最初专门为UNIX 系统而编写的一些只有简单功能的小程序发展到现在,已经出现了可以运行多个操作系统平台上的,具有复杂功能的系统程序。 国内的扫描技术是在国外的扫描器基础上发展起来的。其中有一些专门从事安全技术的公司。这些公司的扫描器以硬件为主,其特点是执行速度快,不像软件一样受到安装主机系统的限制。 然而对于更多的基于主机的端口扫描而言,简单,实用,可靠才是它们的长处。 1.3 扫描器扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种TCP端口的分配。这就能让我们间接的或直观的了解到远程主机所存在的安全问题。为了保证网络中计算机的安全性,必须采取主动策略, 快速、及时、准确、安全的检测出网络中计算机及防火墙开放的和未开放的端口。计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。 扫描器采用模拟攻击的形式对目标可能存在的已知安全漏洞进行逐项检查。目标可以是工作站、服务器、交换机、数据库应用等各种对象。然后根据扫描结果向系统管理员提供周 密可靠的安全性分析报告,为提高网络安全整体水平产生重要依据。在网络安全体系的建设中,安全扫描工具花费低、效果好、见效快、与网络的运行相对对立、安装运行简单,可以大规模减少安全管理员的手工劳动,有利于保持全网安全政策的统一和稳定。 1.4 多线程扫描器介绍 在java 中,组件放置在窗体上的方式是完全基于代码的。组件放置在窗体上的方式通常不是通过绝对坐标控制,而是由“布局管理器”根据组件加入的顺序决定其位置。每个容器都有一个属于的自己布局管理器。使用不同的布局管理器,组件大小,位置和形状将大不相同。表格型布局管理器将容器划分成为一个多行多列的表格,表格的大小全部相同,是由其中最大的组件所决定。通过add 方法可以将组件一一放在每个表格

基于ARM的多线程应用程序设计

开放性实验报告 题目: 基于ARM的多线程应用程序设计院系名称:电气工程学院 专业班级:自动1302 学生姓名:张鹏涛 学号:201323020219 指导教师:张晓东

目录 1 系统概述与设计要求 (2) 1.1 系统概述 (2) 1.2 设计要求 (2) 2 方案论证 (2) 2.1 实现方法 (2) 2.2 线程优势 (2) 3 硬件设计 (3) 3.1 树莓派接口驱动LED电路设计 (3) 4 软件设计 (4) 4.1 驱动三色LED灯 (4) 4.1.1 驱动实现方法 (4) 4.1.2 wiringPi库安装和软件编程 (5) 4.2 服务器和客户端 (5) 4.2.1 服务器设计方法 (5) 4.2.2 客户端设计方法 (6) 5 系统调试 (6) 设计心得 (8) 参考文献 (9) 附录1(LED驱动程序) (10) 附录2(服务器程序) (10) 附录3(客户端程序代码) (14)

1 系统概述与设计要求 1.1 系统概述 本系统设计是基于树莓派开发板上实现的,树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,Eben·Upton/埃·厄普顿为项目带头人。2012年3月,英国剑桥大学埃本·阿普顿(Eben Epton)正式发售世界上最小的台式机,又称卡片式电脑,外形只有信用卡大小,却具有电脑的所有基本功能,这就是Raspberry Pi电脑板,中文译名"树莓派"。它是一款基于ARM的微型电脑主板,以SD/MicroSD 卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个10/100 以太网接口(A型没有网口),可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上,具备所有PC的基本功能。而树莓派2具有900MHz内核频率,4核ARM Cortex-A7,1GB 内存,带Micro SD 卡插槽(支持通过它启动Linux 操作系统,如Fedora),40PIN接口(可以增加驱动外设)。本系统设计正式在树莓派2环境下开发实现多线程设计,设计的主要功能就是两个客户端通过服务器互相收发信息。 1.2 设计要求 要求多个客户端能够同时连接服务器,而服务器需要创建线程来管理这多个客户端,并且能够把一个客户端发来的数据进行解析,发给另一个客户端,实现两个甚至多个客户端互相收发信息。能够通过驱动三色灯来发现系统运行的状态,红色说明有错误发生,绿色说明正在正常运行,蓝色说明有用户连接,绿色说明有客户端互相收发信息。 2 方案论证 2.1 实现方法 要实现服务器同时管理两个甚至多个客户端,就必须引入进程或线程。 2.2 线程优势 一是和进程相比,它是一种非常"节俭"的多任务操作方式。

数据库及软件开发部分知识讲解

24. 系统开发过程中最关键阶段( ) 答:分析与设计 25. 在需求分析阶段,强调的是( ) 答:逻辑描述 26. 数据表中“字段中”的正确叙述是( ) 必须有一个字段名所代表的列魏主关键字段 27. 在Assess 数据库中,向数据表中输入数据时限制字段称为( 28. 建立数据表之间的关系后,如果要修改关键字,必须删除关系是为了保证( 性 29. 能经常使用的文件组合一起存在磁盘上,从而提高文件文件读写速度的是( 整理程 序 30. 在复杂信息系统开发过程中,采用的方法是( ) 答:面向对象法 多选题 1. Assess 数据类型包括( ACD ) A 文本 B 字母 C 货币 D 数字 2.Access 中实现报表输出功能的办法( AB ) A 和报表向导建立报表 B 从多个表产生报表 C 导入报表 D 数据报表 数据库及软件开发部分 1. Assess 中,想建立自定义数据库应选择进入( 空数据库 ) 2. Assess 中, 数据库的输入,显示和更新都在( 数据表视图 ) 中完成。 3. Assess 中, 用于存放某一类型数据的是。 答: 表 4. Assess 中, 要修改表结构就选择的按钮 答: 设计 5. 一般会计核算软件的财务数据是( ) 文件 答:数据库 6. 目前应用最广泛的数据库类型是 答:关系型 7. Assess 是( ) 的数据库 答:小型 8. Assess97数据库包括几个对象 答:6 9. Assess 可以通过( ) 方式从外部获取数据 答:导入 10. 会计软件开发需要几个阶段 11. 会计软件开发中系统测试是从( 答:上到下 答: 6 ) 全面测试和检验是否符合系统分析目标和总体设计方案 12. 结构化分析方法的主要特点是 13. 数据流程图共有几种基本符号 答:自顶向下,逐层分解 答: 4 14. 在数据库应用领域中, Assess 数据库属于( ) 答:关系型数据库 15. 下列关于数据库系统的正确叙述是( ) 答:数据库系统减少了数据冗余 16. Assess 数据库文件的扩展名为 答: .Mdb 17. 下列数据库对象中( ) 是数据库的基础 答:表 18. 在Assess 数据库中,通过( )搜索符合指定条件的信息 答:查询 19. 在Assess 数据库可以使用( )完成自动化动作 答:宏 20. 在Assess 数据库中,表的一行称为( ) 答:记录 21. 在Assess 数据库中,向数据表中输入数据时限制字段数据取值范围称为( 22. 软件需求分析是开发会计信息系统的第( ) 阶段 答: 2 ) 答:有效性规则 23. 会计软件开发中是由( ) 提供系统测试标准,制定测试确定测试方法 答:系统分析员 答:在一个数据表中, ) 答:有效性规则 ) 答:引用完整 ) 答:磁盘碎片

C++ 多线程编程总结

C++ 多线程编程总结 在开发C++程序时,一般在吞吐量、并发、实时性上有较高的要求。设计C++程序时,总结起来可以从如下几点提高效率: ?l 并发 ?l 异步 ?l 缓存 下面将我平常工作中遇到一些问题例举一二,其设计思想无非以上三点。 1任务队列 1.1 以生产者-消费者模型设计任务队列 生产者-消费者模型是人们非常熟悉的模型,比如在某个服务器程序中,当User数据被逻辑模块修改后,就产生一个更新数据库的任务(produce),投递给IO模块任务队列,IO模块从任务队列中取出任务执行sql操作(consume)。 设计通用的任务队列,示例代码如下: 详细实现可参见 1.2 任务队列使用技巧

注意,此模式下为多任务队列,每个任务队列单线程。 1.2.3 连接池与异步回调 比如逻辑Service模块需要数据库模块异步载入用户数据,并做后续处理计算。而数据库模块拥有一个固定连接数的连接池,当执行SQL的任务到来时,选择一个空闲的连接,执行SQL,并把SQL 通过回调函数传递给逻辑层。其步骤如下: ?n 预先分配好线程池,每个线程创建一个连接到数据库的连接 ?n 为数据库模块创建一个任务队列,所有线程都是这个任务队列的消费者 ?n 逻辑层想数据库模块投递sql执行任务,同时传递一个回调函数来接受sql执行结果 注意,此模式下为单任务队列,每个任务队列多线程。 2. 日志

本文主要讲C++多线程编程,日志系统不是为了提高程序效率,但是在程序调试、运行期排错上,日志是无可替代的工具,相信开发后台程序的朋友都会使用日志。常见的日志使用方式有如下几种: ?n 流式,如logstream << "start servie time[%d]" << time(0) << " app name[%s]" << app_string.c_str() << endl; ?n Printf 格式如:logtrace(LOG_MODULE, "start servie time[%d] app name[%s]", time(0), app_string.c_str()); 二者各有优缺点,流式是线程安全的,printf格式格式化字符串会更直接,但缺点是线程不安全,如果把app_string.c_str() 换成app_string (std::string),编译被通过,但是运行期会crash(如果运气好每次都crash,运气不好偶尔会crash)。我个人钟爱printf风格,可以做如下改进: ?l 增加线程安全,利用C++模板的traits机制,可以实现线程安全。示例: 这样,除了标准类型+std::string 传入其他类型将编译不能通过。这里只列举了一个参数的例子,可以重载该版本支持更多参数,如果你愿意,可以支持9个参数或更多。 ?l 为日志增加颜色,在printf中加入控制字符,可以再屏幕终端上显示颜色,Linux下示例:printf("\033[32;49;1m [DONE] \033[39;49;0m") 更多颜色方案参见: ?l 每个线程启动时,都应该用日志打印该线程负责什么功能。这样,程序跑起来的时候通过top –H – p pid 可以得知那个功能使用cpu的多少。实际上,我的每行日志都会打印线程id,此线程id 非pthread_id,而其实是线程对应的系统分配的进程id号。 3. 性能监控 尽管已经有很多工具可以分析c++程序运行性能,但是其大部分还是运行在程序debug阶段。我们需要一种手段在debug和release阶段都能监控程序,一方面得知程序瓶颈之所在,一方面尽早发现哪些组件在运行期出现了异常。 通常都是使用gettimeofday 来计算某个函数开销,可以精确到微妙。可以利用C++的确定性析构,非常方便的实现获取函数开销的小工具,示例如下 struct profiler{ profiler(const char* func_name){ gettimeofday(&tv, NULL);

相关主题
文本预览
相关文档 最新文档