簡體   English   中英

無法序列化到二級緩存

[英]Cannot serialize into L2 cache

我在一個獨立的Java Web應用程序(使用Jetty,Servlets [是,該體系結構有點舊]和spring)中使用數據核和JDO進行了某種類型的錯誤配置。

我們目前正在開發新版本; 在過去的三年中,原始項目沒有任何依賴關系更新; 因此我們希望進行一些不錯的安全性,性能和功能升級,但是正如預期的那樣,升級並非易事。

我們已經解決了大多數問題,但是變得非常乏味的問題尚未解決:

  • 服務器啟動時,它會檢查數據庫中是否有默認用戶;否則,將檢查默認用戶。 是蒙哥 如果沒有用戶,則創建默認用戶。 無論如何,服務器都會啟動。

我們正在使用datanucleus + JDO訪問底層數據庫; 主要是因為它已經存在,並且因為大多數系統確實與它綁定在一起。 到目前為止,我們可以確認數據核可以讀取數據庫(調試器顯示來自數據庫的非空結果,正確表示默認用戶;而來自活動端點的其他一些虛擬結果)。 但是,當數據核試圖緩存結果時,它就陷入了死胡同。

錯誤堆棧如下:

GRAVE: exception catched
javax.jdo.JDOException: Failed to set object CachedPC : cls=mobi.allshoppings.model.User version=null loadedFlags=[YYYYYYYYYYYYYYYYY] with id com.inodes.datanucleus.model.Key:User("admin") into Redis cache
    at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:680)
    at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1747)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:144)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:108)
    at mobi.allshoppings.bdb.tools.BasicDataBuilder.warmUp(BasicDataBuilder.java:49)
    at mobi.allshoppings.bdb.tools.InitAppServlet.init(InitAppServlet.java:21)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:616)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:396)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:871)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:163)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:387)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:354)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at mobi.allshoppings.jetty.JettyServer.startup(JettyServer.java:62)
    at mobi.allshoppings.cli.StartServer.main(StartServer.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at mobi.allshoppings.cli.CLI.main(CLI.java:100)
NestedThrowablesStackTrace:
Failed to set object CachedPC : cls=mobi.allshoppings.model.User version=null loadedFlags=[YYYYYYYYYYYYYYYYY] with id com.inodes.datanucleus.model.Key:User("admin") into Redis cache
org.datanucleus.exceptions.NucleusException: Failed to set object CachedPC : cls=mobi.allshoppings.model.User version=null loadedFlags=[YYYYYYYYYYYYYYYYY] with id com.inodes.datanucleus.model.Key:User("admin") into Redis cache
    at org.datanucleus.cache.redis.RedisLevel2Cache.put(RedisLevel2Cache.java:280)
    at org.datanucleus.ExecutionContextImpl.putObjectIntoLevel2CacheInternal(ExecutionContextImpl.java:4914)
    at org.datanucleus.ExecutionContextImpl.putObjectIntoLevel2Cache(ExecutionContextImpl.java:4741)
    at org.datanucleus.ExecutionContextImpl.findObject(ExecutionContextImpl.java:3579)
    at org.datanucleus.ExecutionContextImpl.findObject(ExecutionContextImpl.java:3016)
    at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1742)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:144)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:108)
    at mobi.allshoppings.bdb.tools.BasicDataBuilder.warmUp(BasicDataBuilder.java:49)
    at mobi.allshoppings.bdb.tools.InitAppServlet.init(InitAppServlet.java:21)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:616)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:396)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:871)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:163)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:387)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:354)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at mobi.allshoppings.jetty.JettyServer.startup(JettyServer.java:62)
    at mobi.allshoppings.cli.StartServer.main(StartServer.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at mobi.allshoppings.cli.CLI.main(CLI.java:100)

如堆棧所示,在序列化過程中會引發異常。 我知道,將使用數據核存儲的任何類都必須擴展Serializable,並且必須使用一些特殊的注釋,例如@ PersistenceCapable,@ NotPersistant或@EmbebedOnly

事實是,當前的生產版本具有相同的配置,可能破壞任何數據核配置的唯一更改是升級本身和兩個新類的聲明,它們已經被注釋(如文檔中所述)和其他工作類一樣),並且這些類完全不參與狀態注冊過程,因此,即使它們的配置不正確,服務器也應該可以正常啟動; 但它拒絕。 persitence.xmlpackage-mongodb.orm看起來還不錯(再次,如在文檔中和在其他工作類中一樣)。

