我们之前的笔记里面提到了我们使用的ORM是peewee,是直连的方式,实际在稍大的应用中一般都配置连接池来使用,连接池和直连的区别是在数据库初始化的时候就会创建指定数量的连接对象,在后续执行sql语句的时候可以直接获取这些连接对象进行sql语句的操作,当执行完就可以将连接对象归还给连接池,连接池能够管理复用连接对象,避免频繁创建数据库连接对象和销毁连接对象的这些开销,提高了数据库的访问效率,但是也有缺点,就是比直连更消耗初始化资源。
接下来我们来看看peewee如何创建连接池,目前peewee官网上给了一个postgresql连接池的例子
from playhouse.pool import PooledPostgresqlExtDatabase
db = PooledPostgresqlExtDatabase(
'my_database',
max_connections=8,
stale_timeout=300,
user='postgres')
class BaseModel(Model):
class Meta:
database = db
而我们使用的是mysql,实际使用也是差不多的,直接上我的配置,我们使用了应用工厂,使用连接池我们需要使用playhouse这个包内的扩展来做,所以我们需要安装扩展
pip install playhouse
然后整个数据库配置和初始化都如下:
from playhouse.pool import PooledMySQLDatabase
from apps import data_proxy
#工厂函数 def create_app(): app = Flask(__name__) app.secret_key = 'yang.su' app.config.from_pyfile("../settings.py") db = config_db(app) data_proxy.initialize(db) @app.before_request def bf_request(): data_proxy.connect() @app.after_request def af_request(response): if not data_proxy.is_closed(): data_proxy.close() return response return app
#mysql数据库连接池配置
def config_db(app): return PooledMySQLDatabase( app.config["DB_NAME"], max_connections=app.config["DB_MAXCONNECT"], stale_timeout=app.config["DB_TIMEOUT"], host=app.config["DB_HOST"], port=app.config["DB_PORT"], user=app.config["DB_USER"], password=app.config["DB_PASS"] )
我们使用的是使用了data_proxy动态初始化数据库对象的方法,这个是由于我们的初始化动作想放到工厂函数中做统一初始化。
上述还需要注意一点,有很多网上教程中提到使用了连接池就不需要去做数据库连接和关闭的动作,这个是不对的,使用了连接池以后还是需要显示的调用connect()和close(),因为我们创建connect()实际是从连接池拿到连接对象,close()实际是将连接对象归还到连接池。不做这些操作很快就会有超出连接数量的相关报错,例如如下报错就是超出最大连接数。
playhouse.pool.MaxConnectionsExceeded: Exceeded maximum connections.
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:https://sulao.cn/post/1049
评论列表