Domanda

sto usando JBoss 5.1.0 GA insieme con Hibernate e ora sto cercando di abilitare la cache di secondo livello. Ho aggiunto le seguenti proprietà per la mia configurazione di Hibernate.

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />

E ho annotato entità che mi aspetto di cambiare frequentemente con il seguente:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)

Questo si basa sulla mia comprensione del documentazione .

L'applicazione distribuisce con successo senza messaggi alla ricerca di paura (per esempio avvertimenti o errore I messaggi nel flusso di registro). Per un breve periodo di tempo che vedo caching lavorare (sto usando le statistiche di Hibernate per vedere questo), ma dopo un breve mentre io ottenere stack del modulo (anche quando il login come utente singolo senza alcun accesso remoto):

  

"Operazione ha tentato di creare   Myclass nuovo. E 'già stato   creato dal questa transazione   avviato, da un altro (possibilmente remoto)   transazione. Abbiamo un concomitante   evento creazione "

A seguito da una traccia dello stack gigante che alla fine risale a una query di nome che ho fatto, che ha la seguente forma:

SELECT x FROM X WHERE x.deleted = false

La query di nome non ha annotazioni aggiuntive per la cache.

Qualche consiglio su come risolvere questo problema sarebbe molto apprezzato.

È stato utile?

Soluzione

Alcune domande prima:

  1. È questa eccezione propagato alla vostra applicazione? Voglio dire, stai colpiti da questo, o se sono solo preoccupati per il messaggio nel registro?
  2. Sono tutti i soggetti annotato con la strategia transazionale, o solo alcuni di essi?
  3. Il tuo recupera interrogazione avidamente oggetti recuperati di un'altra classe?

Direi che la cosa migliore che si possa fare ora è quello di consentire DEBUG (o forse anche TRACE) la registrazione per le operazioni di Cache: log4j.logger.org.hibernate.cache=debug Questo vi dirà esattamente cosa sta facendo Hibernate. I sospettato che Hibernate sta cercando di mettere un oggetto alla cache, e facendo di nuovo una volta che si vede lo stesso oggetto durante la stessa sessione (forse come parte di albero di un altro oggetto). C'era un problema di timestamp per Query Cache qualche tempo fa, e lo stesso problema potrebbe essere che si verificano qui. Per esempio:

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

Ma ancora una volta, è un po 'difficile prevedere quale sia la soluzione senza sapere quale sia il problema sarebbe. E ho paura che registro unico di Hibernate può dire quale sia il problema è in realtà.

PS:. Questo è stato pensato per essere registrato come un commento, ma questo era semplicemente troppo lungo per

Altri suggerimenti

Hai provato CacheConcurrencyStrategy.NONSTRICT_READ_WRITE? Ho letto i documenti un sacco di volte e non so proprio cosa scegliere, ma sembra funzionare bene per i miei progetti. Credo che la CacheConcurrencyStrategy.TRANSACTIONAL è troppo sicuro ed evitare le prestazioni della cache in determinate circostanze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top