使用Postgres jdbc驱动程序

时间:2016-12-15 14:11:31

标签: java postgresql

我正在尝试使用postgre sql驱动程序为java jdbc执行查询。

我遇到了内存构建的问题,我的语句处于循环中然后休眠。

问题是,当我查看任务管理器中的工作时,我可以看到内存一次攀升00,004K。我已经阅读了关闭所有连接语句结果集的文档,但这仍然会发生。

请告诉我在我的代码中导致这种情况的原因。

String sSqlString =  new String("SELECT * FROM stk.comms_data_sent_recv " +
                "WHERE msgtype ='RECEIVE' AND msgstat ='UNPRC' " +
                "ORDER BY p6_id,msgoccid " +
                "ASC; ");

        ResultSet rs = null;


        Class.forName("org.postgresql.Driver");

        Connection connection = DriverManager.getConnection(
                "jdbc:postgresql://p6tstc01:5432/DEVC_StockList?autoCloseUnclosedStatements=true&logUnclosedConnections=true&preparedStatementCacheQueries=0&ApplicationName=P6Shunter", "P6dev",
                "admin123");

        //Main Loop 
        while(true)
        {


            try{    

                Statement statement = connection.createStatement();
                statement.executeQuery(sSqlString);
                //rs.close();   
                statement.close();  

                //connection.close();
                rs = null;
                //connection = null;
                statement =null;
            } 
            finally {
            //connection.close();
            }


            try {
                Thread.sleep(loopTime);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }


    }

注意注释掉的代码..我确实关闭了所有内容,但这似乎没有什么区别。我确实看到,似乎语句executeQuery(sSqlString);导致了这个原因我认为如果我删除语句没有内存泄漏。

我可能错了,但请帮助我。

更新

我已根据您的建议更改了我的代码。希望它好一点,如果我需要改变一些东西请告诉我。

我的主循环:

public static  void main(String[] args) throws Exception {
    // TODO Auto-generated method stub


        //Main Loop 
        while(true)
        {

            getAndProcessAllUnprcMessagesFromStockList();

            try {
                Thread.sleep(loopTime);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }


}

我将调用我的函数来获取数据:

public static void getAndProcessAllUnprcMessagesFromStockList() throws Exception
{

    ResultSet rs = null;
    Statement statement = null;
    Connection connection =null;

    String sSqlString =  new String("SELECT * FROM stk.comms_data_sent_recv " +
                        "WHERE msgtype ='RECEIVE' AND msgstat ='UNPRC' " +
                        "ORDER BY p6_id,msgoccid " +
                        "ASC; ");


    try{
        Class.forName("org.postgresql.Driver");

         connection = DriverManager.getConnection(
                "jdbc:postgresql://p6tstc01:5432/DEVC_StockList?autoCloseUnclosedStatements=true&logUnclosedConnections=true&preparedStatementCacheQueries=0&ApplicationName=P6Shunter", "P6dev",
                "admin123");

         PreparedStatement s = connection.prepareStatement(sSqlString,
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);

         rs = s.executeQuery();


         while (rs.next()) {

                //Process records
                UnprcMsg msg = new UnprcMsg();


                msg.setP6Id(rs.getString(1));
                msg.setMsgOccId(rs.getString(2));
                msg.setWsc(rs.getString(3));
                msg.setMsgId(rs.getString(4));
                msg.setMsgType(rs.getString(5));
                msg.setMsgStatus(rs.getString(6));


                //JOptionPane.showMessageDialog(null,msg.getP6Id(), "InfoBox: " + "StockListShunter", JOptionPane.INFORMATION_MESSAGE);
                //msg2 = null;

            }



         rs.close();

         s.close(); 
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        connection.close();
    }


}

我关闭了我的连接声明和结果。 我还下载了eclipse内存分析器,然后我运行jar会执行我的主循环。跑了大约一个小时,这是我从记忆分析仪得到的一些数据。

泄密嫌疑人:

enter image description here

enter image description here

enter image description here

现在我知道我不能继续使用任务管理器的内存,但有什么区别?为什么任务管理器显示以下内容:

enter image description here

我担心在任务管理器中看到的内存使用情况?我可以做?

0 个答案:

没有答案