Утечка памяти на java

352
12 июля 2017, 23:46

Можете подсказать, есть ли в программах утечка памяти?

//Oracle_time.java
 import java.sql.*;
 import java.time.LocalDateTime;
    public class Oracle_time {
    private static final String url = "jdbc:oracle:thin:elvira/elvira@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = viumdbtest)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = iumdb)))";
    public static void main(String args[]) throws SQLException {
    String query1 = "UPDATE elvira.pgw_lastfiletimedownload set LastTime='"+ LocalDateTime.now()+"'";
    try(Connection con = DriverManager.getConnection(url);PreparedStatement stmt = con.prepareStatement(query1))
    {
        stmt.executeUpdate(query1);
    }
    catch (SQLException sqlEx) {
        sqlEx.printStackTrace();
    }
}

}

//Oracle_export.java
 import com.cloudera.sqoop.SqoopOptions;
 import org.apache.sqoop.tool.ExportTool;
 import java.sql.*;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 public class Oracle_export {
   private static final String url = "jdbc:oracle:thin:elvira/elvira@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = viumdbtest)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = iumdb)))";

  static boolean flag = false;
  public static void main(String[] args) throws SQLException {
  String query1 = "UPDATE elvira.PGW_INPUTDATA set STATE='2' where STATE='1'";
    try(Connection con = DriverManager.getConnection(url);PreparedStatement stmt = con.prepareStatement(query1))
    {
        System.out.println(export());
        if(flag) {
            stmt.executeUpdate(query1);
        }
    }
    catch (SQLException sqlEx)
    {
        sqlEx.printStackTrace();
    }
}
public static int export() throws SQLException
{
    SqoopOptions options = new SqoopOptions();
    try(Connection con = DriverManager.getConnection(url))
    {
        //con = DriverManager.getConnection(url);
        //options.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        options.setConnectString("jdbc:oracle:thin:elvira/elvira@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = viumdbtest)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = iumdb)))");
        options.setTableName("elvira.PGW_OUT");
        options.setColumns(new String[]
                {
                        "numrec",
                        "TypeOfRec",
                        "accesspointnameni",
                        "apnselectionmode",
                        "causeforrecordclosing",
                        "chargingcharact",
                        "chargingchmode",
                        "chargingid",
                        "chargingrulebasename",
                        "datavolumefbcdownlink",
                        "datavolumefbcuplink",
                        "duration",
                        "dynamicaddressflag",
                        "dynamicaddressflag2",
                        "localsequencenumber",
                        "localsequencenumber2",
                        "mstimezone",
                        "networkinit1",
                        "nodeid",
                        "pgwaddress",
                        "pgwplmnidentifier",
                        "pdnconnectionchargingid",
                        "pdptypeorganization",
                        "pdptypenumber",
                        "qosinformationneg",
                        "ratinggroup",
                        "rattype",
                        "rattype2",
                        "recordopeningtime",
                        "recordsequencenumber",
                        "recordtype",
                        "served3gpp2meid",
                        "servedimeisv",
                        "servedimsi",
                        "servedmsisdn",
                        "servedpdp_pdnaddress",
                        "serviceconditionchange",
                        "servingnodeaddress",
                        "servingnode2",
                        "servingnodetype",
                        "sgsnaddress",
                        "sgsnplmnidentifier",
                        "starttime",
                        "stoptime",
                        "timeoffirstusage",
                        "timeoflastusage",
                        "timeofreport",
                        "timeusage",
                        "userlocationinformation",
                        "userlocationinformation2",
                        "id"
                }
        );
        Configuration config = new Configuration();
        config.addResource(new Path("/Users/tat100alar/hadoop_files/core-site.xml"));
        config.addResource(new Path("/Users/tat100alar/hadoop_files/hdfs-site.xml"));
        options.setConf(config);
        options.setExportDir("/user/hive/warehouse/pgw_impala.db/pgw_oracle/*.*");
        options.setNumMappers(1);
        options.setNullStringValue("null");
        options.setNullNonStringValue("null");
        options.setInputLinesTerminatedBy('\n');
        options.setInputFieldsTerminatedBy('\001');
    }
    catch(SQLException ee)
    {
        //con = DriverManager.getConnection(url);
        ee.printStackTrace();
    }
    int ret = new ExportTool().run(options);
    if (0 != ret) {
        flag=false;
    }
    else
    {
        flag=true;
    }
    return ret;
}

}

