Advanced Session Pool Topics

Custom Session Pool Implementations

You can supply your own pool implementation, which must satisfy the contract laid out in AbstractSessionPool:

from google.cloud.spanner import AbstractSessionPool
class MyCustomPool(AbstractSessionPool):
 def __init__(self, custom_param):
 super(MyCustomPool, self).__init__()
 self.custom_param = custom_param
 def bind(self, database):
 ...
 def get(self, read_only=False):
 ...
 def put(self, session, discard_if_full=True):
 ...
pool = MyCustomPool(custom_param=42)
database = instance.database(DATABASE_NAME, pool=pool)

Lowering latency for read / query operations

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.

Create an instance of PingingPool:

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.

Create an instance of TransactionPingingPool:

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()

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2025年10月30日 UTC.