Реферат: Менеджер подключений к базам данных
DbManager.Mode = DbManagerMode.DoNotCacheConnections;
DbManager dbmgr =DbManager.Get();
IDbConnection c1 = dbmgr["beta"];
IDbConnection c2 = dbmgr["beta"];
Assert.IsTrue( c1 != c2 ); // Менеджер возвращает разные экземпляры
Подобная функциональность позволила бы разработчику легко выбирать между двумя описанными выше вариантами работы с подключениями, и даже без больших сложностей перейти с одного подхода на другой в уже частично написанном приложении.
Многопоточность
Ранее мы рассматривали приложение, в котором есть только один поток (thread). Какие сложности могут встретиться, если потоков будет несколько?
По сути, сложность здесь только одна – один объект подключения можно одновременно использовать только в одном потоке. Если для каждого обращения создается новый объект подключения, то нас эта проблема совершенно не касается. Соответственно, менеджер подключений, работающий в этом режиме, очень прост в реализации. Метод, возвращающий объект подключения по имени, может выглядеть так:
public override IDbConnection this[String name] { get { ConnectionInfo info = (ConnectionInfo)_config.Connections[name]; if( info != null ) { return CreateConnection( info ); } return null; } } |
Несколько более сложно выглядят действия при кэшировании объектов подключения. С одной стороны, нужно организовать некий словарь готовых объектов, из которого выдаются объекты по запросу. С другой стороны, мы должны сделать так, чтобы каждый поток работал со своим экземпляром данного подключения. Пытаться реализовать такую функциональность в одном объекте, обслуживающем сразу все потоки, может быть слишком сложно. Поэтому предлагается сделать так, чтобы каждый экземпляр менеджера обслуживал только один поток. Очевидно, что в этом случае создается некоторое неопределенное количество экземпляров, не большее, чем общее количество потоков в приложении. Неопределенность обусловлена тем, что для потоков, в которых менеджер не требуется, создавать экземпляр не нужно.
Таким образом, нужно, во-первых, написать такой метод Get, который бы возвращал экземпляр, приписанный к вызывающему потоку, и, во-вторых, сделать словарь готовых объектов. Приблизительно так может выглядеть этот фрагмент кода:
[ThreadStatic] private static DbManager _instance; private ListDictionary _connections = new ListDictionary(); internal static new DbManager Get() { // Если экземпляр уже есть, вернуть его if( _instance != null ) return _instance; К-во Просмотров: 302
Бесплатно скачать Реферат: Менеджер подключений к базам данных
|