問題:一部のアプリケーションのユーザーが、重いSQLクエリを含むレポートを実行します。数分後、ユーザーはアプリケーションを終了します(さらに悪いことに、アプリがクラッシュするか、データベースサーバーへの接続が失われます)。ただし、クエリは不要になった場合でも実行を続けます。
だから私はこれらのタイプの状況とそれらを処理する方法について読んだし、 TCPキープアライブ構成 を使用することをお勧めします。
問題は、postgresがこの設定を無視しているように見えることです。 「postgresレベル」と「OSレベル」の両方で元の構成値を下げましたが、運がありませんでした。
Postgresのリロード/再起動を試みましたが、何も機能しませんでした。クエリは最後まで2分を超えて実行され続けます。 missing足りない追加の手順はありますか?
[〜#〜] edit [〜#〜]:pg_stat_activityの結果:
datid | datname | procpid | usesysid | usename | current_query | waiting | xact_start | query_start | backend_start | client_addr | client_port
----------+--------------------------------------------+---------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-------------------------------+-------------------------------+-------------------------------+-------------+-------------
467061608 | libertya_prod_hts_rg1_20161004_qafuncional | 16716 | 16384 | libertya | SELECT dt.signo_issotrx, dt.name as tipodoc, i.ad_org_id, i.ad_client_id, i.documentno, i.c_invoice_id as doc_id, i.c_order_id, i.c_bpartner_id, bp.name as bpartner, i.issotrx, i.dateacct, i.dateinvoiced as datedoc, p.netdays, i.dateinvoiced + (p.netdays::text || ' days'::text)::interval AS duedate, paymenttermduedays(i.c_paymentterm_id, i.dateinvoiced::timestamp with time zone, now()) AS daysdue, i.dateinvoiced + (p.discountdays::text || ' days'::text)::interval AS discountdate, round(i.grandtotal * p.discount * 0.01::numeric, 2) AS discountamt, i.grandtotal AS grandtotalmulticurrency, invoicepaid(i.c_invoice_id, i.c_currency_id, 1) AS paidamtmulticurrency, invoiceopen(i.c_invoice_id, 0, i.c_currency_id,i.c_conversiontype_id) AS openamtmulticurrency, currencybase(i.grandtotal,i.c_currency_id,i.dateinvoiced, i.ad_client_id, i.ad_org_id) AS grandtotal, invoicepaid(i.c_invoice_id, 118, 1) AS paidamt, invoiceopen(i.c_invoice_id, 0,118,i.c_conversiontype_id) AS openamt, i.c_currency_id, i.c_conversiontype_id, i. | f | 2017-04-07 08:06:23.896404-03 | 2017-04-07 08:06:24.513244-03 | 2017-04-07 08:06:02.817331-03 | 127.0.0.1 | 59354
Pg 9.6は idle_in_transaction_session_timeout
:
指定された継続時間(ミリ秒)よりも長い間アイドル状態になっている開いているトランザクションを持つセッションを終了します。これにより、そのセッションで保持されているロックを解放し、接続スロットを再利用できます。また、このトランザクションにのみ表示されるタプルをバキュームすることもできます。この詳細については、セクション24.1を参照してください。
デフォルト値の0は、この機能を無効にします。
簡単にセットでき、
SET idle_in_transaction_session_timeout = '5min';