Закрытие соединения с БД DataMapper

мое приложение rails создает множество небольших баз данных sqlite, используя DataMapper. После сохранения данных .sqlite-файл необходимо загрузить на удаленный сервер и уничтожить локально.

Мой вопрос: как заставить DataMapper закрыть соединение .sqlite db и освободить память репо? Приложение должно генерировать множество баз данных, поэтому важно экономить ресурсы сервера.

Единственный способ, которым я гуглил, - это DataObjects::Pooling.pools.each do {|pool| pool.dispose}, который совершенно неприемлем для меня, я думаю, потому что он, кажется, закрывает все соединения DataMapper, однако несколько баз данных могут быть созданы в параллельных потоках, и я также хочу уничтожить репозиторий DataMapper.

Извините за мой английский.


person Andrei Kazakov    schedule 14.07.2010    source источник


Ответы (2)


Кроме того, DataMapper::Repository.adapters — это хэш текущих объектов репозитория. Возможно, вы сможете покопаться там, чтобы добраться до соединений.

person anonymous coward    schedule 16.10.2012

Я не знаю ни одного хорошего способа сделать это. Тем не менее, это обсуждение уместно:

http://www.mail-archive.com/[email protected]/msg02894.html

По-видимому, можно повторно открыть соединение с помощью DataMapper.setup(), но похоже, что закрытие соединений обрабатывается автоматически.

Однако, возможно, эти наблюдения помогут:

Можно сохранить ссылку на адаптер, например.

a = DataMapper.setup(:default, "sqlite:db/development.sqlite3")

Просмотр этого объекта показывает, что путь сохранен, подразумевая, что он предназначен для этого конкретного соединения, а не для адаптера SQLite в целом или такого:

p a

#<DataMapper::Adapters::SqliteAdapter:0x00000001aa9258 @name=:default, @options={"scheme"=>"sqlite", "user"=>nil, "password"=>nil, "host"=>nil, "port"=>nil, "query"=>nil, "fragment"=>nil, "adapter"=>"sqlite3", "path"=>"db/development.sqlite3"}, @resource_naming_convention=DataMapper::NamingConventions::Resource::UnderscoredAndPluralized, @field_naming_convention=DataMapper::NamingConventions::Field::Underscored, @normalized_uri=sqlite3:db/development.sqlite3?scheme=sqlite&user=&password=&host=&port=&query=&fragment=&adapter=sqlite3&path=db/development.sqlite3>

Предположительно, это можно как-то пометить для сборки мусора или что-то в этом роде (будет ли работать просто установка nil?).

В DataMapper::Adapters::DataObjectsAdapter также есть метод close_connection(), но он защищен, и я не уверен, можно ли его использовать и как.

Надеюсь, это дает некоторые указатели!

person tiredpixel    schedule 13.07.2011