數據核增強過程和依賴關系添加到類路徑中; 據我們所知,正確。

序列化過程中引發的Non-Serializable異常是由於(格式錯誤?)CachePC對象(由datanucleus構建以包裝實際的User對象)引起的,該對象具有一個字段,該字段是StateManagerImpl的實例,並且顯然未實現Serializable ,引起異常。


注意:上面的stacktrace匹配項目的當前配置,它沒有直接顯示NoSerializableException,但是在調試時,我確認這是引發的第一個異常。 當ObjectOutputStream確定StateManagerImpl不是要序列化的有效對象時,它將引發此錯誤。 當前版本使用XMemcached,如果我們將此版本切換為Memcached,則可以清楚地看到“不可序列化的異常”。 (我們希望切換到Redis,因為原始服務器被設計為分布式系統;但是您會驚訝於它的瓶頸所在)


所以; 我們不知道為什么要嘗試序列化StateManagerImpl; 我們認為這是在最后DataNucleus將版中的錯誤,所以我們切換到版本5.1.0釋放 ,但沒有成功。 應用程序,Jetty服務器和Servlet啟動正常,我們可以確認datanucleus成功解析了datanucleus.configuration文件,並且可以獲得PersistanceManager實例並讀取mongo數據庫。 但是當涉及到在高速緩存中寫入時(自動完成); 在Redis或XMemcached中,我們總是會遇到Non-Serializable異常,因為數據核使用不可序列化的StateManagerImpl構建了CachedPC。

我們應該在哪里重新開始? 有什么事嗎 我們應該切換數據核以獲得更多支持的數據訪問層嗎?

謝謝。


更新

以下是使用Memcached而非Redis時產生的堆棧跟蹤(行為相同,再次序列化到L2 Cache時會中斷)

