2012-02-10 30 views
1

我正在使用boost.asio在C++中编写网络应用程序。boost.asio和对数据库的查询

我需要做三件事情:

  1. 使从客户端
  2. 连接发出请求到数据库
  3. 将结果返回给客户端。

除2中的所有操作是非阻塞模式。但是在数据库查询期间,所有的应用程序都被阻塞,并且其他客户不能正常运行。

我该如何处理这种情况?

+1

我要去无路可退,并与所提供的有限的信息说,字面上有办法让你“在这种情况下,”无限号。你能提供更多的信息吗?你有什么尝试,什么是工作,什么不是?什么是数据库平台?后端数据库是否支持多个并发查询?你在任何地方使用锁或互斥锁吗?您可以为您认为可能导致问题的位置提供的任何代码? – Chad 2012-02-10 21:30:14

回答

0

如你没有提供你的情况的详细说明我假设,你想处理在许多concurent线程客户端的连接。 连接处理程序在线程中运行,称为io_service::run()

您可以创建线程处理连接处理程序(并等待最终确定数据库连接),从多个线程运行io_service::run()池。见Boost.Asio docs

0

不幸的是,有许多外部库不提供异步接口。当图书馆试图抽象出它的一些重要方面时,这种情况通常会发生。在这种情况下,数据库接口abstraction is leaking通过阻塞您的线程来阻止网络请求。

除非你的数据库供应商提供了一个异步接口(我怀疑这一点,从来没有见过一个做),你将不得不面对这一事实,这个块。您基本上必须考虑它几乎等于完成运行CPU密集型计算的任务。

您将需要产生一个额外的线程来发出请求,而不会阻止异步I/O完成处理程序将此工作转移到另一个进程并使该进程阻塞数据库查询。这是网络服务器的常见设计,网关只是将I/O转发给应用程序服务器,然后应用程序服务器以同步方式工作而不会阻塞网关。