自己投資としてチャレンジしている内容を Blog で公開しています。今回は python を使った SQL Server 接続時の「エラーハンドリング」と「リトライ」方法について紹介します。
Summary
▼1. 接続時のエラーハンドリング & リトライ の必要性について
クラウドサービスに接続する際、ネットワークの瞬断の影響を受けることはよくあるため、接続時にエラーハンドリングをし、インターバルの間隔を入れてリトライすることは必須です。
今回は Ubuntu にインストールされた SQL Server を使って、SQL Server 接続時、どのようにエラーハンドリングし、インターバルの間隔を入れてリトライするのか説明します。
▼2. 事前準備
以前本 blog で紹介したコードに、エラーハンドリング及び、リトライ設定を追加します。
Python – SQL Server on Ubuntu に接続する方法 No.92
▼3. 接続時のエラーハンドリング & リトライ の実装
3-1. エラーハンドリング & リトライを行う python コードを作成
While を使って、エラーになった場合 15 秒のインターバルで 3 回のリトライを実施しています。エラーを発生させるため、SQL Server のホスト名を localhost ではなく、localhost1 に変更して接続しています。
# runquery_retry.py
import pyodbc
import time
import datetime
server = 'localhost1'
database = 'testdb'
username = 'sa'
password = 'yourpassword
driver= '{ODBC Driver 17 for SQL Server}'
success = False
retryc = 0
max_retries = 3
while not success and retryc < max_retries:
try:
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+',1433;DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM testdb.dbo.sampletable")
row = cursor.fetchone()
while row:
print (str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()
success = True
except pyodbc.Error as ex:
retryc += 1
print("Current Timestamps:" + str(datetime.datetime.now()) + "retry count: " + str(retryc))
print("==========================")
print("Error: " + str(ex))
print("==========================")
time.sleep(15)
3-2. 実行結果
既定の 30 秒のタイムアウトに加え、15 秒のリトライインターバルを入れているため、リトライは 45 秒後となっています。
Current Timestamps:2022-12-05 10:42:06.523664retry count: 1 ========================== Error: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)') ========================== Current Timestamps:2022-12-05 10:42:51.536645retry count: 2 ========================== Error: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)') ========================== Current Timestamps:2022-12-05 10:43:36.552769retry count: 3 ========================== Error: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)') ==========================
▼4. 参考情報
- Python in Visual Studio Code
- Python – SQL Server on Ubuntu に接続する方法 No.92
- Java – SQL Server on Linux に接続時の「エラーハンドリング」 &「リトライ」方法 No.6
以上です。参考になりましたら幸いです。