2010-07-30 9 views
7

Her istek üzerine bir Oracle veritabanına bağlanan bir .Net hizmeti var. Başlangıçta iyi çalışıyor, ancak bazı isteklerimden sonra almaya başladım:Oracle.DataAccess.Client.OracleException ORA-03135: bağlantı kesildi kontak

Oracle.DataAccess.Client.OracleException ORA-03135: connection lost contact 
    at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure) 
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader() 
    at MyApp.Services.OracleConnectionWithRetry.ExecuteReader(OracleCommand command) 
    ... 

Sorun ne olabilir? Tüm bağlantıları, sonuçları ve parametreleri imha ediyorum. Bu servisin yükü iyi, çok düşük.

+0

, siz (zaten açık ise yani hiçbir şey) programlı bağlantı durumunu kontrol VEYA web.config'de = true Doğrulama Bağlantı ayarını VEYA ikisi ile bu sorunu çözdünüz? –

+2

Merhaba @Luke, ben kişisel düzeyde bu sorunu "çözüldü" - Ben ne yazık ki yeterince akıllı o yoldan değil aşağı gidemez, doktora :) – Grzenio

+0

hehe tebriklerini yapmak işimi bıraktım;) –

cevap

11

Olur. ODP.NET, müşteriye gönderilen bağlantının bağlantı durumunu test etmez.

Yani güvende olmak için, ya bir Connection.Open()

VEYA

izin ODP.NET yaptığınızda havuzundan alınan bağlantı için connection status == Open kontrol ayarlayarak sizin için kontrol yapmak Web.config dosyasındaki bağlantı dizenizde Validate Connection = true. onlar, bağlantı durumunu veritabanına bağlanmak için gereken her test ederken

Hem bu yöntemler performansı üzerinde etkisi vardır. Kullandığım

Üçüncü bir seçenek istisnalar kullanılmasıdır. İlk önce iyimser olun ve bağlantı havuzundan whateven bağlantısı kullanılmalıdır. Bir ORA - 3135 alırsanız, yeni bir bağlantı isteğinde bulunun ve sorgunuzu bir süre döngü gibi tekrar çalıştırın. En iyi durumda, 1. bağlantınızı geçerli olarak alabilirsiniz ve sorgunuz yürütülür. En kötü durumda, havuzunuzdaki tüm bağlantılar eskidir, bu durumda kod N zamanı (N bağlantı havuzu boyutu) olarak yürütülür. sadece meraktan

+0

İyi bir çözüm olması için Doğrulama Bağlantısı seçeneğini buldum. Uygulamam için ortalama olarak yaklaşık% 20 ek yük ekledi. Çok önemsiz sorgular yaparsanız daha yüksek olurdu. Ayrıca, bağlantı durumunu kontrol etmek için bazı ek yükler var, sunucuya gidiş gelişi içerebileceğini düşünüyorum. Bağlantıda her seferinde bağlantıyı denetlememde bağlantı dizesindeki Bağlantı Doğrulama seçeneğini ayarlamaktan daha hızlı bir şekilde kontrol etmek daha hızlı değildi. –

+0

Bunun için başlangıçta kontrol etmekten kaçının. Sahip olduğunuz bağlantıya geçin. Mevcut olanın başarısız olması durumunda yeni bir bağlantı kurun. – sandyiit

+0

Bağlantı Dizesi'nde Doğrulama Bağlantısını yerleştirmek istediğinizde, ORA dosyasında veya app.config dosyasında mı konuşuyorsunuz? – William

2

Bunun da olduğunu gördüm; bağlantı dizesinde "Pooling = false" ile bağlantı havuzunu kapatmayı deneyin. Havuzda boşta kalan bağlantıların süresinin dolduğuna dair bir teorim var, ancak ODP.NET onların kullanım süresinin dolduğunu fark etmiyor ve daha sonra uygulamanız bir tanesini alıp bir şey yapmaya çalıştığında bu istisnayı alıyorsunuz. kodunuzu Oracle Connection Pool ve bağlantı havuzundan bağlantı istediğinde Oracle DB bağlantısı kesilmiş/bayat bağlantıyı döndürdüğü için

+0

Birisi, bunun veritabanı geri döndükten sonra gerçekleşeceğini de önerdi. – Grzenio