передача соединения с БД возражает против методов

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

21
задан DOK 28 April 2011 в 12:35
поделиться

9 ответов

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

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

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

13
ответ дан 29 November 2019 в 20:56
поделиться

Лично, мне нравится хранить стопку моего текущего открытого соединения и транзакций сверху Локальная память потока использование SetData и GetData. Я определяю класс, который управляет моими подключениями к базе данных, и позвольте ей использовать расположить шаблон. Это сохраняет меня потребность раздать соединения и транзакции, который является чем-то, что я думаю помехи, и усложняет код.

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

, Таким образом, я заканчиваю тем, что имел что-то вдоль этих строк (полностью непротестированный):

class DatabaseContext : IDisposable {

    List<DatabaseContext> currentContexts;
    SqlConnection connection;
    bool first = false; 

    DatabaseContext (List<DatabaseContext> contexts)
    {
        currentContexts = contexts;
        if (contexts.Count == 0)
        {
            connection = new SqlConnection(); // fill in info 
            connection.Open();
            first = true;
        }
        else
        {
            connection = contexts.First().connection;
        }

        contexts.Add(this);
    }

   static List<DatabaseContext> DatabaseContexts {
        get
        {
            var contexts = CallContext.GetData("contexts") as List<DatabaseContext>;
            if (contexts == null)
            {
                contexts = new List<DatabaseContext>();
                CallContext.SetData("contexts", contexts);
            }
            return contexts;
        }
    }

    public static DatabaseContext GetOpenConnection() 
    {
        return new DatabaseContext(DatabaseContexts);
    }


    public SqlCommand CreateCommand(string sql)
    {
        var cmd = new SqlCommand(sql);
        cmd.Connection = connection;
        return cmd;
    }

    public void Dispose()
    {
        if (first)
        {
            connection.Close();
        }
        currentContexts.Remove(this);
    }
}



void Test()
{
    // connection is opened here
    using (var ctx = DatabaseContext.GetOpenConnection())
    {
        using (var cmd = ctx.CreateCommand("select 1"))
        {
            cmd.ExecuteNonQuery(); 
        }

        Test2(); 
    }
    // closed after dispose
}

void Test2()
{
    // reuse existing connection 
    using (var ctx = DatabaseContext.GetOpenConnection())
    {
        using (var cmd = ctx.CreateCommand("select 2"))
        {
            cmd.ExecuteNonQuery();
        }
    }
    // leaves connection open
}
10
ответ дан 29 November 2019 в 20:56
поделиться

В автоматизированных целях тестирования обычно легче передать его в. Это называют внедрение зависимости .

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

8
ответ дан 29 November 2019 в 20:56
поделиться

Я лично работаю для централизации моего доступа к данным как можно больше, однако, если не возможный я ВСЕГДА открываю новое соединение в других классах, поскольку я нахожу, что существует слишком много других вещей, которые могут помешать при передаче объекта фактического соединения.

1
ответ дан 29 November 2019 в 20:56
поделиться

Вот немного больше понимания этой проблемы. У меня есть класс, который управляет подключениями дб, и имейте 2 класса, которые реализуют интерфейс. Один из классов для SQL, и другой имеет OLAP. Менеджер является тем, который знает, какое соединение использовать, таким образом, это могло передать точное соединение с типом или типом, может создать его собственное соединение.

1
ответ дан 29 November 2019 в 20:56
поделиться

Можно передать объекты соединения без любой проблемы (например, Библиотека Microsoft Enterprise позволяет передачу вызовов статического метода в соединении), или Вы могли управлять им внешне до Вашего дизайна, нет прямых технических компромиссов.

Быть осторожными для мобильности для не передачи определенного соединения, если решение будет портировано к другим базам данных (значение donВґt передают SqlConnection это, Вы планируете работать с другими базами данных)

1
ответ дан 29 November 2019 в 20:56
поделиться

Установка соединения является потенциально дорогой и потенциально добавляет распространение в прямом и обратном направлениях. Так, снова, потенциально, лучший дизайн должен передать объект соединения.

я говорю потенциально, потому что, если Вы - приложение Microsoft ADO, Вы, вероятно, используете пул соединения....

1
ответ дан 29 November 2019 в 20:56
поделиться

Я предложил бы, чтобы Вы различали объект соединения и его состояние (открытый, закрытый).

у Вас может быть отдельный метод (или свойство), который читает строку подключения из web.config. Используя ту же версию строки подключения каждый раз гарантирует, что Вы извлечете выгоду из организации пула подключений.

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

1
ответ дан 29 November 2019 в 20:56
поделиться

Я использовал бы web.config

<configuration>
    <connectionStrings>
        <add name="conn1" providerName="System.Data.SqlClient" connectionString="string here" />
        <add name="conn2" providerName="System.Data.SqlClient" connectionString="string here" />
    </connectionStrings>
</configuration>

Тогда, можно сослаться на него отовсюду в приложении

0
ответ дан 29 November 2019 в 20:56
поделиться
Другие вопросы по тегам:

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