psycopg2 如何驗證鏈接是否有效

psycopg2 中,驗證數據庫連接是否有效(即連接是否仍然活躍)可以通過以下幾種方法實現:


1. 使用 conn.closed 屬性

psycopg2 的連接對象有一個 closed 屬性,可以檢查連接是否已關閉:

import psycopg2conn = psycopg2.connect(host="localhost",database="testdb",user="postgres",password="your_password"
)# 檢查連接是否關閉
if conn.closed:print("連接已關閉")
else:print("連接仍然有效")conn.close()

問題closed 只能檢測連接是否被顯式關閉,無法檢測連接是否因網絡問題或數據庫超時而失效


2. 執行簡單查詢(推薦)

最可靠的方法是 執行一個簡單的 SQL 查詢(如 SELECT 1),如果查詢失敗,則說明連接已斷開:

def is_connection_valid(conn):try:cursor = conn.cursor()cursor.execute("SELECT 1")  # 執行簡單查詢cursor.fetchone()  # 獲取結果(可選)cursor.close()return True  # 查詢成功,連接有效except (psycopg2.Error, psycopg2.OperationalError):return False  # 查詢失敗,連接已斷開# 使用示例
if is_connection_valid(conn):print("連接有效")
else:print("連接已斷開,需要重新連接")conn = psycopg2.connect(...)  # 重新建立連接

優點

  • 能檢測 網絡中斷、數據庫超時、連接被服務器關閉 等情況。
  • 適用于連接池(如 ThreadedConnectionPool)中的連接健康檢查。

3. 使用 conn.poll() 方法(適用于異步檢查)

psycopg2 提供了 conn.poll() 方法,可以檢查連接狀態:

def is_connection_valid(conn):try:conn.poll()  # 檢查連接狀態return Trueexcept psycopg2.OperationalError:return False

說明

  • poll() 會返回連接狀態(如 psycopg2.extensions.POLL_OKPOLL_ERROR 等)。
  • 但通常直接捕獲異常更簡單。

4. 在連接池中驗證連接

如果使用 ThreadedConnectionPool,可以在 getconn() 后驗證連接是否有效,如果無效則重新創建:

from psycopg2 import OperationalErrordef get_valid_connection(pool):conn = pool.getconn()if not is_connection_valid(conn):  # 使用前面的方法檢查conn.close()  # 關閉無效連接conn = pool.getconn()  # 嘗試獲取新連接return conn# 使用示例
conn = get_valid_connection(pool)

5. 設置 keepalives 參數(預防連接斷開)

在連接字符串中設置 keepalives 參數,讓 PostgreSQL 服務器定期發送心跳包,防止連接因空閑超時而斷開:

conn = psycopg2.connect(host="localhost",database="testdb",user="postgres",password="your_password",keepalives=1,          # 啟用 TCP keepalivekeepalives_idle=30,    # 30秒空閑后發送心跳keepalives_interval=10, # 每10秒發送一次心跳keepalives_count=5     # 最多嘗試5次
)

適用場景

  • 適用于長時間空閑的連接,減少因網絡問題導致的連接斷開。

總結

