В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Лично мне нравится использовать плотно ограниченные по объему соединения; откройте их поздно, используйте их и закройте их (в блоке "использования", всех в рамках локального метода). Организация пула подключений будет иметь дело с многократным использованием соединения в большинстве случаев, таким образом, не будет никаких реальных издержек в этом подходе.
основное преимущество мимоходом соединения использовали , чтобы быть так, чтобы Вы могли раздать транзакцию; однако, TransactionScope
более простой способ совместно использовать транзакцию между методами.
, Так как классы являются конкретной реализацией, я записал бы каждому для открытия своей собственной собственной транзакции. Иначе можно использовать методы фабрики ado.net создать соответствующий тип из файла конфигурации (имя поставщика).
Лично, мне нравится хранить стопку моего текущего открытого соединения и транзакций сверху Локальная память потока использование 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
}
В автоматизированных целях тестирования обычно легче передать его в. Это называют внедрение зависимости .
, Когда Вам нужно к тестам записи, можно создать ложный объект соединения с базой данных и передачу это вместо реального. Тем путем Ваши автоматизированные тесты не будут полагаться на фактическую базу данных, которая должна быть повторно заполнена с данными каждый раз.
Я лично работаю для централизации моего доступа к данным как можно больше, однако, если не возможный я ВСЕГДА открываю новое соединение в других классах, поскольку я нахожу, что существует слишком много других вещей, которые могут помешать при передаче объекта фактического соединения.
Вот немного больше понимания этой проблемы. У меня есть класс, который управляет подключениями дб, и имейте 2 класса, которые реализуют интерфейс. Один из классов для SQL, и другой имеет OLAP. Менеджер является тем, который знает, какое соединение использовать, таким образом, это могло передать точное соединение с типом или типом, может создать его собственное соединение.
Можно передать объекты соединения без любой проблемы (например, Библиотека Microsoft Enterprise позволяет передачу вызовов статического метода в соединении), или Вы могли управлять им внешне до Вашего дизайна, нет прямых технических компромиссов.
Быть осторожными для мобильности для не передачи определенного соединения, если решение будет портировано к другим базам данных (значение donВґt передают SqlConnection это, Вы планируете работать с другими базами данных)
Установка соединения является потенциально дорогой и потенциально добавляет распространение в прямом и обратном направлениях. Так, снова, потенциально, лучший дизайн должен передать объект соединения.
я говорю потенциально, потому что, если Вы - приложение Microsoft ADO, Вы, вероятно, используете пул соединения....
Я предложил бы, чтобы Вы различали объект соединения и его состояние (открытый, закрытый).
у Вас может быть отдельный метод (или свойство), который читает строку подключения из web.config. Используя ту же версию строки подключения каждый раз гарантирует, что Вы извлечете выгоду из организации пула подключений.
Вызов, что метод, когда необходимо открыть соединение. В самый последний момент, после установки всех свойств SqlCommand, открывают соединение, используют его, и затем закрывают его. В C# можно использовать оператор использования, чтобы удостовериться, что соединение закрывается. В противном случае обязательно окружите соединение наконец блок.
Я использовал бы 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>
Тогда, можно сослаться на него отовсюду в приложении