Как заставить операцию вставки базы данных с 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);

Как видите, в созданном потоке нет смысла в асинхронном ожидании.

Другие вопросы по тегам