浅谈数据库的多线程应用
在日常的编程中,当需要批量数据处理的时候,我们习惯用多进程来处理问题,通常的做法是在主进程里面fork出来多个子进程,这样父进程相当于克隆多个自己,为每个子进程分配新的数据和代码空间,在程序运行期间,进程作为的包含程序指令和相关资源的集合,与其它进程一起参与调度,竞争CPU,内存等资源,这样可以解决很多并发问题,但同时也带来一些问题:
1.进程的切换需要更多的开销,每次切换进程需要保存更多的现场与资源。
2.进程间不能很好的通讯与同步。
为了更好的提高并发效率,我们经常会用到多线程。对于同一个进程内部的多个线程,共享的是同一个进程的所有资源。与每个进程独有自己的内存空间不同,同属一个进程的多个线程共享该进程的内存空间。例如在进程地址空间中有一个全局变量iStaticCont,若线程1将其赋值为0,则线程2可以看到该变量值为0。两个线程看到的全局变量iStaticCont是同一个变量。通过线程可以更好的解决同一个应用程序内部的并发,免去了进程频繁切换的开销,同时并发线程之间的通信也更为简单。
一般来说,在主线程中创建子线程时,会指定主线程与子线程之间的如下两种关系:
1)joinable(可会合),在使用pthread_create创建线程时第二个参数如果传NULL,则创建默认属性的可会合的线程,此种情况下,在线程函数执行完毕,必须调用
pthread_join()等待线程结束,否则线程所占用的资源不会得到释放,会造成资源泄露。定义这种属性的子线程一般适合于主线程需要等待子线程从线程函数执行完毕之后,再继续下一步的动作。比如按照业务类型多线程处理一批任务,所有子线程完毕之后,主线程再根据处理的结果执行下一个任务。
2)detached(可分离),可以使用pthread_attr_setdetachstate (&attr,
PTHREAD_CREATE_DETACHED);来显示定义子线程不需要和与主线程会合,即子线程从线程函数返回之后进入终止状态时,系统就会销毁分配给子线程的资源。这种情况适合不需要主线程等待子线程结束的情况。即子线程终止后系统会自动回收其资源。
下面我们看一个具体的多线程实例!
月底出账时,会有一步需要处理预转后用户的余额和账单,此前这个步骤是通过shell脚本调用存过来实现的,在执行中发现处理效率低下,故需要优化。
使用C++编写,在主线程中创建10个子线程,调用OCCI接口访问ORACLE数据库,采用此应用,该流程可在10分钟之内执行完毕。
首先定义一个业务操作类: COcsToBssCal,里面封装了参数解析,数据库环境,初始化,业务执行等方法。
再定义一个公用方法提供类:CPublicOprHelper,提供获取数据库口令配置信息,设置日志路径,两个账期相减获取相差的月份数等公用方法。
程序流程大致如下:
1)先创建一个COcsToBssCal类的对象,解析传入的参数,调用成员变量
CPublicOprHelper类的方法,获取数据库配置信息,删除不能参与预存划拨的数据,提取出账月预转后的用户入表中。
2)创建一个对象数组,调用COcsToBssCal类的拷贝构造函数,定义数据库环境,定义数据库环境时需要通过Environment::THREADED_UNMUTEXED参数来指定线程安全,初始化自己的数据库连接,创建连接采用OCCI提供的接口createConnection。
3)创建子线程,线程属性默认为可会合的,在全局的线程函数里面将对象自己的指针通过this指针传入线程函数,赋值给对象指针。这样每个对象指针使用传进来的对象的数据库连接,互不干扰。
4)每个线程调用对象的业务执行方法Execute,传入需要处理的账号尾号。
5)按照账号尾号将要处理的数据加载到map容器中,accountid作为map的键值,每个账号的详细信息存放在second域的vector容器中,之后处理的数据源都从这个map容器获取,避免每处理一条都要连接数据的弊端。
6)遍历map容器,取出每个账号的详细信息,更新dconmsg,dconmsgpre,处理综合账单和明细账单,冲销综合表,冲销明细表,预存划拨前中间账单表,预存划拨前中间冲销表等表的数据。
7)主业务方法执行完毕,提交数据,关闭数据库连接,关闭数据库环境。
8)子线程从线程函数返回,主线程里面调用pthread_join等待子线程会合之后退出。
程序源码路径:账务处理(130..2.13)主机:
/account1/src/tools/OcsToBssCal/ OcsToBssCal.h
/account1/src/tools/OcsToBssCal/ OcsToBssCal.cpp
当然,多线程的相关知识远比我介绍的要多,我在此只是做一个浅显的介绍和说明,知识有限,请大家多多指导,一起学习,共同进步!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务