Как заставить операцию вставки базы данных с TCP-сервера, не влияя на производительность сервера
Я разработал асинхронный tcp сервер в.net 4.5. с помощью асинхронного шаблона ожидания с использованием этой ссылки, в настоящее время несколько клиентов подключаются к серверу одновременно и отправляют некоторые строковые данные.
В настоящее время я показываю все полученные данные на консоль только для тестирования.
Мой код сервера, как показано ниже
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 Server
но я не уверен, как сохранить данные для каждого соединения, или даже его хорошая идея или нет
Я просто не знаю с чего начать. Любой ценный вклад был бы очень полезен.
Заранее спасибо.
2 ответа
У вас уже есть асинхронный 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);
Как видите, в созданном потоке нет смысла в асинхронном ожидании.