簡體   English   中英

Java中的內存泄漏:多種方法的數據庫連接

[英]Memory leaks in Java: database connection in multiple methods

我構建了一個爬蟲,該爬蟲當前正以每天600MB的速度遇到內存泄漏。 我認為原因是數據庫連接。 當前,我正在創建一個數據庫連接作為靜態方法,如下所示:

static
{       
    try
    {
        String hostname = PropertyReader.getProperty("hostname");
        String port = PropertyReader.getProperty("port");
        String dbname = PropertyReader.getProperty("dbname");
        String username = PropertyReader.getProperty("username");
        String password = PropertyReader.getProperty("password");

        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname+"";
        conn = DriverManager.getConnection(url, username, password);
        System.out.println("conn built");
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    } catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    }
}

並且我在多種方法中使用此變量,如下所示:

public static void getSeed()

public static void processPage(String URL)

用於檢索數據並將數據插入數據庫。

避免內存泄漏的最佳替代方法是什么?

內存泄漏的最大根源是忘記關閉ResultSets和PreparedStatements。 無法確定您是否正在代碼的其他地方執行此操作,但是如果您這樣做,那就是我的出發點。

這是我的想法:

  1. 我不會猜測內存泄漏。 解決該問題的唯一可靠方法是分析您的代碼。 成為科學家-獲取數據。 使用已安裝所有插件的Visual VM。 這是一個很棒的工具,而且免費。
  2. 我不會以這種方式進行數據庫連接。 連接不是線程安全的。 單個連接也感覺不到很好的可擴展性。 最好在盡可能小的范圍內簽入和簽出連接池。
  3. 您沒有顯示任何數據庫代碼,但是需要在創建它們的方法范圍內的finally塊中關閉所有Statement,Connection和ResultSet實例。 每一個都應在單獨的try / catch塊中關閉。 這將顯示為爬網程序中的內存泄漏之外的問題:數據庫服務器最終將耗盡游標。 如果無法正確清理,對於客戶端和數據庫服務器都是問題。

不同的線程不應共享單個連接。 這將導致悲傷。 設置一個連接池,然后配置文件。 您可能會對泄漏出現的地方感到驚訝。

暫無
暫無

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

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