Реферат: Менеджер подключений к базам данных

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
Бесплатно скачать Реферат: Менеджер подключений к базам данных