ADO ve sqlservr.exe bellek şişmesi

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
tolgaozb
Üye
Mesajlar: 70
Kayıt: 26 Ara 2003 12:22
Konum: Karşıyaka
İletişim:

ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen tolgaozb »

Selamlar
Yoğun SQL komutlarının olduğu programımda MSSQL' bağlanmak ve işlem yapmak için ado kullanıyorum.
Ado komutlarını aşağıdaki fonksiyon ile merkezileştirdim.Bu fonksiyon ile programın her yerinden SQL komutu gönderip
dataset alıyorum eğer komut sonucu boş ise nil değeri dönüyor.Bu yüzden finally kısmında sorgu objesini free edemiyorum.
Asıl sorun arka arkaya bu fonksiyon ile komut çalıştırdığımda görev yöneticisindeki sqlservr.exe programının geri gelmemek üzere şişmesi.
Her komutta beşer onar mb şişmekte.Komutlardan sonra ne kadar sorgu sonucu dönen DAtaSeti kapatsam ya da free etsem de fayda yok.
Bir süre sonra sqlservr.exe gigabaytlar seviyesine geliyor ve program Out of memory pozisyonuna geçiyor.
Biliyorum ki çoğu kişi ado kullanıyor bu konuda yardımcı olacaklara şimdiden teşekkürler
Bu konuyu forumda çok aradım ama bulamadım.Eğer link kaynak vs. var ise çok memnun olurum.
Teşekkürler şimdiden..

function TfrmDMInterface_SQL.runQuery(sql: String): TDataSet;
var
sorgu : TADOQuery;
begin
Result := nil;
try
sorgu := TADOQuery.Create(self);
sorgu.ConnectionString := connection_string;
sorgu.sql.Clear;
sorgu.sql.Add(sql);
sorgu.Open;
if not sorgu.Eof then
Result := sorgu
else
begin
sorgu.Close;
FreeAndNil(sorgu);
end;
finally

end;
end;
T.Tolga Özbaltalar - http://www.veridizayn.com
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen mrmarman »

Öncelikle kodlarını CODE tagı içine almadığında okunması zorlaşıyor.

Demişsin ki, eğer sorgu kayıt içeriyorsa RESULT olarak TDataSet halinde sunulsun deyip CREATE edilmiş halde burakıyorsun.
Bu fonksiyonu çağırdığın yerde işin bittiğinde RESULT olarak aldığın DataSet'i FREE ediyor musun ?

Buradan görünmüyor.
Resim
Resim ....Resim
Kullanıcı avatarı
tolgaozb
Üye
Mesajlar: 70
Kayıt: 26 Ara 2003 12:22
Konum: Karşıyaka
İletişim:

Re: ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen tolgaozb »

Result olarak dönen TDataSet objesini FreeAndNil komutu ile serbest bırakıyorum.
T.Tolga Özbaltalar - http://www.veridizayn.com
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen mrmarman »

Sorunda bu görünmüyordu ondan sordum. Peki ardışık olarak (FreeAndNil edilmeye fırsat kalmadan) kaç sorgu yapılıyor her sorgu için CREATE edilen nesne sayısı nedir ? Bir döngü vs içinden bunu çağırıyorsan hiç de rantable bir uygulama değil. Döngü içerisinde artarda Create/FREE işlemi yapmak yerine döngüden önce CREATE döngüden çıkınca FREE edecek şekilde düzenlemek gerekir.

Projenin kaynak kodlarına dönüp bu bakış açısı ile yeniden değerlendirmeni salık veririm.
Resim
Resim ....Resim
Kullanıcı avatarı
tolgaozb
Üye
Mesajlar: 70
Kayıt: 26 Ara 2003 12:22
Konum: Karşıyaka
İletişim:

Re: ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen tolgaozb »

Evet kodlarımda döngüyü örneğin reapat until yapısını çok kullanırıım. SQL ile bir dataset çeker bunun içinde tek tek dolaşarak gerekli işlemleri yaparım bu işlemeler başka işlemleri doğurabilir. Bu da freeandnil i her an kullanmamı engeller çünkü üzerinde gezindiğini dataseti hemen free etmem mümkün olmaz.Fakat burada başka bir problem var diye düşünüyorum yani sıfırdan bir proje açıp bir timer için yukardaki kodu yazdığımda 5 saniyede bir select et sonra freeandfil yap dediğimde yine sqlservr.exe nin görev yöneticisinde şiştiğini görüyorum.Ancak timeri kapatıp programı hiç kullanmazsam bir süre ya da program kapandığında sqlservr.exe boyutu bir süre sonra düşüyor. Kısacası başka bir sorun var gibi .Çözüm olarak sql servisi kapatıp açtırmayı düşünüyorum ama kullanıcının bilgisayarında başka sql uygulaması var ise zarar görebilir durumu da var.
T.Tolga Özbaltalar - http://www.veridizayn.com
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen thelvaci »

Her bir sorgu için ConnectionString atayarak her bir sorgunun ayrı bir connection üzerinden çalışmasını sağlıyorsunuz. Veritabanı programlamanın en maliyetli işlemidir connection oluşturulması. ConnectionString yerine ilgili nesnenin Connection property'sine mevcut ve açık olan bir TADOConnection geçmeyi denemenizde fayda olur. Ayrıca; TADOQuery bileşeni çok eski zamandan kalma ara bir bileşendir, BDE -> ADO geçişinin sağlanabilmesi amacı ile vardır. TADOQuery yerine TADODataSet kullanmanız daha yerinde olur. Aslında bana sorarsanız projeniz içinde asla SQL cümlecikleri kullanmayın herşeyi stored procedure'ler ile halledin derim ama maalesef bu bir disiplin meselesi ve bu yararlı alışkanlığı kazanan insan sayısı son derece sınırlı.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen Kuri_YJ »

Selamlar, (KafSinKaf)

MS-SQL Server'a herhangi bir yerden (bu illa ki senin programın olmak zorunda değil) Query Analyzer'dan da programda kullandığın Query'leri yazıp çalıştırırsan MS-SQL Server DB'yi Memory'e çekmeye başladığı için bir süre sonra şişer. Bunu engellemek için Bellek Kullanma sınırlamasını Management Tool'dan yaparsan bu sorun ile karşılaşmazsın. Ama Query'lerin zamanla yavaşlar. Bu RDBMS'lerdeki bellek yönetimini ve Indexlerin tabloların kullanımları dahil olan performans konusu alanına girer. Buralarda ne yapabilirsin neler yapmalısın. Bu konularda bilgi edinmek istiyorsan, her ne kadar Firebird'ü anlatmış olsak da Firebird Seminerlerini baştan sona izlemeni tavsiye ederim. Orada pek çok trick nokta anlatmıştım. Stored Procedure View ıvır zıvır performans, bellek kullanımı B-Tree Index Page vs. bir çok konuda özet ve Nokta atışı bilgileri bulabilirsin.

Karşıyaka'ya selamlar.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: ADO ve sqlservr.exe bellek şişmesi

Mesaj gönderen Kuri_YJ »

Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla