<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Hibernate 4 批處理 > 原文: [https://javabeginnerstutorial.com/hibernate/batch-execution-with-hibernate-4/](https://javabeginnerstutorial.com/hibernate/batch-execution-with-hibernate-4/) 在本文中,我將為您簡要介紹 Hibernate 批處理。 ## 為什么要批處理? 因為這比打開一個事務向數據庫插入 1000000(一百萬)個條目并最后提交或為每個相同容量的插入打開事務要好。 批處理為您提供了管理此工具的正確工具:在 Hibernate 自動調用`commit`之后定義一個限制,以將您的數據持久存儲在應用后面的數據庫中。 ## 樸素的方法 ```java public static void naiveApproach() { ?? final Configuration configuration = new Configuration().configure(); ?final StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); ?? final SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build()); ?? final Session session = sessionFactory.openSession(); ?? final Transaction tx = session.beginTransaction(); ?? for (int i = 0; i < 1_000_000; i++) { ?????? final Book book = new Book("9781617291999", "Java 8 in Action", new Date()); ?????? session.save(book); ?? } ?? tx.commit(); ?? session.close(); } ``` 上面的代碼做了我一開始所描述的:它打開一個事務并在插入 1000000 條記錄后保存。 根據您的硬件,您可以到達循環的結尾并在結尾處調用一次提交。 如果您的內存不足,您的應用可能會拋出`OutOfMemoryException`,因為 Hibernate 將所有新的`Book`實例存儲在內存中的第二級緩存中。 為了進行測試,我將插入次數增加到 10000000(一千萬),以查看應用崩潰之前需要花費多長時間。 憑借近三百萬本新書,我達到了應用的 2GB 內存。 這意味著,如果二級緩存消耗了應用可用的所有內存,則數據庫條目將消失,您可以重新開始。 ## 設置批處理大小,將二級緩存保持在較低水平 為了使二級緩存的大小保持較低,您可以在`hibernate.cfg.xml`中引入批處理大小。 這將告訴 Hibernate 容器每隔 n 行要批量插入。 可以使用屬性`hibernate.jdbc.batch_size`設置批處理大小。 有趣的是,Hibernate 的文檔不僅引入了此屬性,而且還需要修改上面的樸素代碼(我只會復制相關的`for`循環): ```java for (int i = 0; i < 1_000_000; i++) { ?? final Book book = new Book("9781617291999", "Java 8 in Action", new Date()); ?? session.save(book); ?? if(i % 50 == 0) { // 50 is the batch_size ?????? session.flush(); ?????? session.clear(); ?? } } ``` 如果仔細看一下上面的代碼,您會看到解決方案是將批處理大小大塊中的會話`flush()`和`clear()`保持為較低的二級緩存大小。 ### 那么為什么要設置批處理大小? 很好的問題,我已經搜索了 Hibernate 的文檔以找到有關此信息,但未找到任何信息。 但是,如果考慮到這一點,批處理可以通過將一堆語句組合在一起,從而使數據庫有效地執行插入和更新語句。 ## 批次大小無法保證 設置批處理限制并不能保證僅由于將數據刷新到數據庫而使第二級緩存大小保持較小。 但是,還有一些透明的限制,您最終將看不到。 一個示例是如果您使用`GenerationType.IDENTITY`,則 Hibernate 透明地禁用批處理。 第二個示例是 Hibernate 查看要一起批處理的語句:如果當前語句與前一個相同,則在未達到`batch_size`的情況下將它們合并在一起。 在上面的示例中,語句相似,因此將它們批處理在一起。 但是,如果我們將“作者”和“書籍”一起添加到數據庫中,則 Hibernate 會看到交替的語句,并且將從每個語句開始一個批處理組。 要解決此問題,可以使用`hibernate.order_inserts`和`hibernate.order_updates`屬性。 這使 Hibernate 在插入之前對語句進行了排序,因此可以看到 50 個`Book`插入可以一起批處理,并且 50 個`Authors`可以一起批處理。 ## 手動保存數據 我們已經解決了消耗大量內存的問題,但是插入時的異常又如何呢? 在大多數情況下,由于最后一個失敗而回滾一百萬次插入是不可行的。 解決方案是手動調用事務的提交以及批處理大小: ```java for (int i = 0; i < 1_000_000; i++) { ?? final Book book = new Book("9781617291999", "Java 8 in Action", new Date()); ?? session.save(book); ?? if(i % 50 == 0) { // 50 is the batch_size ?????? session.flush(); ?????? session.clear(); ?????? session.getTransaction().commit(); ?????? session.beginTransaction(); ?? } } ``` 如果我們達到了`batch_size`,則上面的代碼將提交事務,并在會話上開始新事務,因為前一個事務已因提交而失效。 ## 總結 批處理僅有助于將數據高效地存儲在數據庫中。 如果要使用某種故障轉移機制,則需要實現手動提交策略。 [代碼下載](https://github.com/JBTAdmin/Hibernate)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看