上demo:
class Conn():
def __init__(self):
# 为了更直观看到变化,这里一个类初始化5个sqlalchemy连接
self.session = Session()
self.session2 = Session()
self.session3 = Session()
self.session4 = Session()
self.session5 = Session()
# 类实例对象被回收时,会自动调用该方法关闭所有数据库连接;
def __del__(self):
print('start close connections')
self.session.close()
self.session2.close()
self.session3.close()
self.session4.close()
self.session5.close()
print('all connection closed')
# 启动每个sqlalchemy的连接,sqlalchemy默认是只有执行数据库动作时才会产生connection;
def auto_conn(self):
res = self.session.query(ApsJobInfo).all()
# self.session.commit() # 每个session都配置的手动commit,这里故意不commit,使连接状态保持;
print('s1')
res = self.session2.query(ApsJobInfo).all()
print('s2')
# self.session2.commit()
res = self.session3.query(ApsJobInfo).all()
print('s3')
# self.session3.commit()
res = self.session4.query(ApsJobInfo).all()
print('s4')
# self.session4.commit()
res = self.session5.query(ApsJobInfo).all()
print('s5')
# self.session5.commit()
def conn_to_db():
# 实例化Conn类并执行,且不保存Conn实例对象;
Conn().auto_conn()
print('start sleep')
time.sleep(5)
print('sleep over')
conn_to_db()
print('conn_to_db finished')
time.sleep(5)
print('process done')
case1:以上配置(不保存Conn对象)
结果:
s1
s2
s3
s4
s5
start close connections
all connection closed
start sleep
sleep over
# (数据库连接数,在这个位置减少了4)
conn_to_db finished
process done
# (数据库连接数在这里减少1)
说明:在Conn().auto_conn()执行完立即销毁Conn对象,执行session.close(),但是在auto_conn执行完被销毁时,数据库连接才真正断开
case2:改写conn_to_db()函数,保存Conn实例化对象,conn_to_db函数不返回conn:
def conn_to_db():
# 实例化Conn类并执行,且不保存类地址;
conn = Conn()
conn.auto_conn()
print('start sleep')
time.sleep(5)
print('sleep over')
结果:
s1
s2
s3
s4
s5
start sleep
sleep over
start close connections
all connection closed
conn_to_db finished
# (数据库连接数,在这个位置减少了4)
process done
# (数据库连接数,在这个位置减少1)
说明:conn_to_db函数执行完毕,销毁Conn实例对象,且数据库连接也是在auto_conn函数执行完时断开
case3:
conn_to_db函数返回conn
def conn_to_db():
# 实例化Conn类并执行,且不保存类地址;
conn = Conn()
Conn().auto_conn()
print('start sleep')
time.sleep(5)
print('sleep over')
return conn
conn = conn_to_db() # 这里接收与否都一样
print('conn_to_db finished')
time.sleep(5)
print('process done')
结果:
s1
s2
s3
s4
s5
start close connections
all connection closed
start sleep
sleep over
start close connections
all connection closed
conn_to_db finished
process done
# (数据库连接数,在这个位置减少5)
说明:conn所引用的对象从局部变量被传递到全局变量,进程结束前一直没有被销毁,数据库连接也一直保持到进程结束。
结论:
session.close()关闭连接,对数据库来说,是发生在session实例对象的最外层作用域执行结束被销毁时,而不是调用close的时候。