2015-03-14 2 views
2

У меня есть api, я написал в колбе. Он использует sqlalchemy для работы с базой данных mysql. Я не использую flask-sqlalchemy, потому что мне не нравится, как модуль заставляет вас в определенный шаблон для объявления модели.sqlalchemy mysql соединения не закрываются на колбе api

У меня возникла проблема, когда мои соединения с базой данных не закрываются. Объект, представляющий соединение, выходит за пределы области видимости, поэтому я предполагаю, что это сбор мусора. Я также явно вызываю close() в сеансе. Несмотря на эти факты, соединения остаются открытыми задолго до того, как ответ api вернул ответ.

sqlsession.py: Вот оболочка, которую я использую для сеанса.

class SqlSession: 
    def __init__(self, conn=Constants.Sql): 
     self.db = SqlSession.createEngine(conn) 

     Session = sessionmaker(bind=self.db) 
     self.session = Session() 
    @staticmethod 
    def createEngine(conn): 
     return create_engine(conn.URI.format(user=conn.USER, password=conn.PASS, host=conn.HOST, port=conn.PORT, database=conn.DATABASE, poolclass=NullPool)) 

    def close(self): 
     self.session.close() 

flaskroutes.py: Ниже приведен пример создания флеш-приложения и использования объекта-обертки. Обратите внимание, что он запускает его в начале в рамках вызова api, а затем закрывает сеанс в конце и предположительно представляет собой мусор, собранный после ответа ответа.

def commands(self, deviceId): 
    sqlSession = SqlSession(self.sessionType) <--- 

    commandsQueued = getCommands() 
    jsonCommands = [] 
    for command in commandsQueued: 
    jsonCommand = command.returnJsonObject() 
    jsonCommands.append(jsonCommand) 
    sqlSession.session.delete(command) 
    sqlSession.session.commit() 
    resp = jsonify({'commands': jsonCommands}) 
    sqlSession.close() <--- 
    resp.status_code = 200 
    return resp 

Я бы ожидать, что соединения, которые будут очищены, как только ответ HTTP сделан, но вместо этого соединения в конечном итоге с «спящем» состоянии (если смотреть в командной MySQL строки интерфейса «SHOW PROCESSLIST») ,

ответ

1

Я закончил с использованием совета от этого SO сообщения: How to close sqlalchemy connection in MySQL

Я настоятельно рекомендую прочитать этот пост для тех, кто с этой проблемой. В принципе, я добавил вызов dispose() методу close. Это приводит к уничтожению всего соединения, а закрытие просто возвращает соединения к доступному пулу (но не дает им открыться).

def close(self): 
    self.session.close() 
    self.db.dispose() 

Все это было немного сбивает с толку, но по крайней мере теперь я больше понимаю о пуле соединений.

+0

Это не ответ, даже если он связан с одним. Поместите фактические данные о том, как вы решили свою проблему в самом ответе. – davidism

+0

Благодарим вас за редактирование. Я также хотел бы получить лучший ответ на фляжку, иначе это будет всего лишь дубликат http://stackoverflow.com/questions/8645250/how-to-close-sqlalchemy-connection-in-mysql. – bufh

Смежные вопросы