免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: boyatchinaunix
打印 上一主题 下一主题

[C++] 主流的数据库有异步调用接口吗? [复制链接]

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
11 [报告]
发表于 2013-11-27 11:06 |只看该作者
其实用DB同步也没差,搞异步反而增加项目维护成本,你可以想想业务逻辑多变,你如何高效的变更DB操作逻辑?

所以,多线程网络框架,同步DB访问就可以了,多开点线程,维护全局DB连接池。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
12 [报告]
发表于 2013-11-27 11:18 |只看该作者
本帖最后由 yulihua49 于 2013-11-27 11:21 编辑
boyatchinaunix 发表于 2013-11-27 10:57
这个功能正是我想要的,谢谢啊。



/**
* Set OCI blocking mode on/off.
*
* By default a database connection is in blocking mode. This means
* the call does not return until the task is finished. With this
* function you can change to non-blocking mode.
* In this case some functions can return SQLO_STILL_EXECUTING.
*
* The functions are:
* <ul>
* <li>sqlo_open2 (when called for queries)
* <li>sqlo_reopen (when called for queries)
* <li>sqlo_fetch (when called for non-queries)
* <li>sqlo_exec
* <li>sqlo_execute
* </ul>
* @param dbh I - A database handle where the blocking should be changed.
* @param on  I - SQLO_ON switches blocking mode on, SQLO_OFF switches to
*                non-blocking mode
* @return <ul>
* <li>SQLO_SUCCESS
* <li>SQLO_INVALID_DB_HANDLE
* <li> < 0 on error
* </ul>
* @since Version 2.2
*/
  1. if ( blocking != new_mode)
  2.     {
  3.       /* toggle the mode */
  4.       if (OCI_SUCCESS !=
  5.           (dbp->status = OCIAttrSet( (dvoid *) dbp->srvhp,
  6.                                      (ub4) OCI_HTYPE_SERVER,
  7.                                      (dvoid *) 0,
  8.                                      (ub4) 0,
  9.                                      (ub4) OCI_ATTR_NONBLOCKING_MODE,
  10.                                      dbp->errhp))) {
  11.         TRACE(2, fprintf(_get_trace_fp(dbp), "Unable to toggle blocking mode"););
  12.         CHECK_OCI_STATUS_RETURN(dbp, dbp->status, "sqlo_set_blocking", "");
  13.         return (dbp->status);
  14.       }

  15.     }
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
13 [报告]
发表于 2013-11-27 11:49 |只看该作者
本帖最后由 yulihua49 于 2013-11-27 11:53 编辑
boyatchinaunix 发表于 2013-11-27 10:07
我做的是个服务,采用epool IO处理方式。
并发量大,岂不是会有很多线程?数据库响应越慢,线程越多。

在另一个帖子聊过了哈。

在我们的中间件里,虽然支持异步,但我不主张这么做。
我建议,使用TPC(每个连接一个线程)的模式,外加交易管理器,提供线程池。
把应用逻辑和线程池分开。
使用TPC,可以数据库配连接池(连接数可配置,多少好可以试验),做同步访问。程序简单可靠,不易错。

tpc服务器不直接对外。所有客户端都连接到交易管理器,可支持上万的同时在线。
管理器对服务器有一个连接池,连接数可配置。管理器是线程池的,线程数可配置。
就是,线程数,连接数,数据库连接数都是可配置的,你可以通过试验,最佳搭配,都能满足交易要求。

这样,上万的客户端,到服务器一般只有几十个连接,起到了线程池的作用。
交易管理器的处理吞吐量为65000/秒,足够一般的高密度交易了。

论坛徽章:
0
14 [报告]
发表于 2013-11-27 11:49 |只看该作者
linux_c_py_php 发表于 2013-11-27 11:06
其实用DB同步也没差,搞异步反而增加项目维护成本,你可以想想业务逻辑多变,你如何高效的变更DB操作逻辑? ...


本来顺序执行的工作,被强行分成几个阶段,确实增加很多项目复杂性。
我也在想比较好的方案。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
15 [报告]
发表于 2013-11-27 11:58 |只看该作者
本帖最后由 yulihua49 于 2013-11-27 12:03 编辑
boyatchinaunix 发表于 2013-11-27 10:25
这个事情真是比较令人头疼,努力寻求最优解。
我要把数据库的操作结果反馈给用户。也不知道弄几个队列比较 ...

我们的中间件这个问题解决了,网络连接池,数据库连接池都是自愈的,较好的解决了故障和恢复的问题。
数量可配置,容易找到最佳搭配。
软件和文档可以到SDBC群,免费下载。
高性能数据库包装器可以使每个交易占时尽可能短。
搭配好了,数据库可以饱和,就是达到了数据库最高处理能力。这样,讨论前端服务器什么同步异步都是没有意义的。

论坛徽章:
0
16 [报告]
发表于 2013-11-27 12:00 |只看该作者
没用epool用 select 的路过

论坛徽章:
0
17 [报告]
发表于 2013-11-27 12:02 |只看该作者
yulihua49 发表于 2013-11-27 11:58
我们的中间件这个问题解决了,网络连接池,数据库连接池都是自愈的,较好的解决了故障和恢复的问题。
数 ...


我对数据库的操作很简单,只有三五条插入语句,也不会经常变化。
想找轻量级的解决方案。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
18 [报告]
发表于 2013-11-27 12:04 |只看该作者
本帖最后由 yulihua49 于 2013-11-27 12:18 编辑
boyatchinaunix 发表于 2013-11-27 12:02
我对数据库的操作很简单,只有三五条插入语句,也不会经常变化。
想找轻量级的解决方案。

那何必担心性能?
过于复杂的方案牺牲了可靠性。
交易中间件要应对每秒数万的密度,和并发、互斥等复杂情况。
当然简单的活也能干。

同步,也可以把数据库灌满,就是说没有改进余地。
应用服务器满不满又有什么关系呢?
同步异步又有什么关系呢?

服务线程数=数据库连接数,就没什么问题。
如果二者不等,就会有复杂的情况出现,服务器可能会死掉。
我们的中间件处理了这个问题,程序是比较复杂的。

论坛徽章:
0
19 [报告]
发表于 2013-11-27 12:44 |只看该作者
我做的是个插件,新开线程后,会有许多复杂的问题出现。
尤其是,如果线程是底层接口开的,会更不可控。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
20 [报告]
发表于 2013-11-27 12:52 |只看该作者
本帖最后由 yulihua49 于 2013-11-27 13:09 编辑
boyatchinaunix 发表于 2013-11-27 12:44
我做的是个插件,新开线程后,会有许多复杂的问题出现。
尤其是,如果线程是底层接口开的,会更不可控。

在旧系统上改的?那风险太大了。
线程管理应该在框架做,而不应该插件做。

哦,单线程框架,插件没法多线程,想异步操作?
那上下文调度很麻烦的。
你可能要把插件搞成二级框架了。
框架接口?socket?
把socket连同context抛到epoll,后边多个线程守护,激活后再抛到应用层,在应用层进行线程安全的业务,然后结果按原路抛回。
这样就可以多线程同步,避免单线程异步。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP