关于并发的处理

来源:互联网  时间:2016/7/28 8:26:38

关于网友提出的“ 关于并发的处理”问题疑问,本网通过在网上对“ 关于并发的处理”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 关于并发的处理
描述:

有一个项目:多客户端(几百个),服务端采用socket监听,把客户端的数据写入数据库,如何保证客户端数据不丢包和服务器数据库的写入不会产生并发错误(或者各数据都能够完整的写入数据库)。
请大家提提思路,不胜感谢!
我的思路:服务器采用多线程,如果listen到客户端请求,就开一个线程处理数据写入数据库,但是这样的结构会否出现数据库的并发写入冲突问题呢?


解决方案1:

用异步网络模式,对每个客户端开线程效率太低了
收到数据后写到一个内存队列中
再起一个专门的写数据库的线程,等待内存队列的写入事件
有数据就写数据库
这样你只要对你的内存队列进行同步处理,而无需对数据库进行同步处理

解决方案2:

1、ADO效率低,且单一ADO连接在多个线程中使用不好互斥。解决方法可以使用本身就支持数据操作互斥的数据库以及更低级的数据库接口,比如如果你用的是oracle,则可以考虑直接使用OCI,提高效率。
2、如果服务器端对每个请求的服务都很简单的话(比如仅仅是回复一个简单的“Ok”),就没必要为每个服务都开个新线程,这样确实效率低(开关线程本身耗费资源),且高并发情况下服务器端负担重(几百个连接就开几百个线程?),可以考虑非阻塞模式,服务器端单线程搞定,毕竟几百个连接不算多,效率影响不大。

解决方案3:

使用IOCP模式

解决方案4:

数据库数据的同步问题一般数据库自己会解决的,就是不用自己去加锁处理了。
也可以采用非多线程的方式解决,就是采用I/O复用的网络模型

解决方案5:

就像LZ说的那样,一个客户端服务器建立一个线程,对数据库建立一个连接(或者操作数据库时连接,用完立即关闭)。只要你的程序写的没有问题(各客户端不发重复数据、服务器性能没问题),理论上数据是不会重复和丢失的。
如果各客户端可能有重复数据发过来,存数据库是验证一下是否存在(可以数据库把关键字设为主键)

解决方案6:

TCP,加消息验证头。。。

解决方案7:

几百个连接的话,用异步网络模型也可以了,当然用重叠IO,IOCP也行
如果listen到客户端请求,就开一个线程来处理的话,线程的创建跟销毁会有消耗的,用线程池实现下
至于数据库,我也用得不多,用事务的话应该不错吧

上一篇请教一个简单的进制转换算法?
下一篇SNMP要获取CPU使用率信息?
明星图片
相关文章
《 关于并发的处理》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)