方法適用場景備注
conn.closed僅檢查連接是否被顯式關閉無法檢測網絡問題
執行簡單查詢(SELECT 1檢測連接是否真正可用推薦方法
conn.poll()異步檢查連接狀態較少使用
連接池 + 驗證ThreadedConnectionPool 中使用確保獲取的連接有效
keepalives 參數預防連接因空閑超時斷開適用于長時間空閑連接

最佳實踐

  1. 在獲取連接后,先執行 SELECT 1 驗證連接是否有效
  2. 如果連接無效,關閉并重新獲取連接(避免連接池返回壞連接)。
  3. 設置 keepalives 參數,減少空閑連接被斷開的情況。

這樣能確保你的應用在連接失效時自動恢復,提高穩定性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918822.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據科學與計算-電商雙11美妝數據分析

一、項目背景:雙 11 美妝數據的價值所在 每年的 “雙 11” 購物節都是電商行業的盛宴,而美妝品類作為消費熱門領域,蘊含著豐富的用戶行為與市場趨勢信息。該項目聚焦雙 11 期間的美妝電商數據,旨在通過數據分析揭示以下核心問題&…

簡單了解MongoDB數據存儲

官方文檔:MongoDB中文手冊|官方文檔中文版 | MongoDB-CN-Manual 什么是MongoDB? MongnDB是一個分布式文件存儲數據庫(或叫文檔數據庫),是一個介于 關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數…

web網站開發,在線%射擊比賽成績管理%系統開發demo,基于html,css,jquery,python,django,model,orm,mysql數據庫

經驗心得 這個也是crud業務單子,第二個聊點其他的,從最早的無分層開發,到三層開發,工廠,各種接口,再到后面多層,代碼無痕aop,各種框架等,都是在方便我們快速打架一個程序…

[QtADS]解析ads.pro

本文來源 : 騰訊元寶subdirs : 子目錄TEMPLATE subdirs的作用????核心功能??:聲明當前項目為“多項目管理”模式。Qt 的構建系統(qmake)會遍歷 SUBDIRS中列出的子目錄,在每個子目錄中尋找 .pro文件并遞歸構建。…

三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,手電筒置灰,無法打開,提提示相機正在使用

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,點擊手電筒,手電筒置灰,無法打開,提提示相機正在使用9348353 目錄 一、問題背景 二、:問題分析過程 2.1:基于…

Java Selenium 自動打開瀏覽器保存截圖

// 代碼 public class ScreenshotExample {public static void main(String[] args) {// 1. 設置瀏覽器驅動路徑(根據實際路徑修改)System.setProperty("webdriver.chrome.driver", "D:\\chromedriver-win64\\chromedriver.exe");//…

新商機:為了減少輻射,可以用座機打機房中心再轉手機

某些人痛恨自家附近有基站,說是輻射太大。你不能說人家迷信。一般解決辦法就是拆基站。而我覺得,商機來了。現在座機基本沒人裝了。新商機就是座機。附近沒有基站,又要打電話,怎么辦?裝座機。用座機打電話時&#xff0…

【Java|第十九篇】面向對象九——String類和枚舉類

&#xff08;四&#xff09;面向對象11、String類&#xff08;1&#xff09;概述<1>String是一個類&#xff0c;引用數據類型&#xff0c;用來表示字符串&#xff1b;<2>String是Lang包下的類&#xff0c;使用不需要導包&#xff1b;<3>字符串的值不能變&…

超越相似名稱:Elasticsearch semantic text 如何在簡潔、高效、集成方面超越 OpenSearch semantic 字段

作者&#xff1a;來自 Elastic Mike Pellegrini, Nick Chow 及 Libby Lin 比較 Elasticsearch 語義文本和 OpenSearch 語義字段在簡潔性、可配置性和效率方面的表現。 自己動手體驗向量搜索&#xff0c;使用這個自定進度的 Search AI 實操學習。你現在可以開始免費的云試用&am…

OpenAI發布最新大模型GPT5、本地部署GPT開源模型

OpenAI發布最新大模型GPT5、本地部署GPT開源模型 GPT-5概述 北京時間 2025年8月8日 凌晨1點 OPENAI舉行了1個小時的線上發布會&#xff0c;正式推出了其史上最聰明、最強大的大模型GPT-5。 GPT-5是OpenAI發布的最新一代大型語言模型&#xff0c;它基于Transformer架構&#xff…

容器網絡模式選擇在云服務器多節點部署中的連通性驗證方案

容器網絡模式選擇在云服務器多節點部署中的連通性驗證方案在云計算環境中&#xff0c;容器網絡模式的選擇直接影響著多節點部署的通信效率和安全性。本文將從Docker原生網絡驅動對比入手&#xff0c;深入分析Overlay、Host、Bridge等主流網絡模式在跨主機通信場景下的性能表現&…

電商雙11美妝數據分析

1、數據初步了解2.數據清洗2.1 重復值處理 直接刪除重復值。2.2 缺失值處理通過上面觀察數據發現sale_count,comment_count 存在缺失值,先觀察存在缺失值的行的基本情況存在的缺失值很可能意味著售出的數量為0或者評論的數量為0&#xff0c;所以我們用0來填補缺失值。2.3 數據挖…

Pytest項目_day14(參數化、數據驅動)

parametrize 參數化可以組裝測試數據。在測試前定義好測試數據&#xff0c;并在測試用例中使用 單參數單次循環 我們可以在裝飾器中使用mark.parametrize&#xff0c;來定義參數名和參數值列表 參數名還需要傳給函數參數名需要用字符串來定義&#xff0c;參數值列表需要用可迭代…

Nest.js、Knex.js、Nuxt.js、Next.js 和 Spring Boot的異同相關概念

總述Nest.js、Knex.js、Nuxt.js、Next.js 和 Spring Boot 是分屬不同技術領域的工具&#xff0c;涵蓋前端框架、后端框架、數據庫工具等角色&#xff0c;它們在開發中既有功能交集&#xff0c;也有明確的定位差異。一、相同點服務端參與能力五者均能在服務端發揮作用&#xff1…

第2節 大模型分布式推理架構設計原則

大模型推理系統的設計過程,本質上是在多重約束下尋找最優解的過程。硬件資源的物理限制、場景對性能的剛性要求、系統的可擴展性需求,共同構成了設計的邊界條件。明確這些約束的具體表現形式,理解性能指標之間的權衡邏輯,確立架構設計的核心原則,是構建高效分布式推理系統…

快速部署一個鑒黃服務

1.安裝依賴pip install opennsfw22.代碼實現import opennsfw2 as n2# 將自動下載預訓練模型 open_nsfw_weights.h5 到 C:\Users\Administrator\.opennsfw2\weights # pip install opennsfw2# 單張預測 image_path 1.jpg nsfw_probability n2.predict_image(image_path) print…

Camera open failed

前言 由前面的幾篇博客可以知道&#xff0c;openCamera&#xff0c;createCaptureSession&#xff0c;setRepeatingRequest&#xff0c;capture是非常重要的過程&#xff0c;如果其中一個環節出了問題時該如何分析呢&#xff0c;這里我們首先從打開相機流程時&#xff0c;打開…

醫美產業科技成果展陳中心:連接微觀肌膚世界與前沿科技的橋梁

作為一名深耕展陳設計施工的從業者&#xff0c;當接到醫美產業科技成果展陳中心的項目時&#xff0c;我深知這不是簡單的 “技術堆砌”&#xff0c;而是要在 “科學嚴謹性” 與 “美學體驗感” 之間找到平衡 —— 讓參觀者既能看懂激光設備的波長原理&#xff0c;又能感知膠原蛋…

在 Android 系統中清理應用數據但保留應用程序本身,可以通過以下幾種方法實現

在 Android 系統中清理應用數據但保留應用程序本身&#xff0c;可以通過以下幾種方法實現在 Android 系統中清理應用數據但保留應用程序本身&#xff0c;可以通過以下幾種方法實現&#xff1a;方法 1: 使用 Android 設置&#xff08;無需 root&#xff09;方法 2: 使用 ADB 命令…

Linux中tty與8250-uart的虐戀(包括雙中斷發送接收機制)

串口通用驅動文件在哪里&#xff1f; drivers/tty/serial/哪一個是正確的compatible&#xff1f; arch/arm64/boot/dts/rockchip/rk3568.dtsi uart3: serialfe670000 {compatible "rockchip,rk3568-uart", "snps,dw-apb-uart";reg <0x0 0xfe670000 0…