Skip to content

Commit 00b526c

Browse files
Ensure that the type cache metadata cursor is closed when a connection
is returned to the pool (since it can no longer be used).
1 parent 67d3060 commit 00b526c

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/oracledb/impl/thin/dbobject.pyx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,25 @@ cdef class ThinDbObjectTypeCache:
591591
dict types_by_name
592592
list partial_types
593593

594+
cdef int _clear_meta_cursor(self) except -1:
595+
"""
596+
Clears the cursor used for searching metadata. This is needed when
597+
returning a connection to the pool since user-level objects are
598+
retained.
599+
"""
600+
if self.meta_cursor is not None:
601+
self.meta_cursor.close()
602+
self.meta_cursor = None
603+
self.return_value_var = None
604+
self.full_name_var = None
605+
self.oid_var = None
606+
self.tds_var = None
607+
self.attrs_ref_cursor_var = None
608+
self.version_var = None
609+
self.schema_var = None
610+
self.package_name_var = None
611+
self.name_var = None
612+
594613
cdef int _determine_element_type_csfrm(self, ThinDbObjectTypeImpl typ_impl,
595614
uint8_t* csfrm) except -1:
596615
"""

src/oracledb/impl/thin/pool.pyx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,14 @@ cdef class ThinPoolImpl(BasePoolImpl):
296296
some reason it will be dropped; otherwise, it will be returned to the
297297
list of connections available for further use.
298298
"""
299+
cdef:
300+
ThinDbObjectTypeCache type_cache
301+
int cache_num
299302
with self._condition:
303+
if conn_impl._dbobject_type_cache_num > 0:
304+
cache_num = conn_impl._dbobject_type_cache_num
305+
type_cache = get_dbobject_type_cache(cache_num)
306+
type_cache._clear_meta_cursor()
300307
if conn_impl._protocol._socket is not None:
301308
self._free_used_conn_impls.append(conn_impl)
302309
conn_impl._time_in_pool = time.monotonic()

tests/test_2400_pool.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,5 +707,15 @@ def test_2429_soda_metadata_cache(self):
707707
pool.soda_metadata_cache = False
708708
self.assertEqual(pool.soda_metadata_cache, False)
709709

710+
def test_2430_get_different_types_from_pooled_connections(self):
711+
"2430 - get different object types from different connections"
712+
pool = test_env.get_pool(min=1, max=2, increment=1)
713+
with pool.acquire() as conn:
714+
typ = conn.gettype("UDT_SUBOBJECT")
715+
self.assertEqual(typ.name, "UDT_SUBOBJECT")
716+
with pool.acquire() as conn:
717+
typ = conn.gettype("UDT_OBJECTARRAY")
718+
self.assertEqual(typ.name, "UDT_OBJECTARRAY")
719+
710720
if __name__ == "__main__":
711721
test_env.run_test_cases()

0 commit comments

Comments
 (0)