session.close()关闭数据库连接的时机plus对象的作用域验证

上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的时候。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值