Ре лучших практик, совместно использующее IDbConnection или строку подключения / фабрика в Вашем коде .NET

Нет, ваши последовательности not равны!

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

var firstExpected = new[] { Convert.ToInt64(1), Convert.ToInt64(999999) };
var firstActual = new[] { Convert.ToInt64(1), Convert.ToInt64(999999) };
Console.WriteLine(firstExpected == firstActual); // writes "false"

Приведенный выше код сравнивает два отдельных массива для равенства. Равенство не проверяет содержимое массивов, проверяет ссылки на равенство.

Ваш код с использованием SequenceEquals, по сути, делает то же самое. Он проверяет ссылки в каждом случае каждого элемента в перечислимом.

18
задан Karol Kolenda 5 January 2009 в 19:29
поделиться

4 ответа

Я должен был для раздавания объекта соединения, таким образом, я мог позволить нескольким бизнес-объектам сохранять себя к базе данных в единственной транзакции.

, Если бы каждый бизнес-объект должен был создать свой собственный SQLConnection к базе данных, транзакция возросла бы к распределенной транзакции, и я хотел избежать этого.

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

Вот некоторый код как пример ConnectionManager:

public class ConnectionManager: IDisposable
{
    private ConnectionManager instance;

    [ThreadStatic]
    private static object lockObject; 
    private static Object LockObject
    {
        get
        {
            if (lockObject == null)
                lockObject = new object();
            return lockObject;
        }
    }

    [ThreadStatic]
    private static Dictionary<string, ConnectionManager> managers;
    private static Dictionary<string, ConnectionManager> Managers
    {
        get
        {
            if (managers == null)
                managers = new Dictionary<string, ConnectionManager>();
            return managers;
        }
    }

    private SqlConnection connection = null;
    private int referenceCount;
    private string name;


    public static ConnectionManager GetManager(string connectionName)
    {
        lock (LockObject)
        {
            ConnectionManager mgr;
            if (Managers.ContainsKey(connectionName))
            {
                mgr = Managers[connectionName];
            }
            else
            {
                mgr = new ConnectionManager(connectionName);
                Managers.Add(connectionName, mgr);
            }

            mgr.AddRef();
            return mgr;
        }
    }

    private ConnectionManager(string connectionName)
    {
        name = connectionName;
        connection = new SqlConnection(GetConnectionString(connectionName));
        connection.Open();
    }

    private string GetConnectionString(string connectionName)
    {
        string conString = Configuration.ConnectionString;
        return conString; 
    }

    public SqlConnection Connection
    {
        get { return connection; }
    }

    private void AddRef()
    {
        referenceCount += 1;
    }

    private void DeRef()
    {
        lock (LockObject)
        {
            referenceCount -= 1;
            if (referenceCount == 0)
            {
                connection.Dispose();
                Managers.Remove(name);
            }
        }
    }

#region IDisposable Members

    public void Dispose()
    {
        Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            DeRef();
        }
    }

    ~ConnectionManager()
    {
        Dispose(false);
    }

#endregion

}

Вот то, как я использовал бы его от бизнес-объекта:

public void Save()
{   
    using (ConnectionManager mrg = ConnectionManager.GetManager("SQLConnectionString")
    {
        using (SQLCommand cmd = new SQLCommand)
        {
            cmd.connection = mgr.Connection
            // More ADO Code Here
        }

        _childObject.Save(); //this child object follows the same pattern with a using ConnectionManager.
    }
}

я сохраняю бизнес-объект, и все его дети сохраняются также с помощью того же объекта соединения. Когда объем отпадает от исходного родителя, оператор использования закрывает соединение.

Это - шаблон, который я изучил от Rocky Lhotka в его платформе CSLA.

Keith

14
ответ дан 30 November 2019 в 09:07
поделиться

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

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

, Если Вы решаете позволить своим компонентам непосредственно открытые соединения дб тогда, вероятно, что жизненный цикл соединения будет слишком мелкомодульным и приведет ко многим, открываются/закрывают соединения для операции отдельного пользователя.

2
ответ дан 30 November 2019 в 09:07
поделиться

поставщик SQL Server ADO.NET делает саму организацию пула подключений. Можно управлять размером пула MinPoolSize и MaxPoolSize в строке подключения.

1
ответ дан 30 November 2019 в 09:07
поделиться

В вашем примере следует опасаться того, что приложения ASP.NET не должны использовать хранилище ThreadStatic, так как поток может быть использован повторно, и если вы не очистите все ваши объекты, то в конечном итоге соединение будет зависеть.

В приложении ASP.NET я бы вместо этого использовал коллекцию HttpContext.Items. Вы реализуете IDisposable, но я видел сценарии, в которых разработчики забывают вызвать Dispose или поместить код в use block.

.
1
ответ дан 30 November 2019 в 09:07
поделиться
Другие вопросы по тегам:

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