...
Codeblock | ||
---|---|---|
| ||
'cache' => [ '2nd-lc' => [ 'active' => true, 'logger' => false, 'lifetime' => 24 * 60 * 60 // = 24h ] ] |
Definition im Entity
Das Entity erhält weitere Informationen über den Umgang des Caches mit diesem Entity.
Das Cache-Objekt gibt die Caching-Mode an. Siehe https://www.doctrine-project.org/[...]
Es gibt auch die Region an.
Die Region muss dem Namen der App in aus der composer.json entsprechen.
Codeblock | ||
---|---|---|
| ||
use Doctrine\ORM\Mapping\Cache; /** * @Entity * @Cache(usage="NONSTRICT_READ_WRITE", region="brandbox/app-xyz") * ... **/ class Entity ... { } |
Umgang mit unterschiedlichen Datensatz-Arten
Je nach Zweck sollte ein Entity in den Cache oder nicht. Es gibt folgende Möglichkeiten:
Nicht in den Cache
Datensätze die nur einmal geschrieben werden und extrem selten abgerufen werden, gehören nicht in den Cache. Zur Verwendung wird die Cache-Class nicht, wie im obigen Beispiel, in das Entity aufgenommen.
Beispiel: Logs
...
Das ist der häufigste und übliche Fall.
Connection
In der Connection wird der Cache aktiviert: \Brandbox\Framework\Brandbox\Doctrine\Lib\Connection\Connection::enableSecondLevelCache
Cacheable oder nicht
Ein Query ist Cacheable wenn ein Entity im Result ausgeliefert wird. Ist das nicht der Fall, kommt es zum Fehler (WSOD). Man erkennt das an der Hydration.
Letztlich ist „nur“ dieses Objekt cacheable: \Doctrine\ORM\AbstractQuery::HYDRATE_OBJECT
Evict
Wird ein Datensatz verändert (DELETE, INSERT, UPDATE) muss der verändernde Query ein Hint erhalten:
Beispiel
Codeblock | ||
---|---|---|
| ||
$qb
->delete($class, $identifier)
->where($expr->eq($identifier . '.id', ':id'))
->setParameter(':id', $id)
->getQuery()
->setHint(ORM\Query::HINT_CACHE_EVICT, true)
->execute()
; |