首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData

java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData
EN

Stack Overflow用户
提问于 2016-02-03 07:18:27
回答 1查看 1.9K关注 0票数 0

我正在使用JSF1.2并试图使用<a4j:keepAlive beanName="reportController">,但是我一直在获取这个错误:

HTTP Status 500 原因: java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183 : java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData

我试图使用<a4j:keepAlive beanName="reportController">,因为当我搜索特定的报表,然后尝试对dataTable中的数据进行排序时,它似乎丢失了dataTable中的所有数据。

EN

回答 1

Stack Overflow用户

发布于 2016-02-03 07:38:21

原因: java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData

当您获得java.sql.Connection,甚至直接将DatabaseMetaData作为可序列化类的实例变量时,就会发生这种情况,如下所示。

代码语言:javascript
复制
public class ReportController implements Serializable {

    private Connection connection; // BAD!!
    private DatabaseMetaData metadata; // BAD!!

    // ...
}

您不应该声明和获取外部资源,如java.sql.ConnectionStatementResultSet,也不应该将其属性作为类的实例变量。您应该尽快获取、使用和关闭它们,只需在方法本地范围内进行。从ReportController bean中删除这些实例变量,将它们移动到方法本地作用域,这个问题就会消失。只有DataSource (服务器管理的连接池)作为实例变量是可以的。

代码语言:javascript
复制
public class ReportController implements Serializable {

    @Resource("jdbc/someDB")
    private DataSource dataSource;

    public void someMethod() {
        try (Connection connection = dataSource.getConnection()) { // OK.
            // ...
        }
    }

    // ...
}

<a4j:keepAlive>并不是造成这个问题的确切原因。它只是在HTTP会话中通过同一页面上的HTTP回发请求记住bean实例。HTTP会话属性本质上通常是序列化的。这种序列化只是触发并暴露了隐藏的设计问题。易失性一次性使用的资源,如数据库连接、语句、元数据、输入流、输出流等,绝对不应该是可序列化的,因此出现了此异常。

另请参阅:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35170752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档