簡體   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