sqlalchemy数据库连接的简单测试

sqlalchemy的mysql连接的问题:
先看一个demo:

from sqlalchemy.engine import create_engine
from sqlalchemy.orm import sessionmaker

DB_MYSQL_USER = '***'
DB_MYSQL_PASSWD = '***'
DB_MYSQL_HOST = '***'
DB_MYSQL_PORT = 3306
DB_MYSQL_DB = 'raas'
DB_MYSQL_CHARSET = 'utf8'

SQLALCHEMY_DATABASE_URI_MYSQL = 'mysql+mysqldb://%s:%s@%s:%s/%s?charset=%s' % (
    DB_MYSQL_USER, DB_MYSQL_PASSWD, DB_MYSQL_HOST, DB_MYSQL_PORT, DB_MYSQL_DB, DB_MYSQL_CHARSET)

engine = create_engine(SQLALCHEMY_DATABASE_URI_MYSQL, echo=False, pool_size=1, max_overflow=0)  # 连接池大小设置为1,即只允许一个连接,第二个连接会一直等待;
Session = sessionmaker(bind=engine, autocommit=False)


def conn_to_db():
    conn = Session()
    res = conn.query(JobInfo).all()  # 此处JobInfo可以为任意表,只要能触发连接数据库的动作就行
    conn.commit()
    print(res)

    conn = Session()
    res = conn.query(ApsJobInfo).all()
    print(res)
    conn.commit()

    conn = Session()
    res = conn.query(ApsJobInfo).all()
    print(res)
    conn.commit()

    conn = Session()
    res = conn.query(ApsJobInfo).all()
    print(res)
    conn.commit()

    conn = Session()
    res = conn.query(ApsJobInfo).all()
    print(res)
    conn.commit()

    time.sleep(5)
conn_to_db()

case 1: 运行过程中,查询mysql连接数,发现:运行正常,说明commit动作会自动断开连接,下一个conn对象才能够正常执行;

case 2:屏蔽掉所有conn.commit():
结果:只获取到一次查询结果,其余全block了

case3:用conn.close()代替conn.commit():
结果:程序正常执行

case4:修改sqlalchemy引擎配置,配置连接池为10:
结果:正常执行

结论:
要么复杂逻辑中注意减少数据库连接数量,要么逻辑中及时close不再需要的连接,要么autocommit……(另外,可以把close动作丢到类的魔法方法:__del__中,实例化对象回收之时就自动释放)

该测试没啥技术含量,只是想说,以前没关注过mysql连接数的问题,直到最近项目在连测试库测试时,出现了tornado占用很多数据库连接、导致数据库异常。回头要想办法优化一下,避免生产上埋雷。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值