2010-08-03 15 views
10

Sto eseguendo il test di carico ora. Dopo approssimativi 900 richieste ho ottenuto questo errore:Hibernate + EhCache = java.io.NotSerializableException

[ 03.08.10 11:49:00.465] [Store org.hibernate.cache.StandardQueryCache Spool Thread] ERROR net.sf.ehcache.store.DiskStore - org.hibernate.cache.StandardQueryCacheCache: Failed to write element to disk 'sql: select hotelfeatu0_.name as col_0_0_ from feature hotelfeatu0_ where hotelfeatu0_.class='org.company.domains.HotelFeatures' and hotelfeatu0_.lang=? and hotelfeatu0_.hotel_id=?; parameters: ; named parameters: {ht=100: 'Hotel', lng=en}'. Initial cause was org.company.domains.Hotel 
java.io.NotSerializableException: org.company.domains.Hotel 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
    at java.util.HashMap.writeObject(HashMap.java:1001) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) 
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:416) 
    at net.sf.ehcache.Element.writeObject(Element.java:729) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
    at net.sf.ehcache.util.MemoryEfficientByteArrayOutputStream.serialize(MemoryEfficientByteArrayOutputStream.java:75) 
    at net.sf.ehcache.store.DiskStore.serializeElement(DiskStore.java:781) 
    at net.sf.ehcache.store.DiskStore.writeElement(DiskStore.java:735) 
    at net.sf.ehcache.store.DiskStore.writeOrReplaceEntry(DiskStore.java:729) 
    at net.sf.ehcache.store.DiskStore.flushSpool(DiskStore.java:703) 
    at net.sf.ehcache.store.DiskStore.throwableSafeFlushSpoolIfRequired(DiskStore.java:671) 
    at net.sf.ehcache.store.DiskStore.spoolAndExpiryThreadMain(DiskStore.java:640) 
    at net.sf.ehcache.store.DiskStore.access$900(DiskStore.java:68) 
    at net.sf.ehcache.store.DiskStore$SpoolAndExpiryThread.run(DiskStore.java:1110) 

Ecco il mio ehcache.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"> 

    <diskStore path="java.io.tmpdir/sweethome"/> 

    <defaultCache 
      maxElementsInMemory="10000" 
      eternal="false" 
      timeToIdleSeconds="120" 
      timeToLiveSeconds="120" 
      overflowToDisk="true" 
      maxElementsOnDisk="10000000" 
      diskPersistent="false" 
      diskExpiryThreadIntervalSeconds="120" 
      memoryStoreEvictionPolicy="LRU" 
    /> 

    <cache 
       name="org.hibernate.cache.StandardQueryCache" 
       maxElementsInMemory="5" 
       eternal="false" 
       timeToLiveSeconds="120" 
       overflowToDisk="true" 
    /> 

</ehcache> 

Hibernate config:

hibernate { 
    cache.use_second_level_cache=true 
    cache.use_query_cache=true 
    cache.provider_class='org.hibernate.cache.EhCacheProvider' 
    connection.useUnicode=true 
    connection.characterEncoding='UTF-8' 
    dialect = 'org.hibernate.dialect.MySQL5InnoDBDialect' 
} 

risposta

9

Il registro mi dice che questo accade perché la query cache tenta di scrivere uno degli oggetti org.company.domains.Hotel sul disco. Non sorprende che ciò possa accadere durante un test di caricamento, dal momento che nella memoria della cache delle query sono ammessi solo 5 elementi prima di provare a scaricarlo sul disco.

È necessario rendere org.company.domains.Hotel implementare java.io.Serializable oppure impostare overflowToDisk="false" per la cache di query.

+0

Ma questo potrebbe essere un errore benigno - significa semplicemente che l'entità non viene scritta nella cache. Tutto il resto funzionerà come previsto, non è vero? – doelleri

Problemi correlati