有时从JDBC客户端远程查询时,postgres不返回记录

时间:2018-12-17 07:02:21

标签: postgresql jdbc

  public static ArrayList<String[]> getDailyRecords () throws ClassNotFoundException {
    ArrayList<String[]> list=new ArrayList<String[]> ();
    String[] header = {"City", "Location", "Asset", "Number of Alerts", "Time spent in alerts", "Last seen temparature", "Limit"};
    list.add (header);
    String myDriver = "org.postgresql.Driver";
    Class.forName (myDriver);
    try( Connection conn = DriverManager.getConnection( ApplicationSettings.DATABASE_URL, ApplicationSettings.DATABASE_USER, ApplicationSettings.DATABASE_PASSWORD);
        Statement st = conn.createStatement ();) {
        conn.setAutoCommit (true);
        ResultSet rs=null;
        st.setFetchSize (200);
        String dailyQuery="select * from sch.reports();";
        rs= st.executeQuery (dailyQuery);
        while (rs.next ()) {
            String[] ar = new String[7];
            ar[0] = rs.getString ("location");
            ar[1] = rs.getString ("sublocation");
            ar[2] = rs.getString ("zone");
            ar[3] = rs.getString ("total_count");
            ar[4] = rs.getString ("period");
            String temp = rs.getString ("temparature");
            ar[5] = temp;

            list.add (ar);
        }
        conn.close ();
        st.close ();
        rs.close ();
    }catch(Exception e){
      e.printStackTrace ();
    }catch(Error e){
        e.printStackTrace ();
    }
    finally {
        if(list.size ()==1){
            System.out.println ("NO records found");
        }else{
            System.out.println ("Foudn some records");
        }
        return list;
    }

我有一个sql函数,当从postgres客户端本地查询时,它确实返回记录。我在Java应用程序的预定时间调用此函数。这个工作好几个月了。但是突然之间,st.executeQuery()偶尔返回空结果集。每天有10次尝试中有4次尝试返回空结果集。

我尝试过的事情:

  • 确保查询始终返回一些记录。它应该返回60条记录。
  • 捕获的错误,异常。没有看到错误。
  • 确保JDBC连接已关闭。
  • 已调试的Postgres JDBC驱动程序类。发现在结果集为空的情况下,未从postgres数据流接收数据。

表中数据的大小会影响查询响应吗?

感谢您的帮助!

更新:添加了SQL函数定义。

   DECLARE
    exception_error_code  text;
    exception_message     text;
    exception_detail      text;
    exception_hint        text;
    exception_context     text;
BEGIN

 RETURN QUERY

select l.name as location,sl.name as sublocation,z.name as zone,al.lim as lim,count(al.id) total_count,sum(al.timestamp_to-al.timestamp_from) period,t2.temperature  temparature  
                         from      
                         map.location l     

                         left join     
                         map.sub_location sl     
                         on l.id=sl.location_id     

                         left join     
                         map.zone z     
                         on sl.id=z.sub_location_id     

                         left join     
                         map.subzone sz     
                         on z.id=sz.zone_id     

                         inner join      
                         (select *,(info::json -> 'breach_type')::text as lim from alr.live where date(timestamp_from)= date(now() +   INTERVAL '5 hours 30 minutes')) al     
                         on sz.id= al.sub_zone_id     

                         left join     
                         (select subzone_id,max(nd_timestamp) as nd_timestamp from tel.temperature_sh group by subzone_id) t1     
                         on al.sub_zone_id=t1.subzone_id     

                         left join     
                         tel.temperature_sh t2     
                         on t1.subzone_id=t2.subzone_id     
                         and t1.nd_timestamp=t2.nd_timestamp     

                         group by l.name ,sl.name,z.name,t2.temperature , al.lim    
                         order by l.name ,sl.name,z.name;

-- if something "breaks" do the following
EXCEPTION WHEN others THEN
    get stacked diagnostics
        exception_error_code  = RETURNED_SQLSTATE
        ,exception_message    = MESSAGE_TEXT
        ,exception_detail     = PG_EXCEPTION_DETAIL
        ,exception_hint       = PG_EXCEPTION_HINT
        ,exception_context    = PG_EXCEPTION_CONTEXT
    ;

    -- log exception for debugging
    PERFORM public.insert_db_exception(
        exception_error_code
        ,exception_message
        ,exception_detail
        ,exception_hint
        ,exception_context
    );
END;

0 个答案:

没有答案