如何在不影响服务器性能的情况下从 TCP Server 进行数据库插入操作
How to make database insert operation from TCP Server without affecting server performance
我在.net 4.5 中设计了异步tcp 服务器。使用此 Link 的异步等待模式,目前多个客户端同时连接到服务器并发送一些字符串数据。
目前我将所有接收到的数据显示在控制台上只是为了测试目的
我的服务器代码如下
public class AsyncEchoServer
{
private int _listeningPort;
public AsyncEchoServer( int port)
{
_listeningPort = port;
}
public async void Start()
{
IPAddress ipAddre = IPAddress.Parse("192.168.2.4");
TcpListener listener = new TcpListener(ipAddre, _listeningPort);
listener.Start();
LogMessage("Server is running");
while (true)
{
try
{
var tcpClient = await listener.AcceptTcpClientAsync();
HandleConnectionAsync(tcpClient);
}
catch (Exception exp)
{
LogMessage(exp.ToString());
}
}
}
private async void HandleConnectionAsync(TcpClient tcpClient)
{
string clientInfo = tcpClient.Client.RemoteEndPoint.ToString();
try
{
using (var networkStream = tcpClient.GetStream())
using (var reader = new StreamReader(networkStream))
using (var writer = new StreamWriter(networkStream))
{
writer.AutoFlush = true;
while (true)
{
var dataFromServer = await reader.ReadLineAsync();
if (string.IsNullOrEmpty(dataFromServer))
{
break;
}
LogMessage(dataFromServer );
await writer.WriteLineAsync("FromServer-" + dataFromServer);
}
}
}
catch (Exception exp)
{
LogMessage(exp.Message);
}
finally
{
tcpClient.Close();
}
}
private void LogMessage(string message, [CallerMemberName]string callername = "")
{
System.Diagnostics.Debug.WriteLine("[{0}] - Thread-{1}- {2}", callername, Thread.CurrentThread.ManagedThreadId, message);
}
现在我想将其设计为将从客户端接收的数据插入到适当的数据库表中。
但我担心这是否会降低我的服务器的性能,因为数据库操作非常庞大。谁能建议我应该遵循什么方法来处理从多个客户端接收到的数据。
我正在考虑使用数据表将所有传入数据插入其中,并使用 bulkinsert 将其插入 sql 服务器
但我不确定如何为每个连接维护数据表,甚至不知道它是不是好主意
我只是不知道我应该从哪里开始,任何有价值的意见都会非常有帮助
提前致谢。
您已经有一个异步 TCP 服务器。显而易见的解决方案是也使数据库访问异步 - 那么数据库本身就是您的限制,而不是您的服务器代码。除非你同时为 50k 用户聊天,否则你真的没问题;否则,您将需要更多知识,而不仅仅是来自 SO 的简单提示 :)
我认为你不应该为这个任务使用 async-await。
您应该为每个客户端连接启动新线程
// Get new client
TcpClient Client = Listener.AcceptTcpClient();
// Create Thread
Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
// Start Thread for this client
Thread.Start(Client);
如您所见,创建的线程中的 async-await 没有意义。
我在.net 4.5 中设计了异步tcp 服务器。使用此 Link 的异步等待模式,目前多个客户端同时连接到服务器并发送一些字符串数据。
目前我将所有接收到的数据显示在控制台上只是为了测试目的
我的服务器代码如下
public class AsyncEchoServer
{
private int _listeningPort;
public AsyncEchoServer( int port)
{
_listeningPort = port;
}
public async void Start()
{
IPAddress ipAddre = IPAddress.Parse("192.168.2.4");
TcpListener listener = new TcpListener(ipAddre, _listeningPort);
listener.Start();
LogMessage("Server is running");
while (true)
{
try
{
var tcpClient = await listener.AcceptTcpClientAsync();
HandleConnectionAsync(tcpClient);
}
catch (Exception exp)
{
LogMessage(exp.ToString());
}
}
}
private async void HandleConnectionAsync(TcpClient tcpClient)
{
string clientInfo = tcpClient.Client.RemoteEndPoint.ToString();
try
{
using (var networkStream = tcpClient.GetStream())
using (var reader = new StreamReader(networkStream))
using (var writer = new StreamWriter(networkStream))
{
writer.AutoFlush = true;
while (true)
{
var dataFromServer = await reader.ReadLineAsync();
if (string.IsNullOrEmpty(dataFromServer))
{
break;
}
LogMessage(dataFromServer );
await writer.WriteLineAsync("FromServer-" + dataFromServer);
}
}
}
catch (Exception exp)
{
LogMessage(exp.Message);
}
finally
{
tcpClient.Close();
}
}
private void LogMessage(string message, [CallerMemberName]string callername = "")
{
System.Diagnostics.Debug.WriteLine("[{0}] - Thread-{1}- {2}", callername, Thread.CurrentThread.ManagedThreadId, message);
}
现在我想将其设计为将从客户端接收的数据插入到适当的数据库表中。
但我担心这是否会降低我的服务器的性能,因为数据库操作非常庞大。谁能建议我应该遵循什么方法来处理从多个客户端接收到的数据。
我正在考虑使用数据表将所有传入数据插入其中,并使用 bulkinsert 将其插入 sql 服务器
但我不确定如何为每个连接维护数据表,甚至不知道它是不是好主意
我只是不知道我应该从哪里开始,任何有价值的意见都会非常有帮助
提前致谢。
您已经有一个异步 TCP 服务器。显而易见的解决方案是也使数据库访问异步 - 那么数据库本身就是您的限制,而不是您的服务器代码。除非你同时为 50k 用户聊天,否则你真的没问题;否则,您将需要更多知识,而不仅仅是来自 SO 的简单提示 :)
我认为你不应该为这个任务使用 async-await。 您应该为每个客户端连接启动新线程
// Get new client
TcpClient Client = Listener.AcceptTcpClient();
// Create Thread
Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
// Start Thread for this client
Thread.Start(Client);
如您所见,创建的线程中的 async-await 没有意义。