В Classic ASP, есть ли серьезные последствия для производительности, когда несколько соединений открываются и закрываются? - PullRequest
2 голосов
/ 04 июня 2009

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

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), открывающие и закрывающие свои собственные соединения, основной удар по производительности, а не только открытие и закрытие одного соединения, как показано выше? Если да, то как бы вы изменили код?

Ответы [ 6 ]

4 голосов
/ 04 июня 2009

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

1 голос
/ 04 июня 2009
  1. Не используйте select *, но укажите нужные столбцы.
  2. Используйте getrows .
  3. Укажите, что вы хотите получить из базы данных (используйте объединения и предложение where).

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

0 голосов
/ 05 июня 2009

соединения должны быть объединены в пул

0 голосов
/ 04 июня 2009

Пул соединений доступен с классическим 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 голосов
/ 04 июня 2009

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

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

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

0 голосов
/ 04 июня 2009

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

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

...