所以我正在使用 MySQL/MyBatis3/Tomcat 做一个附带项目。我目前正致力于在 MyBatis 中开启缓存。当我第一次尝试打开缓存时,由于我的对象没有实现 Serializable,我遇到了异常。因此,在使用我试图缓存的对象实现 Serializable 之后;它似乎缓存得很好。
但; 当我在同样的情况下第二次点击我的 servlet,并且对象映射器尝试从缓存中反序列化我的对象时,我得到以下堆栈跟踪:
### Error querying database. Cause: org.apache.ibatis.cache.CacheException: Error deserializing object. Cause: java.lang.ClassNotFoundException: my.package.MyClass
### Cause: org.apache.ibatis.cache.CacheException: Error deserializing object. Cause: java.lang.ClassNotFoundException: my.package.MyClass
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:77)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:69)
at org.apache.ibatis.binding.MapperMethod.executeForList(MapperMethod.java:85)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:65)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:38)
at $Proxy5.selectAllArgs(Unknown Source)
我不明白的另一件事是:
Serializable result;
try {
ByteArrayInputStream bis = new ByteArrayInputStream((byte[]) value);
ObjectInputStream ois = new ObjectInputStream(bis);
// LINE THROWING EXCEPTION IN org.apache.ibatis.cache.decorators.SerializedCache
result = (Serializable) ois.readObject();
// -- -----------------------------------
ois.close();
} catch (Exception e) {
throw new CacheException("Error deserializing object. Cause: " + e, e);
}
return result;
为什么它甚至试图加载类开始?它只需要转换为可序列化。值得注意的是,当我没有打开缓存时;一切都按预期工作。