[Doctrine] Entity manager flushen vanuit meerdere services

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Ik heb een aantal services die bewerkingen op entities encapsuleren. Deze services maken allemaal gebruik van dezelfde entity manager. Bij het afhandelen van een request gebeurt het vaak dat meerdere van deze services in een enkele controller action opgeroepen worden.

Dit is mogelijks een probleem omdat ik vanuit de controller (of andere service) geen weet heb of de opgeroepen servicemethode de entitymanager achter de schermen flusht of niet. Stel dat ik een servicemethode moet oproepen tijdens het opbouwen van een entity, dan bestaat de kans dat deze entity in opbouw prematuur geflusht wordt.

Ik kan hier zelf 2 mogelijke oplossingen voor bedenken:

1. Aan elke servicemethode een optionele parameter "flush" toevoegen die aanduidt of de methode in kwestie de entitymanager moet flushen of niet. Deze optie heeft niet mijn voorkeur omdat dit de service API aanzienlijk vervuilt.

2. Elke service een eigen entitymanager instantie geven (dezelfde database). Dit is beter dan optie 2 omdat ik de API niet moet wijzigen, maar is omslachtig te configureren en heeft een grotere performance-impact (meerdere flushes).

Hoe gaan jullie hierbij te werk? Is er een elegantere manier waar ik niet van weet?

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hmail
  • Registratie: April 2003
  • Laatst online: 16:41

Hmail

Doet ook maar wat.

In Symfony is het mogelijk een entity mee te geven aan de flush-opdracht. Ik weet niet of dat standaard doctrine is of of dat door Symfony gebouwd is, maar is dat niet waar je naar op zoek bent?

It might sound as if I have no clue what I'm doing, but I actually have a vague idea.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Los daarvan zou je een entity die absoluut nog niet geflusht mag worden kunnen detachen (en eventueel later weer mergen).

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Hmail schreef op dinsdag 19 september 2017 @ 22:15:
In Symfony is het mogelijk een entity mee te geven aan de flush-opdracht. Ik weet niet of dat standaard doctrine is of of dat door Symfony gebouwd is, maar is dat niet waar je naar op zoek bent?
Het is inderdaad mogelijk een enkele entity mee te geven aan de flush methode, maar deze werkt niet zoals je denkt: https://github.com/doctrine/doctrine2/pull/1139. Deze functie staat ook op het punt verwijderd te worden.
NMe schreef op dinsdag 19 september 2017 @ 22:17:
Los daarvan zou je een entity die absoluut nog niet geflusht mag worden kunnen detachen (en eventueel later weer mergen).
Kan ook, maar dan vindt ik oplossing 1 nog beter: conceptueel weet de controller niet of de service die hij oproept de entity manager zal flushen.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Hangt natuurlijk een beetje van je precieze design af. Ik probeer meestal mijn managers zo te schrijven dat elke call die ik vanuit een controller doe in principe aan het einde een flush doet indien relevant. Binnen die grotere operatie zou het natuurlijk zomaar kunnen dat er tussendoor ook gefusht moet worden, maar op dat punt weet mijn manager natuurlijk veel meer van de onderliggende structuur, waardoor ik dus inderdaad makkelijker de keuze kan maken om parameters te gebruiken, entities te detachen, etc.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
Momenteel zijn mijn services/managers ook zo geschreven dat ze flushen indien relevant, maar in sommige gevallen is er onvermijdelijk twijfel. Het ziet er naar uit dat ik niet echt een andere keuze heb dan de extra parameter mee te geven of te detachen/mergen. Individueel entity(s) meegeven aan flush zou de ideale oplossing zijn, maar dat gaat helaas niet met Doctrine (geen idee waarom, maar ik ben dan ook geen ORM expert).

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

egonolieux schreef op woensdag 20 september 2017 @ 21:25:
Individueel entity(s) meegeven aan flush zou de ideale oplossing zijn, maar dat gaat helaas niet met Doctrine (geen idee waarom, maar ik ben dan ook geen ORM expert).
Kan wel, Doctrine\Common\Persistence\ObjectManager heeft geen parameters in zijn flush() maar Doctrine\ORM\EntityManager heeft die wel. Het heeft alleen weinig zin, entities zijn met elkaar verweven en de ene keer heb je een afhankelijke entity gemaakt die je mee wil flushen, de andere keer niet en het geeft eigenlijk altijd gezeik, nog even los van eventuele performance-issues. Je kan beter je design zo opzetten dat je geen exotische dingen hoeft te doen met je flush-calls.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • egonolieux
  • Registratie: Mei 2009
  • Laatst online: 06-01-2024

egonolieux

Professionele prutser

Topicstarter
NMe schreef op woensdag 20 september 2017 @ 22:03:
[...]

Kan wel, Doctrine\Common\Persistence\ObjectManager heeft geen parameters in zijn flush() maar Doctrine\ORM\EntityManager heeft die wel. Het heeft alleen weinig zin, entities zijn met elkaar verweven en de ene keer heb je een afhankelijke entity gemaakt die je mee wil flushen, de andere keer niet en het geeft eigenlijk altijd gezeik, nog even los van eventuele performance-issues. Je kan beter je design zo opzetten dat je geen exotische dingen hoeft te doen met je flush-calls.
Ik zou denken dat geneste entities geen probleem zijn omdat je kan configureren met cascade wat er mee gedaan moet worden?
Pagina: 1