Иногда postgres не возвращает записи при удаленном запросе из JDBC-клиента - PullRequest
0 голосов
/ 17 декабря 2018
  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 () иногда возвращает пустой набор результатов.Как 4 из 10 попыток executeQuery () за день возвращают пустой набор результатов.

Вещи, которые я опробовал:

  • Убедитесь, что запрос всегда возвращает некоторые записи.Должно вернуть 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...