2015-03-15 3 views
0

Я использую подключение jdbc к базе данных и получаю несколько строк как часть ResultSet. Я запускаю sql из ResultSet и как-то заканчиваю только прохождение первой строки. Например: query1 - это мой результирующий набор, который генерирует две строки pid. Затем я использую query2 для завершения pid. Я хотел бы, чтобы query2 проходил все строки в query1 и выполнял команду terminate один за другим. Еще один момент, который следует отметить, заключается в том, что query1 может иметь более 2 строк в зависимости от набора результатов. Ниже приведен код, который я использую, и любая помощь приветствуется. BTW Я попытался использовать вложенный цикл while, и это не повторяет запрос2, как я вижу в журналах базы данных.ResultSet несколько строк

Statement stmt = connection.createStatement(); 

                ResultSet res = stmt.executeQuery(
                  "SELECT \n" + 
                    "kl.pid as blocking_pid,\n" + 
                    "ka.usename as blocking_user,\n" + 
                    "ka.query as blocking_query,\n" + 
                    "bl.pid as blocked_pid,\n" + 
                    "a.usename as blocked_user, \n" + 
                    "a.query as blocked_query, \n" + 
                    "to_char(age(now(), a.query_start),'HH24h:MIm:SSs') as age\n" + 
                    "FROM pg_catalog.pg_locks bl\n" + 
                    "JOIN pg_catalog.pg_stat_activity a \n" + 
                    "ON bl.pid = a.pid\n" + 
                    "JOIN pg_catalog.pg_locks kl \n" + 
                    "ON bl.locktype = kl.locktype\n" + 
                    "and bl.database is not distinct from kl.database\n" + 
                    "and bl.relation is not distinct from kl.relation\n" + 
                    "and bl.page is not distinct from kl.page\n" + 
                    "and bl.tuple is not distinct from kl.tuple\n" + 
                    "and bl.virtualxid is not distinct from kl.virtualxid\n" + 
                    "and bl.transactionid is not distinct from kl.transactionid\n" + 
                    "and bl.classid is not distinct from kl.classid\n" + 
                    "and bl.objid is not distinct from kl.objid\n" + 
                    "and bl.objsubid is not distinct from kl.objsubid\n" + 
                    "and bl.pid <> kl.pid \n" + 
                    "JOIN pg_catalog.pg_stat_activity ka \n" + 
                    "ON kl.pid = ka.pid\n" + 
                    "WHERE kl.granted and not bl.granted\n" + 
                    "ORDER BY a.query_start"); 

                //Get all the blocking pids and run pg_terminate_backend 
                while (res.next()) { 
                 String pid = res.getString("blocking_pid"); 


                  stmt.execute("SELECT pg_terminate_backend(" + String.valueOf(pid) + ")"); 

                 } 


                stmt.close(); 
                connection.close(); 

ответ

0

Я понял это. на всякий случай, если кто-то сталкивается с той же/подобной проблемой. Я повторно использовал соединение jdbc в query2 с той же переменной. Как только я использовал отдельный вызов jdbc в query2, он работал.

Смежные вопросы