Flask项目使用Oracle数据库踩坑指南——数据库连接池配置

flask——数据库连接池、wtfroms、信号、多app应用、flask-script 数据库连接池、wtfroms、信号、多app应用、flask-script 阅读详情

概述

为了尝试快速开发,使用Flask框架构建了web项目,但因需要适配Oracle数据库,从而折腾出一堆问题。
flask项目一般使用 flask-sqlalchemy 基于 SQLAlchemy中间件实现多种类型数据库的适配,Oracle也在其中。
本文为踩坑指南的第二篇。

配置连接池创建连接的一般过程

在Flask项目的配置文件中,可通过设置常量的方式来告知SQLAlchemy连接数据库的配置参数。
配置文件示例:

import os
from sqlalchemy.pool import QueuePool

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'some complicate strings'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ENGINE_OPTIONS = {
        'poolclass': QueuePool,
        'max_overflow': 5,   # 超过连接池大小外最多可创建的连接
        'pool_size': 20,  # 连接池大小
        'pool_timeout': 5,  # 池满后,线程的最多等待连接的时间,否则报错
        'pool_recycle': 1200,  # 多久之后对线程池中的线程进行一次连接的回收(重置)—— -1 永不回收
        'pool_pre_ping': True
    }
    
    @staticmethod
    def init_app(app):
        pass

class developmentConfig(Config):
    """开发环境配置"""
    SQLALCHEMY_DATABASE_URI = ""  # 数据库连接字符串

class ProductionConfig(Config):
    """生产环境配置"""
    SQLALCHEMY_DATABASE_URI = ""  # 数据库连接字符串

config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig
}

然后,在app中加载配置信息:

from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
conf = config['development']
app.config.from_object(conf)

db = SQLAlchemy()
db.init_app(app)

之后,即可在功能模块中通过conn = db.session()建立连接并执行增删改查操作。

一般情况下,对于MySQL、SQLite等数据库,可以通过SQLALCHEMY_ENGINE_OPTIONS 来配置数据库连接池。默认情况下,flask_sqlalchemy通过调用sqlalchemy.create_engine方法创建连接。

查阅flask_sqlalchemy源码和SQLAlchemy 官方文档,可以发现,flask_sqlalchemy 在create_engine时,有如下注释:

# flask_sqlalchemy.__init__.py 1091
    def create_engine(self, sa_url, engine_opts):
        """
            Override this method to have final say over how the SQLAlchemy engine
            is created.

            In most cases, you will want to use ``'SQLALCHEMY_ENGINE_OPTIONS'``
            config variable or set ``engine_options`` for :func:`SQLAlchemy`.
        """
        return sqlalchemy.create_engine(sa_url, **engine_opts)

注释中提到:create_engine这个方法可以被覆盖,这取决于最终如何创建SQLAlchemy engine。大部分情况下,可以通过配置变量SQLALCHEMY_ENGINE_OPTIONS来实现。其中,sa_url即连接字符串。sqlalchemy根据连接字符串,解析出数据库类型,并调用不同的方法实现数据库连接。

通过engine创建数据库连接及使用示例:

with engine.connect() as connection:
    connection.execute(text("insert into table values ('foo')"))
    connection.commit()

连接Oracle数据库时发生的问题

