Saya mendapatkan kesalahan "server mysql telah hilang" ketika saya membuat dua koneksi ke database yang sama dari proses yang sama dan mencoba mengaksesnya. Saya telah mencari solusi di Internet, dan dikatakan itu mungkin disebabkan oleh batas waktu server atau permintaan yang terlalu besar. Tetapi dalam kasus saya, ini bukan masalahnya.

Berikut ini adalah kode saya yang sebenarnya. Saya membuat dua objek (penghapus dan mesin fotokopi) dari ContentsCopyCopier. fungsi init() membuat koneksi ke database yang ditentukan dalam configFile. Karena kedua objek menggunakan configFile yang sama, yang terhubung ke database yang sama. Saya menjalankan penghapus di utas lain dan menjalankan mesin fotokopi di utas saat ini.

int main(){
    ...
    ContentsCopyCopier deleter(configFile);
    log_.write(LogType::INFO, "Start to initialize deleter");
    if(!deleter.init())
    {
        log_.write(LogType::ERROR, "Failed to initialize deleter.");
        return 1;
    }
    std::thread delete_thread(&ContentsCopyCopier::runDeleteThread, deleter);

    ContentsCopyCopier copier(configFile);
    /* Initialize ContentsCopyCopier */
    log_.write(LogType::INFO, "Start to initialize ContentsCopyCopier.");
    if(!copier.init())
    {
        log_.write(LogType::ERROR, "Failed to initialize ContentsCopyCopier.");
        return 1;
    }
    log_.write(LogType::INFO, "Initialize ContentsCopyCopier successfully.");

    /* Start to run ContentsCopyCopier */   
    log_.write(LogType::INFO, "Start to run ContentsCopyCopier.");
    if(!copier.run())
    {
        log_.write(LogType::ERROR, "Failed to run ContentsCopyCopier.");
        return 1;
    }
    log_.write(LogType::INFO, "Run ContentsCopyCopier successfully.");

    return 0;
}

Dalam fungsi init(), saya membuat koneksi. db_ adalah variabel anggota kelas ContentsCopyCopier.

bool ContentsCopyCopier::init(){
    ...
    /* Connect to mysql */
    if(!db_.connect(param_.mysql_host, param_.mysql_database, param_.mysql_user, param_.mysql_password))
    {
        log_.write(LogType::ERROR,"Failed to connect to MySQL.");
        return false; 
    }
    ...
}

MySQLConnection::MySQLConnection()
{
    bool reconnect = true;
    conn = mysql_init(NULL);
    mysql_options(conn, MYSQL_OPT_RECONNECT, &reconnect);
}

bool MySQLConnection::connect(std::string host, std::string database, std::string user, std::string password)
{
    if(!mysql_real_connect(conn, host.c_str(), user.c_str(),password.c_str(), database.c_str(), 0, NULL, 0)){
        return false;
    }

    return true;
}

MySQLConnection::~MySQLConnection()
{
    mysql_close(conn);
}

Ketika saya menjalankan fungsi ini di utas baru, saya mendapatkan kesalahan "server mysql telah hilang".

void ContentsCopyCopier::runDeleteThread()
{
    try{
        db_.updateDeleting1MediaFilesToDisabled1(hostName_);  <-  here is the position I got the error
    }catch(MySQLException e){
        log_.write(LogType::ERROR, e.detail + "(" + e.query + ")");
        log_.write(LogType::ERROR, e.msg);
        return; 
    }
    ...
}

void MySQLConnection::updateDeleting1MediaFilesToDisabled1(std::string stock)
{
    std::string query = "UPDATE mediafiles ";
    query += " SET Status='" + DISABLED1 + "',";
    query += " UpdateDate='" + getCurrentTime() + "'";
    query += " WHERE Status ='" + DELETING_1 + "' AND Stock = '" + stock + "';";

    // Execute a sql statement
    if (mysql_query(conn, query.c_str())) {
        MySQLException e;
        e.detail = mysql_error(conn);
        e.query = query;
        e.msg = "Failed to update status from deleting_1 to disabled_1.";
        throw e;
    }
}

Apa masalahnya?

0
suihe dolood 19 November 2020, 12:05

1 menjawab

Jawaban Terbaik

Masalah diselesaikan dengan memanggil fungsi mysql_thread_init di utas baru, yang menginisialisasi status per utas MySQL.

1
Botje 19 November 2020, 09:45