项目:IOCP的多线程(工作线程)解析大量客户端发送过来的数据;这个数据量是非常大的,上千个客户端,每50MS发送一个数据包过来,要把他们写入数据库。以下是我做的两种设计,均不能成功。
1.简单地通过程序一条一条地执行SQL语句写入数据库,失败,效率极低,淘汰。
2.我目前的处理是把这个SQL语句做一个拼接(...+SQL语句+;+SQL 语句+;+...),然后一并执行,写入数据库,但是这么设计的话,内存会一直涨,因为写入数据库的速率小于IOCP解析出来的数据所形成的SQL语句,它是占内存。
需解决的问题如下:
在不做分布式数据库设计的情况,有什么高性能的写数据库的方法, 我是用的数据库是SQL server 2008 ,用VC++ 实现,因为C#的话,微软封装了相应的类。求高手指教
数据库性能很难跟上这种数据处理速度,你可以考虑先放内存队列,或者内存数据库。
等数据接受完了再写入数据库。
可以考虑使用存储过程,减少与数据库通信的数据量,执行速度更快。
首先你应该通过性能测试分析,确定影响性能的环节在哪里。
就你现在的情况分析,写入数据库的速度必须大于接受数据的速度;
如果你依然坚持使用SQL server 2008,我觉得可以考虑使用存储过程;
你目前的处理是把这个SQL语句做一个拼接,这样通信量会增加,数据库需要逐条优化,影响性能;
而使用使用存储过程,你可以一个存储过程接收10个、20个、N个参数(需要更新或插入的数据);
至于存储过程具体的优点使用请自行查阅;另外可以建立多个数据库链接同时写入数据;
但考虑到磁盘写入速度的限制,应该考虑分库分表,利用多个磁盘提升磁盘IO性能;
按你的情况,数据量非常大的话应该考虑多台数据库服务器;
另外数据库方面推荐采用NoSQL。
我说的存储过程的意思是这样的:
存储过程(插入数据1, 插入数据2, 插入数据N){
Insert TableName(column) values( 插入数据1)
Insert TableName(column) values( 插入数据2)
Insert TableName(column) values( 插入数据N)
}
把SQL语句写在存储过程内部,这样在创建存储过程时,SQL语句就被优化了,
不需要每次执行都优化。
可以通过MQ,然后批量写库。
若不用MQ,可以通过自己写 SOCKET 进行数据传输,然后批量写库。