মাইস্কুল সংযোগ খোলার সময় কোনও ব্যতিক্রম ছোঁড়া হচ্ছে না?


14

আমি কেবল অ্যাসিঙ্ক এবং টাস্ক দিয়ে শুরু করছি এবং আমার কোডটি প্রক্রিয়া বন্ধ করে দিয়েছে। যখন আমার কাছে ইনকামিং নেটওয়ার্ক প্যাকেট থাকে এবং আমি প্যাকেট হ্যান্ডলারের ভিতরে থাকা ডাটাবেসের সাথে চেষ্টা করে যোগাযোগ করি It

public class ClientConnectedPacket : IClientPacket
{
    private readonly EntityFactory _entityFactory;

    public ClientConnectedPacket(EntityFactory entityFactory)
    {
        _entityFactory= entityFactory;
    }

    public async Task Handle(NetworkClient client, ClientPacketReader reader)
    {
        client.Entity = await _entityFactory.CreateInstanceAsync( reader.GetValueByKey("unique_device_id"));

        // this Console.WriteLine never gets reached
        Console.WriteLine($"Client [{reader.GetValueByKey("unique_device_id")}] has connected");
    }
}

হ্যান্ডেল পদ্ধতিটি একটি অ্যাসিঙ্ক টাস্ক থেকে কল করা হয়

if (_packetRepository.TryGetPacketByName(packetName, out var packet))
{
    await packet.Handle(this, new ClientPacketReader(packetName, packetData));
}
else
{
    Console.WriteLine("Unknown packet: " + packetName);
}

এখানে আমি মনে করি যে পদ্ধতিটি সমস্যাটি সৃষ্টি করছে

public async Task<Entity> CreateInstanceAsync(string uniqueId)
{
    await using (var dbConnection = _databaseProvider.GetConnection())
    { 
        dbConnection.SetQuery("SELECT COUNT(NULL) FROM `entities` WHERE `unique_id` = @uniqueId");
        dbConnection.AddParameter("uniqueId", uniqueId);

        var row = await dbConnection.ExecuteRowAsync();

        if (row != null)
        {
            return new Entity(uniqueId, false);
        }
    }

    return new Entity(uniqueId,true);
}

ডাটাবেসপ্রভাইডারের গেট সংযোগ পদ্ধতি:

public DatabaseConnection GetConnection()
{
    var connection = new MySqlConnection(_connectionString);
    var command = connection.CreateCommand();

    return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}

ডাটাবেস সংযোগের নির্মাণকারী:

public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
    _logger = logger;

    _connection = connection;    
    _command = command;

    _connection.Open();
}

আমি যখন এই লাইনটি মন্তব্য করি তখন এটি পৌঁছে যায় Console.WriteLine

_connection.Open();

3
সচেতন থাকুন যে ওরাকলের মাইএসকিউএল সংযোগকারী / নেট (ওরফে মাইএসকিএল.ডাটা) আসলে কোনও অ্যাসিঙ্ক অপারেশন বাস্তবায়ন করে না: stackoverflow.com/a/40065501/23633 আপনি যদি মাইএসকিউএল এর সাথে অ্যাসিঙ্ক
ব্র্যাডলি

আপনার কোডটিতে একটি অচলাবস্থা আছে বলে মনে হচ্ছে। আমি যখন ভিজুয়াল স্টুডিও ডিবাগারটি ভেঙে সমান্তরাল স্ট্যাকস উইন্ডোটি খোলার পরামর্শ দেব recommend যদি এটি কল স্ট্যাকের সাথে এক বা একাধিক থ্রেড দেখায় যা কোনও কার্য (বা কিছু সিঙ্ক্রোনাইজেশন আদিম) এ ব্লক করে চলেছে, তবে আপনি আশা করি কী ভুল হচ্ছে তা বলতে সক্ষম হবেন (বা আমাদের সাহায্যের জন্য প্রশ্নে আরও বিশদ সম্পাদনা করুন)। কোনও থ্রেড যদি কোনও টাস্কে অবরুদ্ধ না থাকে, তবে আপনার কাছে সম্ভবত একটি টাস্ক রয়েছে যা কখনও শেষ হয় না, এবং এতে থাকা কোডটি কখনও সক্রিয় awaitকরে না। এটি নির্ণয় করা অনেক কঠিন।
ব্র্যাডলি গ্রেনার

