繁体   English   中英

hibernate.jdbc.batch_size设置为50,不允许在异常期间测试单个更新

[英]hibernate.jdbc.batch_size set to 50 not allowing to test single update during exception

我需要修复安全漏洞,指出每当应用程序无法更新数据库中的数据时,异常均包含敏感细节,并且已通过捕获数据库异常并自定义其错误消息来修复了该漏洞。

要测试此修复程序,我需要执行updateList服务并验证响应,但是在Hibernate中,由于无法测试单个更新,因此hibernate.jdbc.batch_size设置为50,因为它将始终返回成功更新的数据,因为更新查询将命中数据库仅当更新计数达到50时。

我只能通过如下所述将sessionFactory.getCurrentSession()。flush()放入来测试此修复程序。

public void update(final List list)
{
    sessionFactory.getCurrentSession().update(list);    
    sessionFactory.getCurrentSession().flush();

}

还有其他最佳解决方案吗? 或flush()会强制一个或多个查询在数据库中更新,但不确定对hibernate.jdbc.batch_size = 50的影响;

“仅当更新计数达到50时,更新查询才会命中数据库”,这并非完全正确。 当事务关闭时,它将命中db。

您可以添加flush ,但这可能会导致性能下降(出于某种原因,其中出现了hibernate.jdbc.batch_size=50 )。

我建议您把钓丝放在其他地方。 就像是servlet一样,添加自定义过滤器。 这还将使您免于在其他地方出现此类异常情况。 使用Hibernate很难预测何时决定将数据刷新到db。

还有其他最佳解决方案吗?

是。
要处理单个错误情况,您不应以不会反映生产中实际实现的方式更改实现。
为什么呢 因为在测试之后,您必须考虑使您的实现退后一步以在生产中具有预期的行为。
您不必忘记在每次要测试此特殊情况时进行这些更改。
否则,您的应用程序可能无法正常运行。
这不是好方法。

要测试您的案例,可以编写一个单元测试
此外,这一程序不必一定要依赖实际的数据库调用。

我建议将这种方法用于单元测试:

  1. 用消息中的敏感信息模拟产生异常的对象。
  2. 记录它的行为。 调用该模拟对象时,它会在消息中引发具有类似敏感信息的异常。
  3. 调用要测试的方法时,断言错误消息get不包含任何敏感信息。

如果此功能对于定期测试并在距离目标非常近的环境中确实很重要,则可以创建一个集成测试 ,该测试使用与生产中的应用程序相同的约束( hibernate.jdbc.batch_size=50 ),并因此插入数据库中至少有50个数据。

当然,此测试可能会花费大量时间,并且仅应在CI工具上自动调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM