<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Chapter 45\. 后臺工作進程 PostgreSQL可以擴展在分立的進程中運行用戶提供的代碼。 命令`postgres`啟動, 停止和監控這些進程,允許它們的生命周期與服務器狀態緊密關聯。這些進程可以選擇連接 PostgreSQL的共享內存并與數據庫內部連接;它們也可以串行地運行多個事務,就像 常規的客戶端連接的服務器進程。另外,通過鏈接到libpq,它們可以連接到服務器并 且和常規的客戶端應用表現一樣。 | **Warning** | |:--- | | 使用后臺工作進程有著相當大的牢固和安全風險。這是因為它們是用C語言寫的,有著不受限制的數據 訪問方式。樂于使用包含后臺工作進程的模塊的管理員們應當極度地當心。只有仔細審計過的模塊才 應該被允許運行后臺工作進程。 | 只有`shared_preload_libraries`里列出的模塊能夠運行后臺工作進程。想要運行后臺工作 程序的模塊需要通過從它的`_PG_init()`調用 `RegisterBackgroundWorker(`BackgroundWorker *worker`)`來注冊 這個程序。`BackgroundWorker`結構是這樣定義的: ``` typedef void (*bgworker_main_type)(void *main_arg); typedef struct BackgroundWorker { char bgw_name[BGW_MAXLEN]; int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ bgworker_main_type bgw_main; Datum bgw_main_arg; } BackgroundWorker; ``` `bgw_name`是用于日志消息,進程列表和類似環境的一個字符串。 `bgw_flags`是一個按位與的比特掩碼,顯示模塊想要的容量。 可能的值有 `BGWORKER_SHMEM_ACCESS` (要求訪問共享內存)和 `BGWORKER_BACKEND_DATABASE_CONNECTION`(要求能夠建立一個數據庫連接,通 過這個連接伺候可以運行事務和查詢)。一個使用 `BGWORKER_BACKEND_DATABASE_CONNECTION`連接數據庫的后臺工作程序還必須用 `BGWORKER_SHMEM_ACCESS`聯接共享內存,否則程序的啟動會失敗。 `bgw_start_time`是某種服務器狀態,在此期間應當由 `postgres`啟動進程;它可以是下面幾個值之一: `BgWorkerStart_PostmasterStart`(`postgres`完成自身初始化后就立即啟動; 請求此種啟動方式的進程不能進行數據庫連接),`BgWorkerStart_ConsistentState`(只 要在一個熱備份系統中達到了一致狀態就啟動,允許進程連接到數據庫并運行只讀查詢),以及 `BgWorkerStart_RecoveryFinished`(只要系統進入普通讀寫狀態就啟動)。注意在非熱備 份系統的服務器中后兩個值是作用相當的。注意此設置只在進程將啟動時顯示;進入不同狀態時進程不 停。 `bgw_restart_time`是以秒記的時間間隔。一旦進程崩潰, `postgres`應當在重啟進程前等待這一段時間。它可以是任何的正值,或者 是`BGW_NEVER_RESTART`以表明在進程崩潰時不重啟進程。 `bgw_main`是當進程被啟動時指向所運行函數的一個指針。該函數必須使 用`void *`類型的單一參數并返回`void`類型的值。 `bgw_main_arg`將作為唯一參數被傳遞給此函數。注意全局變量 `MyBgworkerEntry`指向進程注冊時傳遞的 `BackgroundWorker`結構的一份拷貝。 進程一旦運行,就可以通過調用 `BackgroundWorkerInitializeConnection(`char *dbname`, `char *username`)` 連接到一個數據庫。這樣進程可以使用`SPI`接口運行事務和查詢。如果 `dbname`值為NULL,會話不被連接到任何特定數據庫,但是可以獲取共享的目錄。如果 `username`值為NULL,進程會以`initdb`運行時創建的超級用戶身份來運行。 每個后臺進程只能調用一次BackgroundWorkerInitializeConnection,它不能切換數據庫。 Signals are initially blocked when control reaches the 控制`bgw_main`函數開始鎖定信號,并且必須由此函數解鎖;這樣在必要時可以允許 進程定制它的信號處理程序。通過調用`BackgroundWorkerUnblockSignals`可以在新進程 中為信號解鎖,通過調用`BackgroundWorkerBlockSignals`可以加鎖。 后臺工作程序是被預期連續運行的;如果它們干凈的退出了,`postgres`會立即重啟它們。 當它們無事可做時,考慮進入可中斷的睡眠;通過調用`WaitLatch()`可以實現這 一點。調用該函數時確定`WL_POSTMASTER_DEATH`標志被設置,并且在`postgres` 自身終止的緊急情況下為提示的退出驗證返回碼。 `worker_spi` contrib模塊包含一個展示一些有用技術的范例。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看