浅谈数据库的多线程应用.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈数据库的多线程应用 在日常的编程中,当需要批量数据处理的时候,我们习惯用多进程来处理问题,通常的做法是在主进程 里面 fork 出来多个子进程,这样父进程相当于克隆多个自己,为每个子进程分配新的数据和代码空间,在程序 运行期间,进程作为独立的包含程序指令和相关资源的集合, 与其它进程一起参与调度, 竞争 CPU,内存等资源, 这样可以解决很多并发问题,但同时也带来一些问题: 进程的切换需要更多的开销,每次切换进程需要保存更多的现场与资源。 进程间不能很好的通讯与同步。 为了更好的提高并发效率,我们经常会用到多线程。对于同一个进程内部的多个线程,共享的是同一个 进程的所有资源。与每个进程独有自己的内存空间不同,同属一个进程的多个线程共享该进程的内存空间。例 如在进程地址空间中有一个全局变量  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 指针传入线 程函数,赋值给对象指针。这样每个对象指针使用传进来的对象的数据库连接,互不干扰。 每个线程调用对象的业务执行方法 Execute, 传入需要处理的账号尾号。 按照账号尾号将要处理的数据加载到map容器中, accountid 作为 map的键值,每个账号的详细信息存放在 second域的 vector 容器中,之后处理的数据源都从这个 map容器获取,避免每处理一条都要连接数据的弊端。 遍历 map容器,取出每个账号的详细信息,更新 dconmsg, dconmsgpre,处理综合账单和明细账单,冲销综合表 , 冲销明细表,预存划拨前中间账单表,预存划拨前中间冲销表等表的数据。 主业务方法执行完毕,提交数据,关闭数据库连接,关闭数据库环境。 子线程从线程函数返回,主线程里面调用 pthread_join 等待子线程会合之后退出。程序源码路径:账务处理 (130.89.2.13) 主机: /account1/src

文档评论(0)

明若晓溪 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档