我正在实现像MySQL这样的小型数据库..它是一个更大项目的一部分..
现在我已经设计了核心数据库,我的意思是我已经实现了一个解析器,我现在可以在我的数据库上执行一些基本的SQL查询..它可以存储,更新,删除和从文件中检索数据..现在很好..但是我想在网络上实现这个..
我希望多个用户能够同时访问我的数据库服务器并对其执行查询...我在Linux下工作,所以现在没有可移植性问题..
我知道我需要使用套接字,这很好..我也知道我需要使用像Thread Pool这样的概念,我需要在最初创建最大线程数,然后为每个客户端请求唤醒一个线程并将其分配给客户端..
至于现在我无法弄清楚所有这些实际上是如何捆绑在一起的..我应该在客户端/服务器端实现多线程..?如何将我的解析器配置为分别从每个客户端获取输入?(主要通过我认为的文件?)
如果有人知道如何实现这一点请告诉我bcos我被困在这个项目中......
谢谢.. :)
答案 0 :(得分:2)
服务器端,因为它是唯一可以理解信息的人。您需要设计锁或提出自己的模型,以确保修改/编辑不会影响获得服务的人。
答案 1 :(得分:2)
作为多线程的替代方法,您可以考虑基于事件的单线程方法(例如使用poll或epoll)。使用这种方法的非常快速(非SQL)数据库的一个例子是redis。
这种设计有两个明显的缺点:您只使用一个CPU核心,而冗长的查询会在明显的时间内阻止其他客户端。但是,如果查询速度相当快,则没有人会注意到。
另一方面,单线程设计具有自动序列化请求的优点。没有歧义,没有锁定需求。在读取(或另一次写入)之间不能写入,它就不会发生 如果您没有像数据库中内置的强大的工作MVCC(或者至少在其中工作),那么知道您不必担心可能是一个巨大的优势。并发读取不是一个问题,而是并发读取和写入。
或者,您可以考虑在一个线程中执行输入/输出和语法检查,并在另一个线程中运行实际查询(通过队列传递查询)。这也将消除同步问题,它至少会提供一些延迟隐藏和一些多核。
答案 2 :(得分:2)
如果您还没有,请查看Beej's Guide to Network Programming以便在插座编程中弄清楚。
接下来,我将使用他的example of a stream client and server并将其用作单线程查询系统。一旦你失败了,你需要选择是否要实际使用线程或使用select()
。我的直觉说你的磁盘数据库还不支持并行写入(可能是读取),因此服务请求的单个服务器线程可能是你最好的选择!
在多客户端模型中,您可以使用客户端信息的简单每插槽哈希表,并在处理查询时立即返回任何结果。一旦进入网络和数据库查询的线程,它就会变得相当复杂。因此,从单个客户端开始,为多个客户端添加轮询,然后开始阅读并处理线程化(可能使用pthreads)客户端 - 服务器模型。