catch PacketTooBigException()块在Hibernate中不起作用

时间:2014-12-19 11:53:39

标签: java mysql database hibernate

我的要求是在db中存储图像数组。在存储该图像数组时,Hibernate会抛出异常GenericJDBCException&很多堆栈跟踪&然后Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large。我的要求是在遇到PacketTooBigException时增加db的数据包查询大小。所以我采用了两个catch(PacketTooBigException e){...}catch (Exception e){..}。{/ p>

但是Hibernate永远不会像JDBC一样直接抛出PacketTooBigException。 Hibernate首先抛出GenericJDBCException然后Caused by: com.mysql.jdbc.PacketTooBigException:。为了克服这种情况,在catch块我写了if(e.getCause().getClass() == PacketTooBigException.class){..my job..}

1)我是否正确行事? 2)或者任何人都可以建议我更好的方法,以便我可以直接捕获PacketTooBigException。 谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

正如您正确分析的那样,hibernate将原始数据库摘要包装为原因。

但问题是,捕获这样的例外是否有意义。我不知道你的业务领域,但一般来说PacketTooBigException意味着你试图存储一个像blob一样大的文件。

在验证时更好地处理这些问题。您可以通过

增加允许的最大大小
SET GLOBAL max_allowed_packet = <some big value>

并在上传文件时进行验证。

<强>更新

根据mysql文档,可以安全地增加所有查询的限制(通过更改变量或编辑my.ini)。

http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html

从上面的链接引用:

  

增加此变量的值是安全的,因为额外的   仅在需要时分配内存。例如,mysqld分配   只有在发出长查询或mysqld必须时才会有更多内存   返回一个大的结果行。变量的小默认值是   在客户端和服务器之间捕获错误数据包的预防措施   并且还要确保使用large不会耗尽内存   包意外。

但即使将其增加到新的最大值后,您仍然存在上传更大文件的风险,因此最好对用户界面本身进行验证检查。