首頁  >  文章  >  後端開發  >  Python MySQL資料庫中pymysqlpool是如何使用的?

Python MySQL資料庫中pymysqlpool是如何使用的?

零下一度
零下一度原創
2017-07-09 11:57:263897瀏覽

這篇文章主要跟大家介紹了關於Python MySQL資料庫連接池元件pymysqlpool的相關資料,文中透過範例程式碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

引言

pymysqlpool (本地下載)是資料庫工具包中新成員,目的是能提供一個實用的資料庫連接池中間件,從而避免在應用中頻繁地建立和釋放資料庫連接資源。

功能

  • 連線池本身是線程安全的,可在多線程環境下使用,不必擔心連接資源被多個線程共享的問題;

  • 提供盡可能緊湊的接口用於數據庫操作

  • 連接池的管理位於套件內完成,用戶端可以透過介面取得池中的連線資源(傳回#​​##pymysql.Connection);

  • 將最大程度地與dataobj 等相容,便於使用;

  • 連接池本身俱備動態增加連接數的功能,即max_pool_size 和step_size 會用於控制每次增加的連接數和最大連接數;

  • 連接池最大連接數也動態增加,需要開啟enable_auto_resize 開關,此後當任何一次連接獲取逾時發生,均記為一次懲罰,並將max_pool_size 擴大一定倍數。


基本工作流程

#注意,當多執行緒同時要求時,若池中沒有可用的連接對象,則需要排隊等待

  • 初始化後優先建立step_size 個連接對象,放在連接池中;

  • 客戶端請求連接對象,連接池會從中挑選最近沒使用的連接對象返回(同時會檢查連接是否正常);

  • 客戶端使用連接對象,執行對應操作後,呼叫介面會返回連接物件;

  • 連接池回收連接對象,並將其加入池中的佇列,供其它請求使用。



|--------|        |--------------|
|  | <==borrow connection object== | Pool manager |
| Client |        |    |
|  | ==return connection object==> | FIFO queue |
|--------|        |--------------|

#參數配置

  • ##pool_name: 連線池的名稱,多種連線參數對應多個不同的連線池對象,多

    單例模式

    ;
  • #host: 資料庫位址
  • user: 資料庫伺服器使用者名稱
  • #password: 使用者密碼
  • database: 默認選擇的資料庫

  • port: 資料庫伺服器的連接埠

  • #charset:

    字元集

    ,預設為'utf8'
  • use_dict_cursor: 使用字典格式或元組傳回資料;
  • max_pool_size: 連接池優先最大連線數;
  • #step_size: 連線池動態增加連線數大小;
  • enable_auto_resize: 是否動態擴充連線池,即超過max_pool_size 時,自動擴充max_pool_size;
  • #pool_resize_boundary: 此配置為連接池最終可以增加的上上限大小,即時擴充也不可超過該值;
  • ##auto_resize_scale: 自動擴充max_pool_size 的增益,預設為1.5 倍擴充;

    wait_timeout: 在排隊等候連線物件時,最多等待多久,連線池嘗試自動擴充目前連線數;






kwargs: 其他設定參數將會在建立連線物件時傳遞給

pymysql.Connection


使用範例
  • 1、使用cursor 上下文管理器(捷徑,但每次取得都會申請連接對象,多次呼叫效率不高):

###
from pymysqlpool import ConnectionPool
config = {
 'pool_name': 'test',
 'host': 'localhost',
 'port': 3306,
 'user': 'root',
 'password': 'root',
 'database': 'test'
}
def connection_pool():
 # Return a connection pool instance
 pool = ConnectionPool(**config)
 pool.connect()
 return pool
# 直接访问并获取一个 cursor 对象,自动 commit 模式会在这种方式下启用
with connection_pool().cursor() as cursor:
 print('Truncate table user')
 cursor.execute('TRUNCATE user')
 print('Insert one record')
 result = cursor.execute('INSERT INTO user (name, age) VALUES (%s, %s)', ('Jerry', 20))
 print(result, cursor.lastrowid)
 print('Insert multiple records')
 users = [(name, age) for name in ['Jacky', 'Mary', 'Micheal'] for age in range(10, 15)]
 result = cursor.executemany('INSERT INTO user (name, age) VALUES (%s, %s)', users)
 print(result)
 print('View items in table user')
 cursor.execute('SELECT * FROM user')
 for user in cursor:
  print(user)
 print('Update the name of one user in the table')
 cursor.execute('UPDATE user SET name="Chris", age=29 WHERE id = 16')
 cursor.execute('SELECT * FROM user ORDER BY id DESC LIMIT 1')
 print(cursor.fetchone())
 print('Delete the last record')
 cursor.execute('DELETE FROM user WHERE id = 16')
###2、使用connection 上下文管理器:###############
import pandas as pd
from pymysqlpool import ConnectionPool
config = {
 'pool_name': 'test',
 'host': 'localhost',
 'port': 3306,
 'user': 'root',
 'password': 'root',
 'database': 'test'
}
def connection_pool():
 # Return a connection pool instance
 pool = ConnectionPool(**config)
 pool.connect()
 return pool
with connection_pool().connection() as conn:
 pd.read_sql('SELECT * FROM user', conn)
# 或者
connection = connection_pool().borrow_connection()
pd.read_sql('SELECT * FROM user', conn)
connection_pool().return_connection(connection)
###更多測試請移步test_example.py。 ############依賴######################pymysql:將依賴該工具包完成資料庫的連接等操作;## ##########pandas:測試時使用了pandas。 ##########

以上是Python MySQL資料庫中pymysqlpool是如何使用的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn