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占用很多数据库连接、导致数据库异常。回头要想办法优化一下,避免生产上埋雷。