Documentation and sample updates for clarity and to note the fact that

connection pools now always enable threading.
This commit is contained in:
Anthony Tuininga 2021-04-23 14:21:45 -06:00
parent fa36066875
commit ab6e6f06ef
8 changed files with 27 additions and 43 deletions

View File

@ -18,7 +18,8 @@ if applicable. The most recent deprecations are listed first.
- Comments - Comments
* - `encoding` parameter to :meth:`cx_Oracle.connect()` * - `encoding` parameter to :meth:`cx_Oracle.connect()`
- No longer needed as the use of encodings other than UTF-8 is - No longer needed as the use of encodings other than UTF-8 is
deprecated. deprecated. Encoding is handled internally between cx_Oracle and Oracle
Database.
* - `nencoding` parameter to :meth:`cx_Oracle.connect()` * - `nencoding` parameter to :meth:`cx_Oracle.connect()`
- No longer needed as the use of encodings other than UTF-8 is - No longer needed as the use of encodings other than UTF-8 is
deprecated. deprecated.
@ -30,13 +31,15 @@ if applicable. The most recent deprecations are listed first.
deprecated. deprecated.
* - Connection.maxBytesPerCharacter * - Connection.maxBytesPerCharacter
- No longer needed as the use of encodings other than UTF-8 is - No longer needed as the use of encodings other than UTF-8 is
deprecated. deprecated. The constant value 4 can be used instead.
* - positional parmeters to :meth:`cx_Oracle.connect()` * - Positional parameters to :meth:`cx_Oracle.connect()`
- Replace with keyword parameters in order to comply with the Python - Replace with keyword parameters in order to comply with the Python
database API. database API.
* - positional parmeters to :meth:`cx_Oracle.SessionPool()` * - positional parameters to :meth:`cx_Oracle.SessionPool()`
- Replace with keyword parameters in order to comply with the Python - Replace with keyword parameters in order to comply with the Python
database API. database API.
* - `threaded` parameter to :meth:`cx_Oracle.SessionPool()`
- The value of this parameter is ignored. Threading is now always used.
* - `waitTimeout` parameter to :meth:`cx_Oracle.SessionPool()` * - `waitTimeout` parameter to :meth:`cx_Oracle.SessionPool()`
- Replace with parameter name `wait_timeout` - Replace with parameter name `wait_timeout`
* - `maxLifetimeSession` parameter to :meth:`cx_Oracle.SessionPool()` * - `maxLifetimeSession` parameter to :meth:`cx_Oracle.SessionPool()`
@ -46,7 +49,7 @@ if applicable. The most recent deprecations are listed first.
* - `maxSessionsPerShard` parameter to :meth:`cx_Oracle.SessionPool()` * - `maxSessionsPerShard` parameter to :meth:`cx_Oracle.SessionPool()`
- Replace with parameter name `max_sessions_per_shard` - Replace with parameter name `max_sessions_per_shard`
* - `payloadType` parameter to :meth:`Connection.queue()` * - `payloadType` parameter to :meth:`Connection.queue()`
- Replace with parameter name `payload_type` if using keyword parmeters. - Replace with parameter name `payload_type` if using keyword parameters.
* - `ipAddress` parameter to :meth:`Connection.subscribe()` * - `ipAddress` parameter to :meth:`Connection.subscribe()`
- Replace with parameter name `ip_address` - Replace with parameter name `ip_address`
* - `groupingClass` parameter to :meth:`Connection.subscribe()` * - `groupingClass` parameter to :meth:`Connection.subscribe()`

View File

