python开发WEB服务中数据库链接释放应该怎么做?,pythonweb,用tornado开发we


用tornado开发web service服务。服务端根据接收到的json数据对mysql数据库进行查询,并把结果反馈给用户。采用sqlalchemy对数据库进行操作,以下对数据库链接的创建,释放是否合理呢?

class db:    def __init__(self,db_ip='',db_name='',db_user='',db_pass='',db_charset=''):        self.db_str = 'mysql+pymysql://'+db_user+':'+db_pass+'@'+db_ip+':3306/'+db_name+'?'+'charset='+db_charset        self.engine = create_engine(self.db_str, encoding='utf-8', echo=False)        self.dbsession = sessionmaker(bind=self.engine)            def return_dbsession(self):        return self.dbsession            def close_session(self):        self.session.close()
database = db(db_ip='127.0.0.1', db_name='data_utf', db_user='root', db_pass='root', db_charset='utf8')

处理post请求代码如下

class rcvRequest(tornado.web.Request):    session = scoped_session(database.return_dbsession())()    response = []    for ctt in session.query(table).filter(table.ID == id):        response.append(ctt)    self.write(str(response))    session.close()

还是建议找个ORM吧。你这样一个链接就请求一次搞不好数据服务就挂掉了。

不合理,每来一次请求就建立一次连接不是很浪费吗?
sqlalchemy可以很好的帮你管理连接池,找找资料,用连接池吧.

代码调整为以下这种方式是否合理?

def db(db_ip='',db_name='',db_user='',db_pass='',db_charset=''):        db_str = 'mysql+pymysql://'+db_user+':'+db_pass+'@'+db_ip+':3306/'+db_name+'?'+'charset='+db_charset        engine = create_engine(self.db_str, encoding='utf-8', echo=False)        dbsession = sessionmaker(bind=self.engine)        return dbsessiondatabase =db(db_ip='127.0.0.1', db_name='data_utf', db_user='root', db_pass='root', db_charset='utf8')        class rcvRequest(tornado.web.Request):    def initialize(self):        self.session = scoped_session(database)()            @tornado.gen.coroutine    def post(self):        response = []        for ctt in self.session.query(table).filter(table.ID == id):            response.append(ctt)        self.write(str(response))        def on_finish(self):        self.session.close()

请参考
https://github.com/PyMySQL/To...

编橙之家文章,

评论关闭