我有一个在Apache Tomcat 6上运行的Web应用程序,使用ZK、Hibernate和Jaybird JDBC访问Firebird数据库。由于某种未知的原因,在执行动态SQL的应用程序中执行了一个尚未映射的操作后,它会因以下异常而崩溃:
错误:org.springframework.transaction.TransactionSystemException:无法回滚JPA事务;嵌套异常为javax.persistence.PersistenceException:回滚时出现意外错误javax.persistence.PersistenceException:回滚org.hubinate.TransactionException时出现意外错误:JDBC回滚失败[SQL:3335544726,HY000]org.firebirdsql.jdbc.FBSQL异常:GDS异常。335544726.从连接读取数据时出错。
原因:从连接读取数据时出错。…
然后,用户执行的任何操作都会导致以下错误:
错误:javax.persistence.exception:org.hibernate.exception.GenericJDBCException:无法执行查询org.hubinate.exception.GenericJDBCException:无法执行查询[SQL:3335544721hy000]org.firebirdsql.jdbc.FBSQL异常:GDS异常。335544721.无法完成对主机"的网络请求。原因:无法完成对主机"的网络请求。
系统崩溃,就像它失去了与数据库的连接一样。
以前有人经历过吗?
经过一些研究和测试,我了解了发生了什么。
当用户在应用程序中使用大小大于目标表字段大小的字符串执行特定搜索时,出现了此问题。因此,当系统以字符串输入作为参数执行HQL查询时,系统崩溃了——就像将长度为20的字符串与varchar(18)字段进行比较时一样。
解决方案很简单:限制搜索字段中输入字符串的大小。
希望这对未来的任何人都有帮助。
您无法连接到数据库。代码335544721是主动拒绝访问的结果,这可能是由各种因素引起的,例如登录错误、防火墙规则避免连接或防病毒阻止
我也遇到了类似的问题,在我的情况下,这是因为我使用了LIKE条件,加上两个"%"符号,参数的长度超过了字段的长度。
例如,如果我有一张表:
create table TEST (name varchar(5) default '' not null);
当我尝试按以下条件搜索并使参数param1="%name1%"时(如您所见,"name1"对varchar(5)字段有效):
select * from TEST where name like :param1;
我在hibernate中也遇到了同样的错误,在这个错误之后,我无法执行任何查询,可能是因为hibernate会话被破坏了。
希望它能帮助到别人。
我通过重新启动服务器上的FirebirdGuardianService解决了这个问题。
您可以通过丢弃连接而不重用来解决此问题。
当你有时使用相同的连接,而驱动程序/火鸟停止产生正确的答案时,就会出现问题。
根据我的经验,如果您使用相同的连接运行500多次(在500个查询中),即使在提交事务并保持事务打开后,您也很有可能遇到这个问题。
那么你可以做些什么来创建一个计数器,在它变得大于500之后,关闭当前事务并创建一个新的事务。
当它在当前事务中有DML命令时,你必须注意[例如更新、删除]。如果使用这些命令关闭事务,则必须小心整个操作的完整性。