簡體   English   中英

Java堆使用JDBC4PreparedStatement填充

[英]Java Heap filling up with JDBC4PreparedStatement

我正在運行一個Play! 2.3使用Akka多線程的應用程序。 每個線程訪問一個MySQL數據庫並運行一些計算。 每當我運行一組這些任務時,應用程序的內存占用都會增加,這主要是由於JDBC4PreparedStatement對象永遠不會消失。 運行幾次后,這些對象將占用200MB以上的空間,並很快加成內存不足錯誤。調用Sytem.gc()完全不會降低它。

在此處輸入圖片說明

我正在使用Hibernate 4.3.0進行持久化,並且在EntityManager上調用clear()也無濟於事,因此並不是在任何地方都存儲有持久性對象。 這個答案暗示可能有Statement對象在某個地方保持打開狀態,但是我永遠不會直接與Statement對象或Connection對象進行接口,而只是與JPA的EntityManager交互。

這是MySQL JDBC或JPA的預期行為嗎? 我該如何解決此內存泄漏? 我不確定在哪里尋找解決方案,不確定這是否是MySQL或JDBC或JPA或Hibernate的實現所致。 或可能的方式玩! 處理JPA。


編輯

需要明確的是,我沒有使用ConnectionStatement對象,因此沒有什么可以關閉的。 這是一個示例,在該示例中,我從事務中的Play獲取EntityManager ,執行某些操作,然后提交事務。

        JPA.withTransaction( () -> {
            Site site= JPA.em().find(Site.class, siteId);
            site.setDomain("www.stackoverflow.com");
        });

這是預期的行為。 您將必須告訴mysql連接返回一個游標,而不是通過設置來選擇完整集:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
              java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

根據您的要求,您的特定設置可能與此稍有不同,因此可能需要一些擺弄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM