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

【VisionMaster】图像源模块之本地图像

图像采集之图像源

zhy29563 6957

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

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

机器人动力学与控制学习笔记(一)————机器人控制概述

一、概述 1、机器人控制的目的 对自由运动机器人来说,控制的目的是要控制机器人手端的位置和姿态(以后统一简称为位姿),即所谓位置控制问题。这时希望机器人手端所达到的位置称为期望位置或期望轨迹。期望轨迹可以在机器人任务空间中给出,也可以通过逆运动学关系转化为机器人关节空间中的期望轨迹。期望轨迹通常有两种形式:一种是一个固定位置(即固定点),另一种是一条随时间连续变化的轨迹。自由运动机器人位置控制的目的,是要使机器人手端从任意起始位置出发都能到达期望轨迹。当期望轨迹是固定点时的位置控制称为定...

冰与火的青春的博客 6879

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

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

weixin_34348174的博客 235

【24届计算机校招】面经汇总

这是笔者为了能够记录一下接下来一段时间会看的一些博客视频等汇总。一是为了汇总后常回来看看,而是为了后面的人在这个阶段准备的时候有个参考。现在已经6月底了,大部分高校的夏令营都出来了,而我至今还是夏0营,前几天还为川大会收双非而感到高兴,但遗憾的是川大并没要我。而我另一位双非的朋友已经拿到offer,在决定去南开还是华师了。没有对比就没伤害,我开始怀疑自己的决策是否正确——这段时间的夏令营我都有关注,但我仅报了少部分的几个酒吧舞,而没有选择海投,我觉得只要我认准了一个东西,我拼尽全力就一定能够获取到。

JehanRio's Private Blog 801

ubuntu18.04安装Nvidia显卡驱动后黑屏及网络、蓝牙驱动消失的解决方案

ubuntu18.04安装Nvidia显卡驱动后黑屏及网络、蓝牙驱动消失的解决方案

weixin_40735291的博客 6617

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

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

汪云辉的博客 959

DAMMFND: Domain-Aware Multimodal Multi-view Fake News Detection

虚假新闻的泛滥不仅严重阻碍了互联网社交媒体的健康发展,还在政治、经济和社会层面造成了实际危害,凸显了自动化虚假新闻检测的重要性(Zhou 等,2015;Cui 等,2019;Zhu 等,2022a;Li 等,2024c,b,a)。现有的虚假新闻检测方法通常聚焦于特定领域的新闻,例如健康或政治领域。然而,在现实世界中,社交媒体上的新闻往往跨越多个领域,这就要求现有的虚假新闻检测方法必须考虑多域泛化(Nan 等,2021;Qi 等,2019;Zhu 等,2022b)。

qq_52053775的博客 337

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

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

SnowflakeJaguar14的博客 844

Java代码变更影响分析:从静态解析到动态调用图的实战全链路

本文介绍了Java代码提交影响分析的核心原理与实现方法。主要内容包括:1)静态分析技术,通过JavaParser解析AST构建调用图,记录类与方法间的调用关系;2)动态分析技术,使用ByteBuddy进行字节码增强,捕获运行时调用路径;3)JCCI工具实现,结合javalang、unidiff等技术分析代码改动影响,并将结果存储到SQLite数据库。文章提供了完整的代码示例,展示了从AST解析、动态调用跟踪到实际工具应用的完整技术栈,为代码变更影响分析提供了实用解决方案。

墨夶的博客 1251

Arduino ESP8266自定义配置分区表

ESP8266自定义分区表配置 随着项目的不断开发,项目文件也不断在增大,在没有考虑更换主硬件的条件下,最大开发利用有限资源势在必行,所以今天带来ESP8266自定义分区表的配置。 我这里以版本:2.7.4版本为例,后面的版本也是支持的。 注意:自定义分区表特别要注意和你的硬件相对应,flash芯片的大小决定这个分区是否有效,否则有意想不到的事情发现。 自定义分区表的几个重要参数 /* Flash Split for 4M chips */ /* sketch @0x40200000 (~1019K

perseverance51博客 1725

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

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

oZiDingXiang的博客 584

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

flask ORM操作

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

blank_memory_的博客 981

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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、付费专栏及课程。

余额充值