gpt4 book ai didi

java.io.NotSerializedException : com. mysql.jdbc.DatabaseMetaData

转载 作者:行者123 更新时间:2023-11-29 07:23:53 24 4
gpt4 key购买 nike

我正在使用 JSF 1.2 并尝试使用 <a4j:keepAlive beanName="reportController"> ,但我不断收到此错误:

HTTP Status 500

Caused by: java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183

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

最佳答案

Caused by: java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData

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

public class ReportController implements Serializable {

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

// ...
}

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

public class ReportController implements Serializable {

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

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

// ...
}

<a4j:keepAlive>并不完全是这个问题的原因。它只记住同一页面上跨 HTTP 回发请求的 HTTP session 中的 bean 实例。 HTTP session 属性本质上通常是序列化的。这个序列化只是触发并暴露了你隐藏的设计问题。 volatile 的一次性资源(例如数据库连接、语句、元数据、输入流、输出流等)绝对不应该是可序列化的,因此会出现此异常。

另请参阅:

关于java.io.NotSerializedException : com. mysql.jdbc.DatabaseMetaData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35170752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com