You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为单个Session修改python-oracledb Cursor的arraysize

为单个SQLAlchemy AsyncSession修改Oracle Cursor的arraysize

技术栈

  • oracledb==2.5.1
  • sqlalchemy==2.0.25
  • fastapi==0.105.0

问题需求

在create_async_engine中设置arraysize会统一作用于连接池内的所有连接,但在大数据查询场景下,需要为单个AsyncSession单独修改Cursor的arraysize,不影响其他Session的配置。

解决方案

要实现这个需求,需获取Session对应的Oracle原生连接,直接修改其arraysize属性。以下是具体代码修改示例:

修改FastAPI接口代码

@dummy_router.get("/dummy_db_gen")
async def dummy_db_gen(
    *, chunk_size: int = 1000, session: AsyncSession = Depends(suag_connection.get_session)
) -> int:
    # 定义引擎默认的arraysize(与create_async_engine中设置的一致)
    DEFAULT_ARRAYSIZE = 5000
    
    async with session.connection() as conn:
        # 获取oracledb原生连接对象
        raw_conn = await conn.get_raw_connection()
        # 保存原arraysize,用于后续恢复
        original_arraysize = raw_conn.arraysize
        # 设置当前Session需要的arraysize
        raw_conn.arraysize = chunk_size
        
        try:
            # 执行大数据查询
            res = await session.execute(
                text("select id_art, name, id_group from suag.v_article where rownum <= 100000")
            )
            iteration = 1
            # 按指定chunk_size分批获取结果
            for chunk in res.yield_per(chunk_size):
                iteration += 1
            return iteration
        finally:
            # 恢复原arraysize,避免影响后续复用该连接的Session
            raw_conn.arraysize = original_arraysize

关键说明

  1. 获取原生连接:通过session.connection()获取当前Session绑定的数据库连接,再调用get_raw_connection()拿到oracledb的原生连接实例,直接修改其arraysize属性。
  2. 恢复默认值:由于连接池会复用连接,修改后的arraysize会保留在连接上,因此操作完成后需恢复为默认值,避免影响其他使用该连接的Session。
  3. 生效范围:该修改仅对当前Session使用的连接生效,后续使用同一连接的Session会继承修改后的配置(除非手动恢复)。

内容的提问来源于stack exchange,提问作者Kamo Petrosyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:03:10