但是假如使用Oracle数据库及cx_Oracle方式(数据库连接字符串以oracle+cx_oracle://开头),则以上配置方法往往无法使得数据库连接池生效,导致经过一段时间后,session失效,项目请求后台无响应。报错信息如下:

ERROR 2022-01-11 21:04:03 base.py[240]: Exception closing connection <cx_Oracle.Connection to ...db_connect_string>
Traceback (most recent call last):
  File "/.../flask_admin/lib/python3.8/site-packages/sqlalchemy/pool/base.py", line 238, in _close_connection
    self._dialect.do_close(connection)
  File "/.../flask_admin/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 673, in do_close
    dbapi_connection.close()
cx_Oracle.DatabaseError: DPI-1080: connection was closed by ORA-3113

报错的代码:

    def _close_connection(self, connection):
        self.logger.debug("Closing connection %r", connection)

        try:
            self._dialect.do_close(connection)  # 报错代码行,在关闭连接时抛出异常
        except Exception:
            self.logger.error(
                "Exception closing connection %r", connection, exc_info=True
            )

推测为Oracle数据库连接已中断,但sqlalchemy在超过pool_recycle配置的时间时试图关闭连接,从而发生异常。
无论如何调整 SQLALCHEMY_ENGINE_OPTIONS配置项,都无法解决此问题。

改用cx_oracle.SessionPool自有连接池

然后,阅读sqlalchemy源码,并从中找到了如下注释:

# sqlalchemy/dialects/oracle/cx_oracle.py 98
"""
Using cx_Oracle SessionPool
---------------------------

The cx_Oracle library provides its own connectivity services that may be
used in place of SQLAlchemy's pooling functionality.    This can be achieved
by using the :paramref:`_sa.create_engine.creator` parameter to provide a
function that returns a new connection, along with setting
:paramref:`_sa.create_engine.pool_class` to ``NullPool`` to disable
SQLAlchemy's pooling::

    import cx_Oracle
    from sqlalchemy import create_engine
    from sqlalchemy.pool import NullPool

    pool = cx_Oracle.SessionPool(
        user="scott", password="tiger", dsn="oracle1120",
        min=2, max=5, increment=1, threaded=True
    )

    engine = create_engine("oracle://", creator=pool.acquire, poolclass=NullPool)

The above engine may then be used normally where cx_Oracle's pool handles
connection pooling::

    with engine.connect() as conn:
        print(conn.scalar("select 1 FROM dual"))

"""

其中提到了cx_oracle 自有连接池功能,并给出了示例代码。同时,若使用其自有连接池功能,应设置sqlalchemy的poolclass为NullPool,即无连接池模式。简单来说,就是不使用sqlalchemy的连接池,转而使用cx_oracle.SessionPool连接池。

因此,通过覆盖 create_engine方法,可实现此功能:

class OracleSqlAlchemy(SQLAlchemy):
    def create_engine(self, sa_url, engine_opts):
        import cx_Oracle
        from sqlalchemy import create_engine
        from sqlalchemy.pool import NullPool
        from sqlalchemy.engine import url as _url

        # create url.URL object
        u = _url.make_url(sa_url)
        pool = cx_Oracle.SessionPool(
            user=u.username, password=u.password, dsn=f'{u.host}:{u.port}/{u.database}',
            min=2, max=5, increment=1,
            timeout=1200,  # 闲置会话关闭前的等待时间
            getmode=cx_Oracle.SPOOL_ATTRVAL_TIMEDWAIT,
            wait_timeout=5,  # 池满后创建新会话的等待时间
            threaded=True
        )

        engine = create_engine("oracle://", creator=pool.acquire, poolclass=NullPool)
        return engine

然后,在app初始化时,用如下方式初始化db连接:

db = OracleSqlAlchemy()
db.init_app(app)

经过实际测试,flask项目不再发生后台无响应的情况。

Python绑定变量操作Oracle数据库连接池 # -*- coding: utf-8 -*- # @Time : 2020/8/13 5:28 下午 # @Author : ml # @modify : wjh # @FileName: OraclePool.py # @Software: PyCharm # 基于cx_Oracle自带SessionPool连接池, 线程中使用, 则配置threaded=True # 官方文档摘要: # Oracle Real-World Performance Group的建议是使用固定大小的连接池。mi. 阅读详情

相关推荐

Python后端开发实战指南:Django/Flask/FastAPI部署与数据库配置

Python后端开发是构建现代Web服务的核心能力,其本质是将HTTP协议、应用框架、数据库交互与系统部署有机整合的技术实践。理解Django的MTV模式、Flask的应用工厂机制或FastAPI的类型驱动路由,只是起点;真正决定项目成败的是虚拟环境隔离、多环境配置管理、数据库连接池调优及Gunicorn+Nginx进程协作等底层原理。这些技术价值体现在提升开发一致性、保障生产稳定性、降低运维复杂度,并直接支撑API服务、内部管理系统、中小型企业后台等典型应用场景。本指南聚焦真实工程现场,覆盖Python后

weixin_30314813的博客 492

CX_ORACLE SESSIONPOOL

import cx_OracleoraPool=cx_Oracle.SessionPool(user='crystal',password='crystal',dsn='10.14.250.29/oratest',min=1,max=500,increment=1)def oraConn(oraSql):    conn=oraPool.acquire()    cursor=conn.curso

danevc的博客 2607

Flask入门与实战:从零构建可部署的Python Web应用

Flask是一个轻量级Python Web框架,以显式设计、低侵入性和高可控性著称,其核心原理是将WSGI应用封装为可扩展的路由系统,不强制约定、不隐藏中间件,使开发者能直面HTTP请求生命周期。这种设计赋予它极强的技术价值:快速验证MVP、适配前后端分离架构、便于调试与教学实践。典型应用场景包括内部工具系统、数据看板、Vue/React后端API服务及教学平台(如头歌)的Web开发实验。本文围绕Flask环境搭建、路由机制、模板渲染、数据库操作与生产部署五大关键环节,结合conda虚拟环境、原生SQLAl

abcyan1235的博客 449

Flask连接ORACLE数据库

1.安装数据库 2.创建账号 3.赋予权限 grant create session to chj; grant connect,resource,dba to chj; grant all privileges to chj; from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__...

神仙哥哥 4784

Python连接MySQL生产实战:连接池、字符集、事务与批量插入避坑指南

Python连接MySQL是Web开发和数据工程的基础能力,但真实生产环境远非‘pip install + 三行代码’所能覆盖。其核心涉及数据库连接管理、字符编码统一、事务一致性控制、时区处理及批量操作性能优化等关键环节。尤其在高并发、长周期服务(如Django/Flask后端、Celery任务)中,PyMySQL与mysql-connector-python的选型差异、连接池参数误配、utf8mb4未全链路生效、datetime时区错位等问题极易引发凌晨告警、数据乱码或事务丢失。本文基于金融、电商等高可用

weixin_34391445的博客 401

掌握Flask后端的数据库连接池管理

在Flask后端开发中,数据库操作是非常常见的需求。每次请求都创建和销毁数据库连接会带来较大的开销,影响应用的性能。数据库连接池可以有效解决这个问题,它预先创建一定数量的数据库连接,当有请求需要数据库操作时,直接从连接池中获取连接,使用完毕后归还到连接池,避免了频繁创建和销毁连接的开销。本文的目的就是帮助开发者掌握在Flask中如何管理数据库连接池,包括连接池的创建、使用和维护,以及如何优化连接池的性能。范围涵盖了常见的数据库如MySQL、PostgreSQL等在Flask中的连接池实现。

架构师的AI之路,分享AI应用开发架构的学习与实践。 754

基于 oracle 的 flask 项目(一)——配置项目

一般印象,flask 项目适合做一些短小精悍的项目,特别是与 sqlite、mysql 等数据库结合很是般配。但是在一些大公司,特别是一些金融行业等国企公司,还是以 oracle 居多,那么,这个小辣椒(flask)就无用武之地了吗?No, No, No… 下面将以 flask_oracle 项目为例,对 flask 的功能进行一个详细的讲解。 项目描述 实现登录功能,基...

藕丝空间 3421

flask-oracle:使用oracle进行连接测试

烧瓶Oracle 使用oracle进行连接测试 安装和使用 Requer Python 3.4 e Pipenv 虚拟环境python3 -m venv .venv 虚拟环境 Windows .venv\Scripts\activate Linux或Mac source .venv\bin\activate pipenv install Crie o arquivo .env ( ) Rodeaplicaçãopython python src/processo_automatico.py 在SO上安装Oracle驱动程序 下载InstantClient-basic-linux.x64-12.2.0.1.0.zip 将其解压缩到/ opt / oracle目录: sudo mkdir -p /opt/oracle cd /opt/oracle unzip ~/Downl

Flask应用篇-数据库:SQLAlchemy 与 Flask_Sqlalchemy

目录 一、简介 二、使用 (一)采用sqlalchemy方式 1. 基本:通过SQLAlchemy连接数据库并取数据 2. ORM介绍(SQLAlchemy强大的地方) (二)、采用Flask-SQLAlchemy方式 一、简介 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是...

bluebloodye的专栏 2734

数学建模国赛C题实战:从数据预处理到模型优化的完整流程(附Python代码)

本文系统讲解了数学建模国赛C题的完整实战流程,涵盖从数据预处理、模型选择与构建到优化与结果可视化的关键步骤。文章重点分享了如何利用Python进行高效的数据清洗、特征工程,并提供了多种机器学习模型的实现代码与对比验证方法,旨在帮助参赛者构建逻辑清晰、结果可靠的解决方案。

weixin_29079643的博客 293

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 682

Flask --(25)Flask 中数据库的配置

安装 flask-sqlalchemy pip install flask-sqlalchemy 如果连接的是 mysql 数据库,需要安装 mysql pip install flask-mysqldb 使用 Flask-sqlalchemy 管理数据库 在Flask-SQLAlchemy中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的SQLALCHEMY_DAT...

Enjolras_fuu的博客 1288

告别单一查询!MultiQueryRetriever在LangChain中的高级用法解析

本文深入解析了LangChain中的MultiQueryRetriever高级用法,该工具通过大语言模型自动生成多样化查询,显著提升文档检索的召回率和准确性。文章详细介绍了其核心机制、高级配置调优策略以及在多语言和专业领域中的实际应用,为开发者提供了优化知识库问答系统的实用方案。

weixin_28730927的博客 271

Spring Boot 集成 JWT 实战:从签发校验到安全加固的完整指南

JWT(JSON Web Token)是一种无状态的令牌规范,通过 Header、Payload、Signature 三段式结构实现签名防篡改。其核心原理是服务端不存储会话状态,所有用户信息编码在 Token 中,由客户端携带并在服务端验签解析。在 Spring Boot 项目中,JWT 常用于接口认证与授权,结合拦截器可实现请求级用户上下文管理。实际落地时需关注密钥管理、过期时间、刷新机制及算法混淆攻击防范。本文围绕 Spring Boot 集成 JWT 的完整流程,从 Token 签发、校验、续签,到生

weixin_34348174的博客 236

计算机视觉研究方向有哪些?什么方向最好出论文创新点

计算机视觉(CV)是人工智能中一个活跃且应用广泛的研究领域,旨在让计算机理解和处理图像与视频。其主要研究方向包括图像分类、目标检测、图像分割、姿态估计、图像生成与重建、视频理解、三维视觉和跨模态视觉理解。这些方向不仅涉及基础理论,还紧密联系实际应用,适合发表论文和实现项目落地。为了在CV领域取得创新,建议关注跨模态学习、小样本学习、图像生成模型的控制与轻量化、视频分析以及医学图像分析等方向。此外,通过阅读顶会论文、复现SOTA方法、模型微调和数据集创新等方式,可以有效切入研究并产生有价值的成果。

OpenCVtuxiang的博客 3548

Eigen 直线拟合/曲线拟合/圆拟合/椭圆拟合

使用Eigen库进行直线拟合是数据分析和科学计算中的常见任务,主要通过最小二乘法实现。该代码演示了二维空间中的直线拟合,输出斜率和截距。

深之JohnChen的专栏 1593

flask项目之SQLAlchemy映射构建(3)

目录1 简介2 安装3 数据库连接设置4 模型类字段与选项5 构建模型类映射5.1 首先需要创建SQLAlchemy对象:5.2 定义模型类 1 简介 SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。 SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。 ...

汪云辉的博客 959

STM32CubeMX配置FSMC驱动外部SRAM全流程详解

FSMC(灵活静态存储控制器)是STM32实现高速并行外部存储扩展的核心外设,其本质是将片外SRAM地址空间映射为CPU可直接读写的内存区域。原理上依赖于精确的时序寄存器配置(如BTRx)、GPIO复用功能启用及AHB3总线时钟同步机制,技术价值在于免DMA搬运的零拷贝访问能力与确定性低延迟。典型应用场景包括工业HMI缓存、医疗设备实时数据采集、嵌入式图形加速等对带宽和确定性要求严苛的系统。本文围绕STM32F407ZG平台,结合STM32CubeMX工程化配置、硬件信号完整性设计与HAL库底层映射逻辑,系

weixin_34718952的博客 232

快马AI编程实战:5分钟用自然语言生成Oracle数据库管理系统

最近在做一个企业级员工管理系统的项目,需要用到Oracle数据库。作为全球领先的企业级数据库,Oracle的高性能和可靠性确实没得说,但传统开发中连接配置和CRUD操作总让人头疼。整个项目从设计到上线只用了不到1小时,特别是处理Oracle这种专业数据库时,不用再翻文档查各种参数配置,AI生成的代码开箱即用。对于需要快速验证Oracle项目可行性的场景特别有帮助。,不用搭建本地环境就能完成企业级应用开发,部署过程比传统方式省心太多。,用自然语言就能生成全套代码,分享下我的实战经验。

SnowflakeJaguar14的博客 844

Swin Transformer 与 CNN 结合实现图像分类

Swin Transformer 与 CNN 结合实现图像分类。(含swin transformer 结构讲解,cnn网络搭建,代码)

这里是Mae。 5026

手把手教你学Simulink--移动机器人多轮协同场景实例:基于Simulink的双轮差速PMSM轮毂电机协同驱动仿真

本文介绍了基于Simulink的双轮差速PMSM轮毂电机协同驱动仿真系统。针对移动机器人存在的电机参数不一致、负载分配不均等问题,提出主从同步+力矩补偿的协同控制策略。通过搭建包含运动学模型、PMSM电机模型和矢量控制器的仿真系统,实现了速度同步误差<0.005m/s、轨迹跟踪误差<0.8cm、能耗降低12.5%的优化效果。文章详细阐述了建模步骤、核心算法实现和性能验证,为移动机器人动力系统设计提供了实用参考方案。

MHD0815的博客 131

05-Flask数据库集成ORM与迁移管理深度解析

"""抽象基类模型"""__abstract__ = True # 声明为抽象基类,不创建表"""保存模型实例""""""删除模型实例""""""根据ID查询""""""查询所有记录""""""转换为字典""""""约束演示模型"""# 表级主键约束(复合主键)# )# 表级唯一约束# 单列唯一约束(也可以在Column中使用unique=True)# 复合唯一约束# 检查约束# 索引定义。

oZiDingXiang的博客 584

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python db end-of-file记录

1.异常信息 sqlalchemy.exc.OperationalError: (cx_Oracle.OperationalError) ORA-03113: end-of-file on communication channel sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-03150: end-of-file on communication channel for database link 2.涉及的module Fl.

Jalen备忘录 644

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

flask ORM操作

我们后面会把模型创建到单独的文件中,但是现在我们先把模型类写在manager.py文件中。

blank_memory_的博客 981

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SQLAlchemy终极指南:5个技巧构建高性能Python数据库应用

SQLAlchemy是Python生态中最强大的数据库工具包,为开发者提供了完整的ORM和SQL表达式语言解决方案。作为Python数据库编程的瑞士军刀,它支持多种数据库后端,提供灵活的查询构建和高效的数据映射功能,帮助开发者快速构建可扩展的企业级应用。无论你是构建Web应用、数据分析工具还是自动化系统,SQLAlchemy都能显著提升数据库操作的效率和代码质量。 ## 项目概述与核心价值 S

gitblog_00577的博客 895
上一篇: Flask项目使用Oracle数据库踩坑指南——ID自增与Cast自动类型转换
下一篇: 基于 Jasypt对 Springboot 配置信息进行加密
Pierre_
博客等级 码龄19年 2262粉丝 89原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pierre_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值