GRAVE: exception catched
javax.jdo.JDOException: Exception thrown in persistence to xmemcached
    at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:676)
    at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1747)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:144)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:108)
    at mobi.allshoppings.bdb.tools.BasicDataBuilder.warmUp(BasicDataBuilder.java:49)
    at mobi.allshoppings.bdb.tools.InitAppServlet.init(InitAppServlet.java:21)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:616)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:396)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:871)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:163)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:387)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:354)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at mobi.allshoppings.jetty.JettyServer.startup(JettyServer.java:62)
    at mobi.allshoppings.cli.StartServer.main(StartServer.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at mobi.allshoppings.cli.CLI.main(CLI.java:100)
NestedThrowablesStackTrace:
java.lang.IllegalArgumentException: Non-serializable object
    at net.rubyeye.xmemcached.transcoders.BaseSerializingTranscoder.serialize(BaseSerializingTranscoder.java:99)
    at net.rubyeye.xmemcached.transcoders.SerializingTranscoder.encode(SerializingTranscoder.java:211)
    at net.rubyeye.xmemcached.command.text.TextStoreCommand.encodeValue(TextStoreCommand.java:199)
    at net.rubyeye.xmemcached.command.text.TextStoreCommand.encode(TextStoreCommand.java:155)
    at net.rubyeye.xmemcached.impl.MemcachedTCPSession.wrapMessage(MemcachedTCPSession.java:189)
    at com.google.code.yanf4j.core.impl.AbstractSession.write(AbstractSession.java:383)
    at net.rubyeye.xmemcached.impl.MemcachedConnector.send(MemcachedConnector.java:556)
    at net.rubyeye.xmemcached.XMemcachedClient.sendCommand(XMemcachedClient.java:322)
    at net.rubyeye.xmemcached.XMemcachedClient.sendStoreCommand(XMemcachedClient.java:2537)
    at net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1369)
    at net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1428)
    at net.rubyeye.xmemcached.XMemcachedClient.set(XMemcachedClient.java:1415)
    at org.datanucleus.cache.xmemcached.XmemcachedLevel2Cache.put(XmemcachedLevel2Cache.java:177)
    at org.datanucleus.ExecutionContextImpl.putObjectIntoLevel2CacheInternal(ExecutionContextImpl.java:4914)
    at org.datanucleus.ExecutionContextImpl.putObjectIntoLevel2Cache(ExecutionContextImpl.java:4741)
    at org.datanucleus.ExecutionContextImpl.findObject(ExecutionContextImpl.java:3579)
    at org.datanucleus.ExecutionContextImpl.findObject(ExecutionContextImpl.java:3016)
    at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1742)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:144)
    at mobi.allshoppings.dao.spi.GenericDAOJDO.get(GenericDAOJDO.java:108)
    at mobi.allshoppings.bdb.tools.BasicDataBuilder.warmUp(BasicDataBuilder.java:49)
    at mobi.allshoppings.bdb.tools.InitAppServlet.init(InitAppServlet.java:21)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:616)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:396)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:871)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:298)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:163)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
    at org.eclipse.jetty.server.Server.start(Server.java:387)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:354)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at mobi.allshoppings.jetty.JettyServer.startup(JettyServer.java:62)
    at mobi.allshoppings.cli.StartServer.main(StartServer.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at mobi.allshoppings.cli.CLI.main(CLI.java:100)
Caused by: java.io.NotSerializableException: org.datanucleus.state.StateManagerImpl
    - field (class "org.datanucleus.identity.IdentityReference", name: "client", type: "class java.lang.Object")
    - object (class "org.datanucleus.identity.IdentityReference", org.datanucleus.identity.IdentityReference@44fd7ba4)
    - field (class "org.datanucleus.cache.CachedPC", name: "id", type: "class java.lang.Object")
    - object (class "org.datanucleus.cache.CachedPC", CachedPC : cls=mobi.allshoppings.model.Address version=null loadedFlags=[YYYYYYYYY])
    - custom writeObject data (class "java.util.HashMap")
    - object (class "java.util.HashMap", {0=1, 1=CachedPC : cls=mobi.allshoppings.model.Address version=null loadedFlags=[YYYYYYYYY], 2=null, 3=null, 4=CachedPC : cls=mobi.allshoppings.model.ContactInfo version=null loadedFlags=[YYYYYYYYYYYY], 5=Sun Oct 29 04:57:34 CST 2017, 6=null, 7=true, 8=User("admin"), 9=null, 10=Sun Oct 29 05:03:40 CST 2017, 11=0, 12=true, 13=CachedPC : cls=mobi.allshoppings.model.UserSecurity version=null loadedFlags=[YYYYYYYYYYYYYYYYY], 14=null, 15=00000000880E0D76, 16=CachedPC : cls=mobi.allshoppings.model.tools.ViewLocation version=null loadedFlags=[Y]})
    - field (class "org.datanucleus.cache.CachedPC", name: "fieldValues", type: "interface java.util.Map")
    - root object (class "org.datanucleus.cache.CachedPC", CachedPC : cls=mobi.allshoppings.model.User version=null loadedFlags=[YYYYYYYYYYYYYYYYY])
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1182)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.HashMap.internalWriteEntries(HashMap.java:1790)
    at java.util.HashMap.writeObject(HashMap.java:1363)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1128)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at net.rubyeye.xmemcached.transcoders.BaseSerializingTranscoder.serialize(BaseSerializingTranscoder.java:94)
    ... 48 more

另外,以下是在序列化過程中引發實際異常之前ObjectOutputStream的debugInfoStack的狀態:

這是在創建異常之前的狀態:

- object (class "java.lang.StackTraceElement", java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1182))
- element of array (index: 0)
- array (class "[Ljava.lang.StackTraceElement;", size: 74)
- field (class "java.lang.Throwable", name: "stackTrace", type: "class [Ljava.lang.StackTraceElement;")
- custom writeObject data (class "java.lang.Throwable")
- root object (class "java.io.NotSerializableException", java.io.NotSerializableException: org.datanucleus.state.StateManagerImpl
- field (class "org.datanucleus.identity.IdentityReference", name: "client", type: "class java.lang.Object")
- object (class "org.datanucleus.identity.IdentityReference", org.datanucleus.identity.IdentityReference@44fd7ba4)
- field (class "org.datanucleus.cache.CachedPC", name: "id", type: "class java.lang.Object")
- object (class "org.datanucleus.cache.CachedPC", CachedPC : cls=mobi.allshoppings.model.Address version=null loadedFlags=[YYYYYYYYY])
- custom writeObject data (class "java.util.HashMap")
- object (class "java.util.HashMap", {0=1, 1=CachedPC : cls=mobi.allshoppings.model.Address version=null loadedFlags=[YYYYYYYYY], 2=null, 3=null, 4=CachedPC : cls=mobi.allshoppings.model.ContactInfo version=null loadedFlags=[YYYYYYYYYYYY], 5=Sun Oct 29 04:57:34 CST 2017, 6=null, 7=true, 8=User("admin"), 9=null, 10=Sun Oct 29 05:03:40 CST 2017, 11=0, 12=true, 13=CachedPC : cls=mobi.allshoppings.model.UserSecurity version=null loadedFlags=[YYYYYYYYYYYYYYYYY], 14=null, 15=00000000880E0D76, 16=CachedPC : cls=mobi.allshoppings.model.tools.ViewLocation version=null loadedFlags=[Y]})
- field (class "org.datanucleus.cache.CachedPC", name: "fieldValues", type: "interface java.util.Map")
- root object (class "org.datanucleus.cache.CachedPC", CachedPC : cls=mobi.allshoppings.model.User version=null loadedFlags=[YYYYYYYYYYYYYYYYY]))

