Some applications may need to minimize latency for read operations, including
particularly the overhead of making an API request to create or refresh a
session. PingingPool is designed for such
applications, which need to configure a background thread to do the work of
keeping the sessions fresh.
from google.cloud.spanner import Client, PingingPool
client = Client()
instance = client.instance(INSTANCE_NAME)
pool = PingingPool(size=10, default_timeout=5, ping_interval=300)
database = instance.database(DATABASE_NAME, pool=pool)
Set up a background thread to ping the pool’s session, keeping them
from becoming stale:
import threading
def background_loop():
while True:
# (Optional) Perform other background tasks here
pool.ping()
background = threading.Thread(target=background_loop, name='ping-pool')
background.daemon = True
background.start()
Lowering latency for mixed read-write operations
Some applications may need to minimize latency for read write operations,
including particularly the overhead of making an API request to create or
refresh a session or to begin a session’s transaction.
TransactionPingingPool is designed for
such applications, which need to configure a background thread to do the work
of keeping the sessions fresh and starting their transactions after use.
from google.cloud.spanner import Client, TransactionPingingPool
client = Client()
instance = client.instance(INSTANCE_NAME)
pool = TransactionPingingPool(size=10, default_timeout=5, ping_interval=300)
database = instance.database(DATABASE_NAME, pool=pool)
Set up a background thread to ping the pool’s session, keeping them
from becoming stale, and ensuring that each session has a new transaction
started before it is used:
import threading
def background_loop():
while True:
# (Optional) Perform other background tasks here
pool.ping()
pool.begin_pending_transactions()
background = threading.Thread(target=background_loop, name='ping-pool')
background.daemon = True
background.start()
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-28 UTC."],[],[],null,["Version latestkeyboard_arrow_down\n\n- [3.57.0 (latest)](/python/docs/reference/spanner/latest/advanced-session-pool-topics)\n- [3.56.0](/python/docs/reference/spanner/3.56.0/advanced-session-pool-topics)\n- [3.55.0](/python/docs/reference/spanner/3.55.0/advanced-session-pool-topics)\n- [3.54.0](/python/docs/reference/spanner/3.54.0/advanced-session-pool-topics)\n- [3.53.0](/python/docs/reference/spanner/3.53.0/advanced-session-pool-topics)\n- [3.52.0](/python/docs/reference/spanner/3.52.0/advanced-session-pool-topics)\n- [3.51.0](/python/docs/reference/spanner/3.51.0/advanced-session-pool-topics)\n- [3.50.1](/python/docs/reference/spanner/3.50.1/advanced-session-pool-topics)\n- [3.46.0](/python/docs/reference/spanner/3.46.0/advanced-session-pool-topics)\n- [3.45.0](/python/docs/reference/spanner/3.45.0/advanced-session-pool-topics)\n- [3.44.0](/python/docs/reference/spanner/3.44.0/advanced-session-pool-topics)\n- [3.43.0](/python/docs/reference/spanner/3.43.0/advanced-session-pool-topics)\n- [3.42.0](/python/docs/reference/spanner/3.42.0/advanced-session-pool-topics)\n- [3.41.0](/python/docs/reference/spanner/3.41.0/advanced-session-pool-topics)\n- [3.40.1](/python/docs/reference/spanner/3.40.1/advanced-session-pool-topics)\n- [3.39.0](/python/docs/reference/spanner/3.39.0/advanced-session-pool-topics)\n- [3.38.0](/python/docs/reference/spanner/3.38.0/advanced-session-pool-topics)\n- [3.37.0](/python/docs/reference/spanner/3.37.0/advanced-session-pool-topics)\n- [3.36.0](/python/docs/reference/spanner/3.36.0/advanced-session-pool-topics)\n- [3.35.1](/python/docs/reference/spanner/3.35.1/advanced-session-pool-topics)\n- [3.34.0](/python/docs/reference/spanner/3.34.0/advanced-session-pool-topics)\n- [3.33.0](/python/docs/reference/spanner/3.33.0/advanced-session-pool-topics)\n- [3.32.0](/python/docs/reference/spanner/3.32.0/advanced-session-pool-topics)\n- [3.31.0](/python/docs/reference/spanner/3.31.0/advanced-session-pool-topics)\n- [3.30.0](/python/docs/reference/spanner/3.30.0/advanced-session-pool-topics)\n- [3.29.0](/python/docs/reference/spanner/3.29.0/advanced-session-pool-topics)\n- [3.28.0](/python/docs/reference/spanner/3.28.0/advanced-session-pool-topics)\n- [3.27.1](/python/docs/reference/spanner/3.27.1/advanced-session-pool-topics)\n- [3.26.0](/python/docs/reference/spanner/3.26.0/advanced-session-pool-topics)\n- [3.25.0](/python/docs/reference/spanner/3.25.0/advanced-session-pool-topics)\n- [3.24.0](/python/docs/reference/spanner/3.24.0/advanced-session-pool-topics)\n- [3.23.0](/python/docs/reference/spanner/3.23.0/advanced-session-pool-topics)\n- [3.22.2](/python/docs/reference/spanner/3.22.2/advanced-session-pool-topics)\n- [3.21.0](/python/docs/reference/spanner/3.21.0/advanced-session-pool-topics)\n- [3.20.0](/python/docs/reference/spanner/3.20.0/advanced-session-pool-topics)\n- [3.19.0](/python/docs/reference/spanner/3.19.0/advanced-session-pool-topics)\n- [3.18.0](/python/docs/reference/spanner/3.18.0/advanced-session-pool-topics)\n- [3.17.0](/python/docs/reference/spanner/3.17.0/advanced-session-pool-topics)\n- [3.16.0](/python/docs/reference/spanner/3.16.0/advanced-session-pool-topics)\n- [3.15.1](/python/docs/reference/spanner/3.15.1/advanced-session-pool-topics)\n- [3.14.1](/python/docs/reference/spanner/3.14.1/advanced-session-pool-topics)\n- [3.13.0](/python/docs/reference/spanner/3.13.0/advanced-session-pool-topics)\n- [3.12.1](/python/docs/reference/spanner/3.12.1/advanced-session-pool-topics)\n- [3.11.1](/python/docs/reference/spanner/3.11.1/advanced-session-pool-topics)\n- [3.10.0](/python/docs/reference/spanner/3.10.0/advanced-session-pool-topics)\n- [3.9.0](/python/docs/reference/spanner/3.9.0/advanced-session-pool-topics)\n- [3.8.0](/python/docs/reference/spanner/3.8.0/advanced-session-pool-topics)\n- [3.7.0](/python/docs/reference/spanner/3.7.0/advanced-session-pool-topics)\n- [3.6.0](/python/docs/reference/spanner/3.6.0/advanced-session-pool-topics)\n- [3.5.0](/python/docs/reference/spanner/3.5.0/advanced-session-pool-topics)\n- [3.4.0](/python/docs/reference/spanner/3.4.0/advanced-session-pool-topics)\n- [3.3.0](/python/docs/reference/spanner/3.3.0/advanced-session-pool-topics)\n- [3.2.0](/python/docs/reference/spanner/3.2.0/advanced-session-pool-topics)\n- [3.1.0](/python/docs/reference/spanner/3.1.0/advanced-session-pool-topics)\n- [3.0.0](/python/docs/reference/spanner/3.0.0/advanced-session-pool-topics)\n- [2.1.1](/python/docs/reference/spanner/2.1.1/advanced-session-pool-topics)\n- [2.0.0](/python/docs/reference/spanner/2.0.0/advanced-session-pool-topics)\n- [1.19.3](/python/docs/reference/spanner/1.19.3/advanced-session-pool-topics)\n- [1.18.0](/python/docs/reference/spanner/1.18.0/advanced-session-pool-topics)\n- [1.17.1](/python/docs/reference/spanner/1.17.1/advanced-session-pool-topics)\n- [1.16.0](/python/docs/reference/spanner/1.16.0/advanced-session-pool-topics)\n- [1.15.1](/python/docs/reference/spanner/1.15.1/advanced-session-pool-topics)\n- [1.14.0](/python/docs/reference/spanner/1.14.0/advanced-session-pool-topics)\n- [1.13.0](/python/docs/reference/spanner/1.13.0/advanced-session-pool-topics)\n- [1.12.0](/python/docs/reference/spanner/1.12.0/advanced-session-pool-topics)\n- [1.11.0](/python/docs/reference/spanner/1.11.0/advanced-session-pool-topics)\n- [1.10.0](/python/docs/reference/spanner/1.10.0/advanced-session-pool-topics) \n\nAdvanced Session Pool Topics\n============================\n\nCustom Session Pool Implementations\n-----------------------------------\n\nYou can supply your own pool implementation, which must satisfy the\ncontract laid out in\n[`AbstractSessionPool`](/python/docs/reference/spanner/latest/spanner_v1/session#google.cloud.spanner_v1.pool.AbstractSessionPool): \n\n from google.cloud.spanner import https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.pool.AbstractSessionPool.html\n\n class MyCustomPool(AbstractSessionPool):\n\n def __init__(self, custom_param):\n super(MyCustomPool, self).__init__()\n self.custom_param = custom_param\n\n def bind(self, database):\n ...\n\n def get(self, read_only=False):\n ...\n\n def put(self, session, discard_if_full=True):\n ...\n\n pool = MyCustomPool(custom_param=42)\n database = instance.database(DATABASE_NAME, pool=pool)\n\nLowering latency for read / query operations\n--------------------------------------------\n\nSome applications may need to minimize latency for read operations, including\nparticularly the overhead of making an API request to create or refresh a\nsession. [`PingingPool`](/python/docs/reference/spanner/latest/spanner_v1/session#google.cloud.spanner_v1.pool.PingingPool) is designed for such\napplications, which need to configure a background thread to do the work of\nkeeping the sessions fresh.\n\nCreate an instance of [`PingingPool`](/python/docs/reference/spanner/latest/spanner_v1/session#google.cloud.spanner_v1.pool.PingingPool): \n\n from google.cloud.spanner import https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.client.Client.html, https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.pool.PingingPool.html\n\n client = Client()\n instance = https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.client.html.https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.client.Client.html#google_cloud_spanner_v1_client_Client_instance(INSTANCE_NAME)\n pool = PingingPool(size=10, default_timeout=5, ping_interval=300)\n database = instance.database(DATABASE_NAME, pool=pool)\n\nSet up a background thread to ping the pool's session, keeping them\nfrom becoming stale: \n\n import threading\n\n\n def background_loop():\n while True:\n # (Optional) Perform other background tasks here\n pool.ping()\n\n\n background = threading.Thread(target=background_loop, name='ping-pool')\n background.daemon = True\n background.start()\n\nLowering latency for mixed read-write operations\n------------------------------------------------\n\nSome applications may need to minimize latency for read write operations,\nincluding particularly the overhead of making an API request to create or\nrefresh a session or to begin a session's transaction.\n[`TransactionPingingPool`](/python/docs/reference/spanner/latest/spanner_v1/session#google.cloud.spanner_v1.pool.TransactionPingingPool) is designed for\nsuch applications, which need to configure a background thread to do the work\nof keeping the sessions fresh and starting their transactions after use.\n\nCreate an instance of\n[`TransactionPingingPool`](/python/docs/reference/spanner/latest/spanner_v1/session#google.cloud.spanner_v1.pool.TransactionPingingPool): \n\n from google.cloud.spanner import https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.client.Client.html, https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.pool.TransactionPingingPool.html\n\n client = Client()\n instance = https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.client.html.https://cloud.google.com/python/docs/reference/spanner/latest/google.cloud.spanner_v1.client.Client.html#google_cloud_spanner_v1_client_Client_instance(INSTANCE_NAME)\n pool = TransactionPingingPool(size=10, default_timeout=5, ping_interval=300)\n database = instance.database(DATABASE_NAME, pool=pool)\n\nSet up a background thread to ping the pool's session, keeping them\nfrom becoming stale, and ensuring that each session has a new transaction\nstarted before it is used: \n\n import threading\n\n\n def background_loop():\n while True:\n # (Optional) Perform other background tasks here\n pool.ping()\n pool.begin_pending_transactions()\n\n\n background = threading.Thread(target=background_loop, name='ping-pool')\n background.daemon = True\n background.start()"]]