Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Doctrine2 di Symfony2:Bagaimana saya bisa melihat panggilan objek mana yang mengarah ke kueri?

Ajaran menggunakan Peta Identitas pola untuk melacak objek. Jadi, setiap kali Anda mengambil objek dari database, Doctrine menyimpan referensi ke objek ini di dalam UnitOfWork-nya. Dan pada dasarnya ia menggunakan ID sebagai kunci untuk mengelola objek di dalam UnitOfWork-nya.

Mis.

$objectA = $this->entityManager->find('EntityName', 1);
$objectB = $this->entityManager->find('EntityName', 1);

akan memecat hanya satu kueri SELECT terhadap database. Pada doktrin panggilan kedua akan memeriksa peta identitas dan akan menemukan ID yang sama tanpa melakukan bolak-balik database. Bahkan jika Anda menggunakan objek proxy, objek tersebut akan memiliki ID yang sama.

Tapi untuk

$objectA = $repository->findOneBy(array('name' => 'Benjamin'));
$objectB = $repository->findOneBy(array('name' => 'Benjamin'));

Anda akan melihat dua kueri di log SQL Anda, meskipun Anda mereferensikan objek yang sama. Doktrin hanya mengetahui objek dengan ID , jadi kueri untuk kriteria yang berbeda harus masuk ke database, meskipun sudah dieksekusi sebelumnya.

Tapi doktrin itu cerdas, tidak membuat entitas baru tetapi mendapatkan ID dan terlihat apakah sudah ada di memori.

PHP mengikuti paradigma copy-on-write, ini adalah prinsip optimasi. Salinan nyata dari variabel hanya dibuat ketika variabel dimodifikasi. Jadi penggunaan memori untuk permintaan yang membaca objek dari database sama seperti jika tidak menyimpan salinan variabel.

Jadi hanya ketika Anda mengubah variabel, aplikasi Anda membuat variabel baru secara internal dan menghabiskan memori.

Jadi saat Anda memanggil flush , doktrin mengulangi Peta Identitas dan membandingkan properti asli setiap objek dengan nilai saat ini. Jika perubahan terdeteksi, itu akan mengantre untuk kueri UPDATE. Hanya bidang yang benar-benar diperbarui yang diubah dalam basis data.

Cara mengoptimalkan

Jadi terkadang masuk akal untuk menandai objek sebagai hanya-baca (hanya menyisipkan dan menghapus), sehingga objek tersebut tidak akan ada di set perubahan (Anda dapat melakukannya di file pemetaan xml atau dengan anotasi atau dalam kode php Anda).

$entityManager->getUnitOfWork()->markReadOnly($entity)

Atau siram hanya satu entitas

$entityManager->flush($entity)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 24 jam nilai

  2. Bagaimana menghubungkan flutter ke database mysql localhost

  3. Pokoknya untuk Membatasi waktu Eksekusi Query MySQL?

  4. Kueri relevansi mentah di Laravel. Bagaimana menanganinya?

  5. Bagaimana cara MySQL menyimpan data?