DefaultPreparedStatement不可序列

问题描述:

我使用Datastax司机和卡桑德拉3.10,当我部署到Tomcat并启动它,我得到一个错误,指出建设一个Web应用程序:DefaultPreparedStatement不可序列

Caused by: java.io.NotSerializableException: com.datastax.driver.core.DefaultPreparedStatement 

即使我不使用任何地方代码,我所有的准备语句的形式为:

private transient PreparedStatement  selectAssetClassStmt; 
selectAllAssetClassesStmt = cassandraDatasource.getSession().prepare("select code,description from asset_class where code = ?"); 
+2

请添加您想要序列化的完整类以及完整的错误堆栈跟踪。 – Progman

+0

为什么它是一个数据成员?它应该是一个局部变量。 – EJP

如果您使用纯卡桑德拉(Spring没有数据),你应该使用[email protected] annotation

只要将此注释添加到字段上,该字段就不会映射到任何列(在读取或写入期间都不会) 。

import com.datastax.driver.mapping.annotations.Transient; 
... 
@Transient 
private PreparedStatement selectAssetClassStmt; 

不能直接此事,但你为什么要声明一个PreparedStatement场?
它不应该是必需的,它是容易出错的,它可能会导致意外的行为,因为您稍后将不知道它的状态。

PreparedStatement变量应该只是一个局部变量,其寿命是一种访问数据库的方法。

+0

嗨,感谢您的评论,关于PreparedStatement变量的使用,Webapp使用了Spring,所有准备好的语句都是在我称之为StatementFactory的地方创建的,这个工厂是一个singleton Spring bean,因此这些语句只准备一次。我最初准备好的所有语句都是局部变量,类似于Spring JDBC期望的那样,但后来我得到了一大堆错误,说应该只准备一次语句 – simteq

+0

嗨,我的设置是 Cassandra 3.10, DataStax驱动程序3.1.4 Tomcat的7.0.57 的Java 1.8.1.131 春4.3.2 在一个Spring bean(辛格尔顿)创建的所有准备语句 私人短暂的PreparedStatement \t的insertstmt; 堆栈跟踪 所致:java.io.NotSerializableException:com.datastax.driver.core.DefaultPreparedStatement \t在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) \t在java.io.ObjectOutputStream.defaultWriteFields( ObjectOutputStream.java:1509) \t在 – simteq

+0

我想我已经找到它,但不知道为什么。语句工厂返回一个PreparedStatement,但有几个Bind函数不能识别的地方?占位符例如。当使用Apache卢塞恩索引生成器。在这些情况下,代码使用PreparedStatement的getQueryString方法获取查询,然后使用String.format插入绑定变量,只需将语句工厂更改为返回查询字符串而不是PreparedStatement即可实现 – simteq