Mysql
 sql >> база данни >  >> RDS >> Mysql

Doctrine2 в Symfony2:Как мога да видя кое извикване на обект води към заявка?

Doctrine използва Карта на самоличността модел за проследяване на обекти. Така че всеки път, когато извличате обект от базата данни, Doctrine запазва препратка към този обект в своята UnitOfWork. И по същество той използва идентификатора като ключ за управление на обекти в своята UnitOfWork.

Напр.

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

ще задейства само една заявка SELECT към базата данни. Във второто повикване доктрината ще провери картата на идентичността и ще намери същия идентификатор, без да прави двупосочно пътуване с база данни. Дори ако използвате прокси обект, обектът ще има същия идентификатор.

Но за

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

ще видите две заявки във вашия SQL дневник, въпреки факта, че препращате към един и същ обект. Doctrine познава обекти само по ID , така че заявка за различен критерий трябва да отиде в базата данни, дори ако е била изпълнена преди това.

Но доктрината е умна, тя не създава нов обект, а получава идентификатора и гледа дали вече е в паметта.

PHP следва парадигмата на копиране при запис, това е принцип на оптимизация. Истинско копие на променлива се прави само когато променливата е променена. Така че използването на паметта за заявка, която чете обекти от базата данни, е същата, както ако не се запази копие на променлива.

Така че само когато промените променливи, вашите приложения създават вътрешно нови променливи и консумират памет.

Така че, когато извикате flush , доктрината преглежда Identiy Map и сравнява оригиналното свойство на всеки obecjts с текущите стойности. Ако бъдат открити промени, той ще се постави на опашка за заявка UPDATE. Само действително актуализираните полета се променят в базата данни.

Как да оптимизираме

Така че понякога има смисъл да маркирате обекти като само за четене (само вмъкване и премахване), така че те да не са в набора от промени (можете да го направите във вашия xml файл за съпоставяне или с пояснения или във вашия php код).

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

Или изчистете само един обект

$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. Вмъкване на изображения в база данни

  2. Алтернатива на използването на ключова дума LIMIT в подзаявка в MYSQL

  3. добавянето на пакет RMySQL към R се проваля (в Windows)?

  4. Предайте масив на съхранената рутина в MySQL

  5. Задаване на конфигурационни променливи на MySQL – MySQL 5.7 срещу MySQL 8.0