0

我有一个在 Apache Tomcat 6 上运行的 Web 应用程序,使用 ZK、Hibernate 和 Jaybird JDBC 来访问 Firebird 数据库。由于某些未知原因,在应用程序中执行动态 SQL 的尚未映射的操作之后,它会崩溃并出现以下异常:

错误:org.springframework.transaction.TransactionSystemException:无法回滚 JPA 事务;嵌套异常是 javax.persistence.PersistenceException:回滚时出现意外错误 javax.persistence.PersistenceException:回滚时出现意外错误 org.hibernate.TransactionException:JDBC 回滚失败 [SQL:335544726,HY000] org.firebirdsql.jdbc.FBSQLException:GDS 异常。335544726. 从连接读取数据时出错。

原因:从连接中读取数据时出错。...

然后,用户在它之后执行的任何操作都会导致以下错误:

错误:javax.persistence.PersistenceException:org.hibernate.exception.GenericJDBCException:无法执行查询 org.hibernate.exception.GenericJDBCException:无法执行查询 [SQL:335544721,HY000] org.firebirdsql.jdbc.FBSQLException:GDS 异常。335544721. 无法完成对主机“”的网络请求。原因:无法完成对主机“”的网络请求。

系统崩溃了,就像它失去了与数据库的连接一样。

以前有人经历过吗?

4

5 回答 5

4

经过一些研究和测试,我必须了解发生了什么。

当用户使用大小大于目标表字段大小的字符串在应用程序中执行特定搜索时,就会出现问题。因此,当系统使用字符串输入作为参数执行 HQL 查询时,系统崩溃了 - 就像将长度为 20 的字符串与 varchar(18) 字段进行比较时一样。

解决方案很简单:限制搜索字段中输入字符串的大小。

希望这对将来的任何人都有帮助。

于 2014-04-18T15:56:46.040 回答
0

您无法连接到数据库。代码 335544721 是主动拒绝访问的结果,这可能是由多种因素引起的,例如登录错误、防火墙规则避免连接或防病毒阻塞

于 2014-02-25T19:32:24.997 回答
0

我也遇到了类似的问题,在我的情况下,它发生是因为我使用了 LIKE 条件并且加上两个“%”标志,参数的长度超过了字段的长度。

因此,例如,如果我有一张桌子:

create table TEST (name varchar(5) default '' not null);

当我尝试按以下条件搜索并具有参数 param1 = '%name1%' 时(如您所见,'name1' 对 varchar(5) 字段有效):

select * from TEST where name like :param1;

我在休眠中遇到了同样的错误,在这个错误之后我无法执行任何查询,可能是因为休眠会话被破坏了。

希望它可以帮助某人。

于 2015-12-08T06:57:49.790 回答
0

我通过重新启动服务器上的 FirebirdGuardianService 解决了这个问题。

于 2017-07-11T13:24:13.020 回答
0

您可以通过丢弃连接而不是重用它来解决此问题。

当您有时使用相同的连接并且驱动程序/火鸟停止产生正确答案时会发生问题。

根据我的经验,如果您使用相同的连接运行超过 500 次(在 500 个查询中),即使在提交事务并保持事务打开之后,您也是解决此问题的有力候选人。

所以你可以做些什么来创建一个计数器,在它大于 500 后关闭当前事务并创建一个新事务。

你必须注意它在当前事务中是否有 DML 命令[例如更新、删除]。如果您使用这些命令关闭事务,则需要注意整个操作的完整性。

于 2021-11-02T08:38:16.760 回答