【问题标题】:catch PacketTooBigException() block not works in Hibernatecatch PacketTooBigException() 块在 Hibernate 中不起作用
【发布时间】:2014-12-19 11:53:39
【问题描述】:

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

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

1) 我走对路了吗? 2)或者任何人都可以建议我更好的方法,以便我可以直接捕获PacketTooBigException。 感谢您的宝贵时间。

【问题讨论】:

    标签: java mysql database hibernate


    【解决方案1】:

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

    但问题是捕获这样的异常是否有意义。我不知道您的业务领域,但通常 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 必须时才需要更多内存 返回一个大的结果行。变量的小默认值是 在客户端和服务器之间捕获错误数据包的预防措施 并且还确保您不会通过使用大内存来耗尽内存 意外的数据包。

    但即使将其增加到一个新的最大值,您也总是冒着上传更大文件的风险,因此最好对用户界面本身进行验证检查。

    【讨论】:

    • 感谢@Rangalo,max_allowed_pa​​cket 的初始大小为 1mb。 M Upload'g 大约 900kb 的图像。但将其转换为字节数组后,其大小增加了 1mb 以上。因此我得到了例外。是的,他们绝对是“max_allowed_pa​​cket”的方式。我只想在收到“PacketTooBigException”时才设置它。谢谢兰加洛的时间。欢迎您提出建议!
    • 谢谢@Rangalo,是的,我正在对小于 1mb 的图像文件进行验证。但是对于 900kb 图像,查询的内部数据包大小增加到 1196355kb+。因此它会生成我想要捕获的PacketTooBigException。需要你的建议。
    • 根据转换后的大小进行验证,或者缓冲区比允许的大得多。如文档链接中所述,1MB 无论如何都太低了。
    • 谢谢。最终用户不会接受他正在上传超过 1mb 的文件,实际上他正在上传 900kb 的文件。是他们赶上PacketTooBigException的方式。我在我的异常块中完成了 if(e.getCause().getClass() == PacketTooBigException.class) 的操作。您的建议很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多