@ -78,8 +78,7 @@ Module Interface
The threaded parameter is expected to be a boolean expression which The threaded parameter is expected to be a boolean expression which
indicates whether or not Oracle should wrap accesses to connections with a indicates whether or not Oracle should wrap accesses to connections with a
mutex. Doing so in single threaded applications imposes a performance mutex.
penalty of about 10-15% which is why the default is False.
The events parameter is expected to be a boolean expression which indicates The events parameter is expected to be a boolean expression which indicates
whether or not to initialize Oracle in events mode. This is required for whether or not to initialize Oracle in events mode. This is required for
@ -250,11 +249,6 @@ Module Interface
:meth:`~SessionPool.acquire()` will create connection objects of that type, :meth:`~SessionPool.acquire()` will create connection objects of that type,
rather than the base type defined at the module level. rather than the base type defined at the module level.
The threaded parameter is expected to be a boolean expression which
indicates whether Oracle should wrap accesses to connections with a mutex.
Doing so in single threaded applications imposes a performance penalty of
about 10-15% which is why the default is False.
The getmode parameter indicates whether or not future The getmode parameter indicates whether or not future
:func:`SessionPool.acquire()` calls will wait for available connections. It :func:`SessionPool.acquire()` calls will wait for available connections. It
can be one of the :ref:`Session Pool Get Modes <sesspoolmodes>` values. can be one of the :ref:`Session Pool Get Modes <sesspoolmodes>` values.
@ -352,7 +346,8 @@ Module Interface
parameter `sessionCallback` was renamed to `session_callback` and the parameter `sessionCallback` was renamed to `session_callback` and the
parameter `maxSessionsPerShard` was renamed to parameter `maxSessionsPerShard` was renamed to
`max_sessions_per_shard`. The old names will continue to work as `max_sessions_per_shard`. The old names will continue to work as
keyword parameters for a period of time. keyword parameters for a period of time. The `threaded` parameter value
is ignored and threading is always enabled.
.. function:: Time(hour, minute, second) .. function:: Time(hour, minute, second)
@ -429,7 +424,7 @@ General
Note that in order to make use of multiple threads in a program which Note that in order to make use of multiple threads in a program which
intends to connect and disconnect in different threads, the threaded intends to connect and disconnect in different threads, the threaded
parameter to :meth:`connect()` or :meth:`SessionPool()` must be true. parameter to :meth:`connect()` must be `True`.
.. data:: version .. data:: version

View File

