Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Ralat MySQL 2014 Berlaku Apabila Melaksanakan Pertanyaan Serentak dengan PDO?

Mengapa Ralat MySQL 2014 Berlaku Apabila Melaksanakan Pertanyaan Serentak dengan PDO?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-19 01:23:021035semak imbas

Why Does MySQL Error 2014 Occur When Executing Queries Concurrently with PDO?

Punca Ralat MySQL 2014: Tidak Dapat Melaksanakan Pertanyaan Semasa Pertanyaan Tidak Dibuffer Lain Aktif

Pengenalan

Ralat ini berlaku apabila cuba melaksanakan berbilang pertanyaan serentak semasa menggunakan PDO dengan PDO::ATTR_EMULATE_PREPARES ditetapkan kepada palsu. Ia menunjukkan bahawa pelayan MySQL tidak dapat mengendalikan melaksanakan pertanyaan tambahan sehingga semua pertanyaan yang tidak ditimbal sebelum ini telah diambil.

Sebab Ralat

Tingkah laku lalai PDO adalah untuk meniru pernyataan yang disediakan dengan menterjemahkannya ke dalam pertanyaan yang tidak ditimbal . Pertanyaan yang tidak ditimbal dilaksanakan serta-merta, dan hasilnya tidak disimpan di sebelah klien. Ini membolehkan pengendalian cekap memori bagi set hasil yang besar.

Walau bagaimanapun, apabila beroperasi dalam mod ini, MySQL mengenakan sekatan yang menghalang pelaksanaan pertanyaan berikutnya semasa pertanyaan yang tidak ditimbal masih dalam proses. Di sinilah ralat 2014 bermula.

Penyelesaian

Terdapat beberapa pendekatan untuk menyelesaikan ralat ini:

  1. Dayakan Pertanyaan Buffer: Anda boleh menetapkan PDO::MYSQL_ATTR_USE_BUFFERED_QUERY kepada benar dalam parameter sambungan objek PDO. Ini mengarahkan PDO untuk menggunakan pertanyaan penimbal, yang menyimpan hasil pada sisi klien dan membenarkan pelaksanaan pertanyaan serentak.
  2. Gunakan fetchAll() atau closeCursor(): Selepas setiap pelaksanaan pertanyaan yang tidak ditimbal, anda boleh menggunakan PDOStatement::fetchAll() untuk mendapatkan semua keputusan dalam sekali gus. Sebagai alternatif, memanggil closeCursor() melepaskan sumber pelayan yang dikaitkan dengan pertanyaan tidak buffer, membenarkan pertanyaan berikutnya dilaksanakan.
  3. Tukar ke mysqlnd: Pustaka mysqlnd menyediakan pemacu yang lebih maju dan cekap untuk MySQL . Ia menyokong kedua-dua pertanyaan tidak buffer dan buffered serta mengendalikan pelaksanaan pertanyaan serentak dengan lebih berkesan.

Amalan Terbaik Disyorkan

Untuk prestasi dan kecekapan optimum, adalah disyorkan untuk menggunakan pertanyaan buffer apabila mengendalikan set hasil yang besar atau apabila konkurensi adalah kritikal. FetchAll() atau closeCursor() hendaklah digunakan selepas setiap pelaksanaan pertanyaan tidak buffer untuk melepaskan sumber pelayan. Selain itu, penggunaan mysqlnd amat digalakkan untuk ketersambungan dan prestasi MySQL yang lebih baik.

Atas ialah kandungan terperinci Mengapa Ralat MySQL 2014 Berlaku Apabila Melaksanakan Pertanyaan Serentak dengan PDO?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn