首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >瓶子-防止多个打开的mysql连接?

问瓶子-防止多个打开的mysql连接?
EN

Stack Overflow用户
提问于 2018-10-15 14:11:48
回答 1查看 1.1K关注 0票数 1

我已经创建了一个以mysql为后端的烧瓶应用程序。要启动DB连接,我使用了以下内容:

代码语言:javascript
复制
@app.before_request
def db_connect():    
    try:
        g.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ddb",cursorclass=MySQLdb.cursors.DictCursor,autocommit=True)        
    except Exception as e:                
        print(e)

@app.teardown_request
def db_disconnect(exception=None):
    try:
        if g.db is not None:
            g.db.close()
    except Exception as e:
        print(e)

将其加载到init_py中。但是我检查了这个mysql打开和关闭多少次,它的命运。因为连接是打开和关闭的,即使css/js文件请求调用。我在所有函数中调用g.db。怎样才能避免这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-15 15:12:13

问得好。基本上,您提供的代码在每个请求之前启动一个db连接。每个访问的url都是一个请求--包括检索到的图像或样式表-,所以这很常见。

怎么办?

  • 这个片段可能会更高效一些,但是仍然会根据每个请求创建一个数据库。你可以去看看。
  • 直接去你的静力学路线是明智的。当数据库连接确实不需要时,这将删除大量请求。有一些选择来做这个与烧瓶本身-见这个职位。我个人使用flask + WSGI,并将这个小脚本添加到WSGIDaemonProcess行的WSGIDaemonProcess文件中。 别名“/静态/”"/home/user/webapps/flask_app/flask_app/static/“<目录"/home/user/webapps/flask_app/flask_app/static/">需要所有授予
  • 你所有的视图都需要数据库吗?否则,只能获得所需视图上的连接。 从函数工具导入的包装从烧瓶导入g def make_db_connection(func):“”装饰需要数据库连接的视图“@args(Func) def decorated_function(*args,**kwargs):如果'db‘不在g: g.db = connect_to_database()返回func(*args,**kwargs)返回decorated_function @app.teardown_appcontext def teardown_db():“关闭如果打开”db = g.pop(' db ',None)如果db不是None: db.close()
  • 您可以在数据库周围创建一个小的class / API,并缓存最常见的请求。当然,只适用于select。看这个漂亮工程。 类数据库():@threaded_cached_property_with_ttl(ttl=60*60) #,按秒计算,def some_popular_query():connection = MySQLdb.connect(host="localhost",user=“,passwd=”,db=“))返回connection.get_query()

Illustration

举个例子,假设我们有一个简单的template/main.html网站。

代码语言:javascript
复制
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"</script>
    <script src="static/style/test.css"></script>
</head>
<body> 
    {{message}}
    <img src="static/img/test.png' />
</body>

和index.py

代码语言:javascript
复制
 from flask import Flask
 app = Flask(__name__)

 @app.route('/')
 def hello_world():
     return render_template('index.html', message='Hello world')

使用您描述的烧瓶站点,您将有一个页面和模板请求、另一个样式表请求和另一个图像请求。这是对你的数据库的三个调用!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52818695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档