2009-05-18 3 views
3

Я работаю над всем приложением, которое использует несколько потоков, которые обращаются к SQL Server SQL Server 2005, я в настоящее время использую неявные соединения, настроив свойство строки подключения объекта TADOQuery, но это, похоже, открывает много подключения к базе данных. Нам нужно уменьшить количество соединений, что один экземпляр держит открытым, такTADoConnection и pooling

  1. есть любой вид связи объединения имеющихся в библиотеке TADOConnection, и как я могу включить его и установить его пределы.
  2. Если нет, то какой рекомендуемый способ уменьшить и повторно использовать соединения с базой данных, чтобы приложение хорошо масштабировалось.

я был бы признателен за любые мнения или мысли ..

большое спасибо

+0

Попробуйте добавить MultipleActiveResultSets = True в строку подключения. Добавьте это как комментарий, потому что я не уверен, что он будет работать на Delphi. –

+0

Если я не ошибаюсь, это целая цель, стоящая за компонентом «TADOConnection», заключается в объединении соединений с базой данных в одном месте, а не в создании нескольких компонентов TADOQuery со своими собственными соединениями. Однако ответы здесь описывают некоторые странные разработки ADO. –

ответ

3

По умолчанию соединения базы данных ADO с SQL Server объединены без какой-либо работы, необходимой вам. Поведение пула может быть изменено вашей строкой соединения. Как выглядит ваша строка подключения?

Просто сохраните строку соединения точно так же и создайте/освободите соединение ADO в своем потоке и дайте ADO runtime обработать объединение. Количество соединений на процесс обычно равно максимальному количеству «недавних» одновременных соединений плюс несколько для буфера.

+0

Я знаю, что ado.net делает пул соединений по умолчанию, но делает ли это TADOConnection delphi тоже? Есть ли у вас какие-либо ссылки на любую связанную документацию? –

+0

TADOConnection - это оболочка Borland/CodeGear интерфейсов OLEDB от Microsoft. Вот ссылка http://blogs.msdn.com/selvar/archive/2007/11/10/ole-db-resource-pooling.aspx. Если вы посмотрите на ADODB, вы увидите эту упаковку этого Borland. Вы можете импортировать сам typelib и идти прямо, но гораздо проще использовать компоненты TADOxxx. –

1

Установка компонента TADOConnection на DataModule и используя, что из всех других компонентов ADO на DataModule уже должны уменьшить много из соединения. Если приложение использует большое количество datamodules, возможно, что эти datamodules используют одно и то же соединение во время выполнения.

+0

в моем случае несколько потоков будут обращаться к datamodule, будет ли tadoconnection открывать несколько запросов одновременно? –

+0

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

+0

Этот параметр уменьшает количество подключений к одному потоку, а не по одному запросу. Если в большинстве ваших потоков содержится только один запрос, это не приносит большой пользы. – skamradt

4

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

Скажем у вас есть код, как

db := TAdoConnection.Create() 
qry1 := TAdoQuery.Create(); 
qry2 := TAdoQuery.Create(); 

qry1.connection := db; 
qry2.connection := db; 

qry1.SQL.Text := 'select * from whatever'; 

qry1.open; 
while not qry1.eof do 
begin 
    x := qry1.fieldbyname('fld').AsString; 
    qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(x); 
    qry2.Open; 
    ..do something.. 
    qry2.Close; 

    qry1.Next; 
end; 

qry2.Open() будет вызывать другое соединение будет создано , не объедин ли

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

Грубо говоря, это выглядит как:

db := TAdoConnection.Create() 
qry1 := TAdoQuery.Create(); 
qry2 := TAdoQuery.Create(); 
str := TStringList.Create(); 

qry1.connection := db; 
qry2.connection := db; 

qry1.SQL.Text := 'select * from whatever'; 

qry1.open; 
while not qry1.eof do 
begin 
    x := qry1.fieldbyname('fld').AsString; 
    str.Add(x); 
    qry1.Next; 
end; 
qry1.Close; 

for i := 0 to str.Count-1 do 
begin 
    qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(str[i]); 
    qry2.Open; 
    ..do something.. 
    qry2.Close; 
end 
1

Microsoft говорит: "... чтобы отключить OLE DB Resource Pooling, который использует ADO по умолчанию ... вы можете сделать, добавив" OLE DB Services = -2 "в строку соединения ADO".

Вот ссылка: http://support.microsoft.com/kb/229564

Это очень полезно, когда клиентское приложение использует роль приложения.