Чистка внутреннего pysqlite соединения на объектном разрушении

Если вы хотите очень простой переход привязки, который работает после маршрутизации и в маршрутизируемых представлениях, вы также можете использовать ng2-simple-page-scroll .

Go there

Или сразу после маршрутизации:

Go there

Это делает простой мгновенный прыжок, но это работает.

7
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Вы можете создать модуль подключения, поскольку модули сохраняют один и тот же объект во всем приложении, и зарегистрировать функцию для его закрытия с помощью модуля atexit

# db.py:
import sqlite3
import atexit

con = None

def get_connection():
    global con
    if not con:
        con = sqlite3.connect('somedb.sqlite')
    atexit.register(close_connection, con)
    return con

def close_connection(some_con):
    some_con.commit()
    some_con.close()

# your_program.py
import db
con = db.get_connection()
cur = con.cursor()
cur.execute("SELECT ...")

Это предложение основан на предположении, что соединение в вашем приложении выглядит как единственный экземпляр (singleton), который хорошо предоставляет глобальный модуль.

Если это не так, то вы можете использовать деструктор.

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

Кроме того, то, что вы сказали о C ++, неверно. Если вы используете деструкторы в C ++, они вызываются либо после завершения блока, определяющего объект (например, в python с ), либо когда вы используете ключевое слово delete (которое освобождает объект, созданный с помощью новый ). Вне этого вы должны использовать явный close () , который не является деструктором. Это похоже на python - python даже «лучше», потому что у него есть сборщик мусора.

5
ответ дан 6 December 2019 в 23:12
поделиться

Прочтите с оператором . Вы описываете его вариант использования.

Вам необходимо обернуть ваше соединение в класс «Диспетчер контекста», который обрабатывает методы __ enter __ и __ exit __ , используемые ] с оператором .

См. PEP 343 для получения дополнительной информации.


Изменить

«мой объект не используется так же просто, как открытие-воспроизведение-закрытие, но сохраняется как членом другого, более крупного объекта »

class AnObjectWhichMustBeClosed( object ):
    def __enter__( self ):
        # acquire
    def __exit__( self, type, value, traceback ):
        # release
    def open( self, dbConnectionInfo ):
        # open the connection, updating the state for __exit__ to handle.

class ALargerObject( object ):
    def __init__( self ):
        pass
    def injectTheObjectThatMustBeClosed( self, anObject ):
        self.useThis = anObject

class MyGuiApp( self ):
    def run( self ):
        # build GUI objects
        large = ALargeObject()
        with AnObjectWhichMustBeClosed() as x:
            large.injectTheObjectThatMustBeClosed( x )
            mainLoop()

. Некоторые называют это« Внедрение зависимостей »и« Инверсия управления ». Другие называют это паттерном Стратегия . «ObjectThatMustBeClosed» - это стратегия, подключенная к более крупному объекту. Сборка создается на верхнем уровне приложения с графическим интерфейсом, поскольку это '

6
ответ дан 6 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: