Advanced Session Pool Topics

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

See more code actions.
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()