আপনি কি ডাটাবেস সংযোগ.ডিসপসএেন্সিকের প্রয়োগটি যুক্ত করতে পারেন?
আইজেনপনি

যদি আপনি 5 মিনিটের জন্য অপেক্ষা করেন তবে এটি কি শেষ পর্যন্ত একটি ব্যতিক্রম ছুঁড়ে ফেলে? Connection.openএটি সংযোগ দেওয়ার চেষ্টা করার সময় ফিরে আসে না, তবে শেষ পর্যন্ত সময়সীমা নির্ধারণের পরে ছেড়ে দেবে। অথবা আপনি সংযোগ অবজেক্টের টাইমআউট মানটি 0 টির চেয়ে কম সংখ্যকতে পরিবর্তন করতে পারেন এবং ব্যতিক্রম আছে কিনা তা দেখুন।
ওয়েইচ

উত্তর:


1

আমি একটি পিওসি প্রকল্প চালাচ্ছি যার মাধ্যমে মাইএসকিএল.ডাটা 8.0.19 এবং মাইএসকিএলকনেক্টর 0.63.2 .NET কোর 3.1 কনসোল অ্যাপ্লিকেশনটিতে 100 সমান্তরাল কাজগুলি স্পিনিং করে। আমি প্রতিটি একক কাজের প্রসঙ্গে সংযোগটি তৈরি করি, খুলি এবং নিষ্পত্তি করি। উভয় সরবরাহকারী ত্রুটি ছাড়াই সমাপ্তির দিকে চালিত হয়।

সুনির্দিষ্ট যে MySql.Data প্রশ্নের চালানো হয় সিঙ্ক্রোনাস যদিও গ্রন্থাগার প্রদান ASYNC পদ্ধতি স্বাক্ষর যেমন ExecuteReaderAsync () বা ExecuteScalarAsync (), যখন MySqlConnector সত্যিই চালানোর দ্বারা অ্যাসিঙ্ক্রোনাস

আপনি এর মধ্যে চলতে পারেন:

  • একটি অচলাবস্থার পরিস্থিতি বিশেষত মাইএসকিএল সরবরাহকারীর সাথে সম্পর্কিত নয়
  • আপনার কার্যগুলির মধ্যে ব্যতিক্রমগুলি সঠিকভাবে পরিচালনা করছেন না (আপনি কার্য সম্পর্কিত সংযুক্ত ব্যতিক্রমটি পরীক্ষা করতে পারেন এবং মাইএসকিএল ডিবি লগগুলিও পর্যবেক্ষণ করতে পারেন)
  • আপনি যখন ধরে নেন যে এটি কার্যকর হচ্ছে না তখন আপনি মৃত্যুদণ্ড কার্যকর করা অবরুদ্ধ থাকে (ফলাফল ফেরত দেয় না), আপনি যদি মাইএসকিএল.ডাটা সাথে একটি উচ্চ সংখ্যক সমান্তরাল কাজ চালাচ্ছেন কারণ এটি সমকালীনভাবে কার্যকর করে

0

মাইএসকিউএল সহ মাল্টি-থ্রেডিংয়ের অবশ্যই স্বাধীন সংযোগগুলি ব্যবহার করা উচিত । প্রদত্ত যে, মাল্টিথ্রেডিং কোনও মাইএসকিউএল প্রশ্ন নয় বরং ক্লায়েন্টের ভাষার জন্য একটি সমস্যা, আপনার প্রশ্নে সি #।

এটি হ'ল মাইএসকিউএলকে বিবেচনা না করে আপনার থ্রেডগুলি তৈরি করুন , তারপরে প্রতিটি থ্রেডে একটি সংযোগ তৈরি করুন যা প্রশ্নের দরকার। থ্রেডগুলির মধ্যে ডেটা পাস করার প্রয়োজন হলে এটি আপনার কাঁধে থাকবে।

আমি সাধারণত দেখতে পাই যে অনুকূলিতকরণ অনুসন্ধানগুলি আমার অ্যাপ্লিকেশনগুলিকে মাল্টি-থ্রেড করার প্রলোভনটি দূর করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.