+ All Categories
Home > Engineering > Doctrine Internals. UnitOfWork

Doctrine Internals. UnitOfWork

Date post: 16-Apr-2017
Category:
Upload: andrew-yatsenko
View: 277 times
Download: 0 times
Share this document with a friend
35
Presentation title here Doctrine internals UnitOfWork
Transcript
Page 1: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine internalsUnitOfWork

Page 2: Doctrine Internals. UnitOfWork

Presentation title here

About me

https://www.facebook.com/yatsencohttps://github.com/anyt

about me…

Andrey Yatsenco

● PHP Developer at Oro Inc.● 3 years with Symfony ● 6 years with PHP

Page 3: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Introduction● Doctrine is the bottleneck for many apps● You know how UnitOfWork is working, you

know how doctrine works

Page 4: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

UnitOfWork track objects changes and commit them transactionally to the Database.Now you don’t manage object loading from the DataBase. UOW do.

Page 5: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

UOW use IdentityMap to track objects changes and to avoid server round tripIt simple two level array storage● First level keys are ClassNames● Second level keys are object IDs.

Page 6: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Doctrine EntityManager is like all-in-one decorator on● Repository● UnitOfWork● MetadataFactory● ProxyFactory● etc.

Page 7: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

EntityManager -> EntityRepository● find● findOneBy● findAll● customFindQueryWithHidration● etc.

Page 8: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

EntityManager->UnitOfWork● persist● refresh● remove● flush ● etc.

Page 9: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

EntityManager->UnitOfWork● persist ● refresh ● remove● commit● etc.

Page 10: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Doctrine flow ● 1) Fetch entities from the database or

create new and persist ‘em (Repo|UOW)● 2) Update some of entities directly or using

wrapper like Form (uses PropertyAccess)● Remove some, if needed (Forms etc.)● 3) EM->flush() changes (UOW)

Page 11: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

1) Fetching entities from the DB● One entity:

○ find○ findOneBy

● Several entities:○ Lazy/Eager loading○ Find partial

Page 12: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

1) Persist● Can be omitted if you fetched entities from

doctrine● Required only for newly created entities

Page 13: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

2) Update Object changes outside Doctrine.● Direct changes● Forms (PropertyAccessor)● etc.

Page 14: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

3) FlushSync changes with the Database

Page 15: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

3) Flush Flow● Open DB transaction● Complute change-sets for update● Iterate over scheduled inserts, updates,

deletes● Delegate to entity persister SQL generation

and execution● Clear UOW on success● Close DB transaction

Page 16: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

UnitOfWork through Doctrine Events● fetch● persist● remove● flush

Page 17: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

FetchRepo-> find|refresh|getReference|etc.● (optional) sync data with DB● Events::loadClassMetadata

○ If ! Events:onClassMetadataNotFound● hydrate● Events:postLoad

Page 18: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Persist● Events:prePersist● Entity ID isn’t exist at this time in most cases● UOW->scheduleForInsert($entity)

Page 19: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Remove● Events::preRemove● UOW->scheduleForDelete($entity)

Page 20: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Flush● UOW->commit(null|object|array $entity)

Page 21: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Flush (1)● Events::preFlush

○ $em->flush() can be called safely● compute insert|update|delete changesets● If !changes

○ Events::onFlush○ Events::postFlush○ return

Page 22: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Flush (2)● Events::onFlush

○ UOW->getScheduledEntityInsertions()○ UOW->getScheduledEntityUpdates()○ UOW->getScheduledEntityDeletions()○ $em->persist() && UOW-

>computeChangeSet()● connection->beginTransaction

Page 23: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Flush (3)● Inserts

○ Persister->insert($entity)○ Events::postPersist

■ entity can’t be updated directly anymore■ UOW->scheduleExtraUpdate($entity, array $changeset)

Page 24: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Flush (4)● Updates

○ Events::preUpdate■ Entity can’t be updated directly, update changeset using

PreUpdateEventArgs■ Relations changes not tracked too

○ UOW->recomputeSingleEntityChangeSet($class, $entity)○ Persister->update($entity)○ Events::postUpdate

■ Entity can’t be updated directly anymore■ UOW->scheduleExtraUpdate($entity, array $changeset)

● UOW->executeExtraUpdates()

Page 25: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Flush (5)● Deletions

○ Persister->delete($entity)○ Events::postRemove

■ nothing to update here

Page 26: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Flush (6)● connection->commit()● Events::postFlush

○ Never call $em->flush() here● UOW->clear();

○ Events::onClear● in case of errors

○ connection->rollback()That’s it.

Page 27: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

Let’s talk a little bit about performance and how to speed-up doctrine

Page 28: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

How to speed-up doctrine● Cache

○ Metadata○ Query○ result

Page 29: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

How to speed-up doctrine● Control lazy-loading

○ Never eager load○ Write select queries with joins to needed

Page 30: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

How to speed-up doctrine● Fetch less

○ getReference○ {partial}

Page 31: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

How to speed-up doctrine● Hydrate less

○ arrays instead of objects when you don’t need them or performance is important

Page 32: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

How to speed-up doctrine● Make flush cheaper

○ Mark entities as readOnly○ Chang tracking policy to

DEFERRED_EXPLICIT or NOTIFY○ Provide flush arguments (applies

objects and arrays)

Page 33: Doctrine Internals. UnitOfWork

Presentation title here

Doctrine Internals. UnitOfWork

How to speed-up doctrine● Optimize queries

Page 35: Doctrine Internals. UnitOfWork

Presentation title here

?


Recommended