@ -15,7 +15,7 @@ Version 8.2 (TBD)
pools. This significantly improves the performance of methods pools. This significantly improves the performance of methods
:meth:`SodaDatabase.createCollection()` (when not specifying a value for :meth:`SodaDatabase.createCollection()` (when not specifying a value for
the metadata parameter) and :meth:`SodaDatabase.openCollection()`. Caching the metadata parameter) and :meth:`SodaDatabase.openCollection()`. Caching
is available when using Oracle Client version 19.11 and higher is available when using Oracle Client version 19.11 and higher.
#) Added support for supplying hints to SODA operations. A new non-terminal #) Added support for supplying hints to SODA operations. A new non-terminal
method :meth:`~SodaOperation.hint()` was added and a `hint` parameter was method :meth:`~SodaOperation.hint()` was added and a `hint` parameter was
added to the methods :meth:`SodaCollection.insertOneAndGet()`, added to the methods :meth:`SodaCollection.insertOneAndGet()`,
@ -26,20 +26,20 @@ Version 8.2 (TBD)
:meth:`cx_Oracle.SessionPool()` in order to permit specifying the size of :meth:`cx_Oracle.SessionPool()` in order to permit specifying the size of
the statement cache during the creation of pools and standalone the statement cache during the creation of pools and standalone
connections. connections.
#) Threaded mode is now always enabled when creating connection pools with
:meth:`cx_Oracle.SessionPool()`. Any `threaded` parameter value is ignored.
#) Eliminated a memory leak when calling :meth:`SodaOperation.filter()` with a #) Eliminated a memory leak when calling :meth:`SodaOperation.filter()` with a
dictionary. dictionary.
#) The distributed transaction handle assosciated with the connection is now #) The distributed transaction handle assosciated with the connection is now
cleared on commit or rollback (`issue 530 cleared on commit or rollback (`issue 530
<https://github.com/oracle/python-cx_Oracle/issues/530>`__). <https://github.com/oracle/python-cx_Oracle/issues/530>`__).
#) Stop passing unsupported flags to dpiSodaDocCursor_getNext().
#) Added check to ensure that when setting variables or object attributes, the #) Added check to ensure that when setting variables or object attributes, the
type of the temporary LOB must match the expected type. type of the temporary LOB must match the expected type.
#) In order to follow the PEP 8 naming style a number of parameter names, #) A small number of parameter, method, and attribute names were updated to
method names and attribute names were modified. The old names will be follow the PEP 8 style guide. This brings better consistency to the
removed in a subsequent release of cx_Oracle. In addition, the use of cx_Oracle API. The old names are still usable but may be removed in a
encodings other than UTF-8 is also deprecated. See future release of cx_Oracle. See :ref:`_deprecations_8_2` for details.
:ref:`_deprecations_8_2` for details. #) Improved the test suite.
#) Improved test suite.
Version 8.1 (December 2020) Version 8.1 (December 2020)

View File

@ -316,17 +316,6 @@ for a connection to become available if all are currently in use, for example:
pool = cx_Oracle.SessionPool("hr", userpwd, "dbhost.example.com/orclpdb1", pool = cx_Oracle.SessionPool("hr", userpwd, "dbhost.example.com/orclpdb1",
min=2, max=5, increment=1, getmode=cx_Oracle.SPOOL_ATTRVAL_WAIT, encoding="UTF-8") min=2, max=5, increment=1, getmode=cx_Oracle.SPOOL_ATTRVAL_WAIT, encoding="UTF-8")
Applications that are using connections concurrently in multiple threads should
set the ``threaded`` parameter to *True* when creating a connection pool:
.. code-block:: python
# Create the session pool
pool = cx_Oracle.SessionPool("hr", userpwd, "dbhost.example.com/orclpdb1",
min=2, max=5, increment=1, threaded=True, encoding="UTF-8")
See `ConnectionPool.py See `ConnectionPool.py
<https://github.com/oracle/python-cx_Oracle/tree/master/samples/ConnectionPool.py>`__ <https://github.com/oracle/python-cx_Oracle/tree/master/samples/ConnectionPool.py>`__
for an example. for an example.

View File

@ -12,9 +12,8 @@
# The script uses threading to show multiple users of the pool. One thread # The script uses threading to show multiple users of the pool. One thread
# performs a database sleep while another performs a query. A more typical # performs a database sleep while another performs a query. A more typical
# application might be a web service that handles requests from multiple users. # application might be a web service that handles requests from multiple users.
# Applications that use connections concurrently in multiple threads should set # Note only one operation (such as an execute or fetch) can take place at a time
# the 'threaded' parameter to True. Note only one operation (such as an execute # on each connection.
# or fetch) can take place at a time on each connection.
# #
# Also see session_callback.py. # Also see session_callback.py.
# #
@ -29,7 +28,7 @@ import sample_env
pool = oracledb.SessionPool(user=sample_env.get_main_user(), pool = oracledb.SessionPool(user=sample_env.get_main_user(),
password=sample_env.get_main_password(), password=sample_env.get_main_password(),
dsn=sample_env.get_connect_string(), min=2, dsn=sample_env.get_connect_string(), min=2,
max=5, increment=1, threaded=True) max=5, increment=1)
def the_long_query(): def the_long_query():
with pool.acquire() as conn: with pool.acquire() as conn:

View File

@ -61,7 +61,7 @@ def callback(message):
pool = oracledb.SessionPool(user=sample_env.get_main_user(), pool = oracledb.SessionPool(user=sample_env.get_main_user(),
password=sample_env.get_main_password(), password=sample_env.get_main_password(),
dsn=sample_env.get_connect_string(), min=2, max=5, dsn=sample_env.get_connect_string(), min=2, max=5,
increment=1, events=True, threaded=True) increment=1, events=True)
with pool.acquire() as connection: with pool.acquire() as connection:
qos = oracledb.SUBSCR_QOS_QUERY | oracledb.SUBSCR_QOS_ROWIDS qos = oracledb.SUBSCR_QOS_QUERY | oracledb.SUBSCR_QOS_ROWIDS
sub = connection.subscribe(callback=callback, timeout=1800, qos=qos) sub = connection.subscribe(callback=callback, timeout=1800, qos=qos)

View File

@ -1,5 +1,5 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
@ -81,8 +81,7 @@ def init_session(conn, requested_tag):
pool = oracledb.SessionPool(user=sample_env.get_main_user(), pool = oracledb.SessionPool(user=sample_env.get_main_user(),
password=sample_env.get_main_password(), password=sample_env.get_main_password(),
dsn=sample_env.get_connect_string(), min=2, max=5, dsn=sample_env.get_connect_string(), min=2, max=5,
increment=1, threaded=True, increment=1, session_callback=init_session)
session_callback=init_session)
# acquire session without specifying a tag; since the session returned is # acquire session without specifying a tag; since the session returned is
# newly created, the callback will be invoked but since there is no tag # newly created, the callback will be invoked but since there is no tag

View File

@ -29,8 +29,7 @@ import sample_env
pool = oracledb.SessionPool(user=sample_env.get_main_user(), pool = oracledb.SessionPool(user=sample_env.get_main_user(),
password=sample_env.get_main_password(), password=sample_env.get_main_password(),
dsn=sample_env.get_connect_string(), min=2, max=5, dsn=sample_env.get_connect_string(), min=2, max=5,
increment=1, threaded=True, increment=1, session_callback="pkg_SessionCallback.TheCallback")
session_callback="pkg_SessionCallback.TheCallback")
# truncate table logging calls to PL/SQL session callback # truncate table logging calls to PL/SQL session callback
with pool.acquire() as conn: with pool.acquire() as conn: