我的要求是在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
。
谢谢你的时间。
答案 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不会耗尽内存 包意外。
但即使将其增加到新的最大值后,您仍然存在上传更大文件的风险,因此最好对用户界面本身进行验证检查。