此狀態顯示一個我之前未曾注意過的hibitedException(以及引發異常之前的最后一個狀態):

- object (class "java.util.ArrayList", [])
- field (class "java.util.Collections$UnmodifiableCollection", name: "c", type: "interface java.util.Collection")
- object (class "java.util.Collections$UnmodifiableList", [])
- field (class "java.lang.Throwable", name: "suppressedExceptions", type: "interface java.util.List")
- custom writeObject data (class "java.lang.Throwable")
- root object (class "java.io.NotSerializableException", java.io.NotSerializableException: org.datanucleus.state.StateManagerImpl
- field (class "org.datanucleus.identity.IdentityReference", name: "client", type: "class java.lang.Object")
- object (class "org.datanucleus.identity.IdentityReference", org.datanucleus.identity.IdentityReference@44fd7ba4)
- field (class "org.datanucleus.cache.CachedPC", name: "id", type: "class java.lang.Object")
- object (class "org.datanucleus.cache.CachedPC", CachedPC : cls=mobi.allshoppings.model.Address version=null loadedFlags=[YYYYYYYYY])
- custom writeObject data (class "java.util.HashMap")
- object (class "java.util.HashMap", {0=1, 1=CachedPC : cls=mobi.allshoppings.model.Address version=null loadedFlags=[YYYYYYYYY], 2=null, 3=null, 4=CachedPC : cls=mobi.allshoppings.model.ContactInfo version=null loadedFlags=[YYYYYYYYYYYY], 5=Sun Oct 29 04:57:34 CST 2017, 6=null, 7=true, 8=User("admin"), 9=null, 10=Sun Oct 29 05:03:40 CST 2017, 11=0, 12=true, 13=CachedPC : cls=mobi.allshoppings.model.UserSecurity version=null loadedFlags=[YYYYYYYYYYYYYYYYY], 14=null, 15=00000000880E0D76, 16=CachedPC : cls=mobi.allshoppings.model.tools.ViewLocation version=null loadedFlags=[Y]})
- field (class "org.datanucleus.cache.CachedPC", name: "fieldValues", type: "interface java.util.Map")
- root object (class "org.datanucleus.cache.CachedPC", CachedPC : cls=mobi.allshoppings.model.User version=null loadedFlags=[YYYYYYYYYYYYYYYYY]))

將Lists作為屬性的唯一類是User類的屬性,該類具有以下聲明:

@PersistenceCapable(detachable="true")
@EmbeddedOnly
public class UserSecurity implements Serializable {

而且我看不到它在緩存過程中被調用,僅在mongodb閱讀期間被調用。 再次:mongodb的講座效果很好,但是作為數據核嘗試存儲剛讀取的對象; 它失敗。 因此,我不知道這個不可修改的清單從何而來。

所以,也許我有點太咸了; 但是事實證明我們的問題實際上是由Datanucleus錯誤引起的: https : //github.com/datanucleus/datanucleus-core/issues/283

文檔說,嵌入式對象不應該具有ID,因為它們直接被具有ID的容器對象(在“相同表”方案下)所喜歡。http://www.datanucleus.org/products/datanucleus/jdo /mapping.html#embedded_pc但是我們的嵌入式對象被賦予了IdentityReference,該標識不應存在。

我注意到StateManagerImpl是序列化嵌入式對象時發生異常的原因,但是我對IdentityReference對象並沒有引起太多關注,后者導致了StateManagerImpl的序列化。 導致緩存L2寫入錯誤。 這就是錯誤的全部所在。

因此,解決方案是克隆datanucleus-core項目,在本地構建和安裝最新版本,然后重新構建我們的項目,將datanuclues-core依賴性更改為本地文件。 它的工作非常好。

在深入研究了數據核及其代碼本身的文檔之后,我更加確信數據核實際上是一個非常好的數據存儲抽象,我們將其保留在我們的項目中(但我仍然認為支持和錯誤消息含糊不清)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM