2009-06-03 1 views
2

У меня есть фрагмент кода, похожий на тот, ниже, что я хотел бы реорганизовать в две различные функции каждых со своим собственным соединением (для лучшего обслуживания):В классическом ASP существуют ли существенные последствия, связанные с открытием и закрытием нескольких соединений?

Dim Conn, Sql, RS 

Set Conn = Server.CreateObject("ADODB.Connection") 
    Conn.Open ConnString 

Sql = SELECT * FROM CLIENTS 

Set RS = Conn.Execute(sql) 
//'Do something with Clients 

Set RS = Nothing 

Sql = SELECT * FROM DEALERS 

Set RS = Conn.Execute(sql) 
//'Do something with Dealers 

Set RS = Nothing 

Conn.Close 
Set Conn = Nothing 

Воли, имеющей две функции (например, GetClients и GetDealers) каждое открытие и закрытие собственных соединений имеет большой успех, напротив, только открытие и закрытие единственного соединения, как показано выше? Если да, как бы вы реорганизовали код?

ответ

4

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

+0

Вы уверены в этом? Он говорит классический asp, а не asp.net. –

+0

AFAIk Это не так, в отличие от подключения ASP.NET. Классические ASP-соединения не объединяются автоматически. –

+0

Он использует объекты ADO, которые косвенно используют ODBC 3.0, поэтому я считаю, что он выиграет от пула соединений. –

0

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

Лучшим способом сделать это было бы передать единственный открытый объект соединения в каждую из функций GetClients и GetDealers.

+0

Почему, по вашему мнению, хорошая идея сохранить соединение открытым? –

+0

Это одна школа мысли: используйте 1 соединение на всю жизнь 1 запроса. Поскольку количество запросов ограничено # потоками, доступными для приложения IIS, и, как правило, они еще более ограничены, чем соединения db, вы обычно не сталкиваетесь с проблемами, пока соединение будет выпущено в конце запроса. –

+0

Джоэл, вы предполагаете, что веб-приложение - единственное, что попадает в базу данных. Я бы рекомендовал поддерживать открытые соединения как можно короче, через отключенные наборы записей. – RedFilter

0

Соединения объединены автоматически, поэтому стоимость очень мала.

Это не ноль. Каждый раз, когда вы вытаскиваете соединение из пула и снова открываете его, вы отправляете команду sp_reset_connection на SQL Server. Это невероятно дешево, поэтому я бы не стал беспокоиться об этом.

Сторона примечания: Одно соединение ADODB.Connection может представлять собой несколько соединений с базой данных. Если вы попытаетесь использовать один и тот же, чтобы открыть второй набор записей, все еще прочитав с первого, есть шанс, что он создаст новый в фоновом режиме. Опять же, это не настоящая проблема, это то, что вы должны знать.

0

Пул соединений доступен с классическим ASP. Я бы реорганизовал этот код для использования метода, который принимает строку подключения, и как можно быстрее откроет и закроет соединение внутри этого метода.

По крайней мере, поскольку использование соединения связано с тем, что вы не используете отключенные наборы записей (которые ADO.NET реализует по умолчанию). Отключенные наборы записей позволяют закрыть соединение и вернуть его в пул, как только вы выполнили свой запрос, вместо того, чтобы ждать, пока вы повторите его через набор записей.

Вот как вы это сделаете в JScript; она должна быть простой в порт на VBScript:

var sql = "select * from MyTable"; 
var cn = new ActiveXObject("ADODB.Connection"); 
var rs = new ActiveXObject("ADODB.Recordset"); 
var nothing = rs.ActiveConnection; 
cn.Open(connectString); 
rs.CursorLocation = 3; //adUseClient 
rs.Open(sql, cn, 3, 1); 
rs.ActiveConnection = nothing; 
cn.Close(); 
//now do something with disconnected rs 
+0

Этот подход действительно должен быть переоценен в свете современного оборудования. Сколько соединений слишком много на современном SQL Server? Также стоит подумать о том, что клиентский курсор имеет значительную стоимость памяти на веб-сервере, но большинство SQL-запросов на основе ASP может выполняться со стандартным набором строк «firehose» только для прямого просмотра, который имеет очень небольшой размер памяти для сравнения. – AnthonyWJones

+0

Для меня ключевая проблема заключается в том, что гораздо проще масштабировать веб-серверы, чем серверы баз данных, поэтому важно минимизировать влияние на сервер базы данных. – RedFilter

1
  1. Не используйте SELECT *, но указать столбцы вам нужно.
  2. Use getrows.
  3. Укажите, что вы хотите иметь в базе данных (используйте предложения join и where).

Когда вы сделаете все это, ваш код будет оптимальным.

+0

большой +1 для "JOIN"! – Szocske

0

Соединения должны быть объединены

 Смежные вопросы

  • Нет связанных вопросов^_^