//Oracle_import.java
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.fs.Path;
  import org.apache.sqoop.tool.ImportTool;
  import com.cloudera.sqoop.*;
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.sql.*;
  public class Oracle_import {
  private static final String url = "jdbc:oracle:thin:elvira/elvira@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = viumdbtest)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = iumdb)))";
  static boolean flag = false;
  public static void main(String[] args) throws SQLException, InterruptedException, IOException {
    String query1 = "UPDATE elvira.PGW_INPUTDATA set STATE='1' where STATE='0'";
    Process proc = Runtime.getRuntime().exec("sh/home/progr/work/test1.sh");
    try(BufferedReader read = new BufferedReader(new InputStreamReader(
            proc.getInputStream()));)
    {
        try {
            proc.waitFor();
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
        while (read.ready()) {
            System.out.println(read.readLine());
        }
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
    try(Connection con = DriverManager.getConnection(url);PreparedStatement stmt = con.prepareStatement(query1))
    {
        System.out.println(export());
        if(flag) {
            stmt.executeUpdate(query1);
        }
    }
    catch (SQLException sqlEx)
    {
        sqlEx.printStackTrace();
    }
}
public static int export() throws SQLException
{
    SqoopOptions options = new SqoopOptions();
    try(Connection con = DriverManager.getConnection(url);)
    {   options.setConnectString("jdbc:oracle:thin:elvira/elvira@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = viumdbtest)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = iumdb)))");
        String query = "select ID,SERVEDIMEISV,SERVEDIMSI,FIRSTDATETIME,SECONDDATETIME " +
                "from elvira.PGW_INPUTDATA where $CONDITIONS and STATE='0' order by DATA_ID";
        options.setSqlQuery(query);
        Configuration config = new Configuration();
        config.addResource(new Path("/Users/tat100alar/hadoop_files/core-site.xml"));
        config.addResource(new Path("/Users/tat100alar/hadoop_files/hdfs-site.xml"));
        options.setConf(config);
        options.setNumMappers(1);
        options.setTargetDir("/user/abulal/test");
        options.setHiveDatabaseName("pgw");
        options.setOverwriteHiveTable(true);
        options.setHiveTableName("pgw_oracle");
        options.setHiveImport(true);
        options.setFieldsTerminatedBy('\001');
        options.setLinesTerminatedBy('\n');
        options.setDeleteMode(true);
    }
    catch(SQLException ee)
    {
        ee.printStackTrace();
    }
    int ret = new ImportTool().run(options);
    if (0 != ret) {
        flag=false;
    }
    else
    {
        flag=true;
    }
    return ret;
}

}

Answer 1

Кроме тучи стилистических и прочих проблем, есть одна глобальная проблема с вашим кодом.

Вы нигде не закрываете Statement/Connection - в принципе конечно сборщик мусора за вами все равно подберет, но по вашим словам:

код работает на нагруженном сервере и память увеличивается

это явно следствие этой проблемы.

Архитектурно обычно делается так:

  1. В одном месте грузится драйвер JDBC
  2. Далее в одном месте открывается Connection
  3. Перед вызовом, готовится Statement
  4. Делаем вызов, обрабатываем результаты
  5. Закрываем Statement
  6. Если Connection более не нужен то его тоже закрываем ну или держим в ожидании новых Statement

Как то так.

Update

Немного всмотрелся в код внимательнее и обнаружил еще пару мест где есть не очень оптимальные места:

  1. Вы используете прекомпилируемую версию Statement, а именно PreparedStatement, по хорошему ее надо создавать 1 раз и прогонять много раз меняя только параметры. У вас как минимум 2 запроса, которые ложатся в 1 PreparedStatement:

UPDATE elvira.PGW_INPUTDATA set STATE='2' where STATE='1'

и

UPDATE elvira.PGW_INPUTDATA set STATE='1' where STATE='0'

они хорошо лягут в запрос типа:

UPDATE elvira.PGW_INPUTDATA set STATE='?' where STATE='?'

тогда вам достаточно создать 1 PreparedStatement и менять его параметры перед вызовом.

Answer 2

Это правильный синтаксис?

public class Oracle_time {
public static void main(String[] args)
{
    Oracle_time m = new Oracle_time();
    m.testDatabase();
}
private void testDatabase() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:elvira/elvira@(DESCRIPTION = (ADDRESS = 
(PROTOCOL = TCP)(HOST = viumdbtest)(PORT = 1521))
(CONNECT_DATA =(SERVICE_NAME = iumdb)))";
String query1 = "UPDATE elvira.pgw_lastfiletimedownload set LastTime='"+ 
LocalDateTime.now()+"'";
Connection con = DriverManager.getConnection(url);
try {
Statement stmt = con.createStatement();
stmt.executeUpdate(query1);
stmt.close();
} finally {
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
READ ALSO
BatchUpdate JDBCTemplate - пакетное выполнение sql-запросов Java

BatchUpdate JDBCTemplate - пакетное выполнение sql-запросов Java

Есть метод, который обновляет данные в БД по HashMap

261
Оптимальный движок для 2d игры под android

Оптимальный движок для 2d игры под android

Читал форумы везде предлагают использовать Юнити, существует ли альтернатива для разработки 2d игры под андроид на java или C#? Юнити безусловно...

293