Düzeltme: Parametreli komut gelen ADO kullanarak bağlantı sızıntısı

ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.

247757
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Belirtiler
Sonuçta, Windows Foundation Classes (WFC) Java ADO ve açma için parametreleştirilmiş bir komut kullanarak bir recordset nesnesi, düzgün biçimde kapatıldı bağlantıları düzgün havuza geri dönüştürülüyor ve kullanırken, bağlantı sızdırılmış. Bu soruna geçici bir çözüm bulmak için <a0></a0>, ADO bağlantısı, Java COM nesnesinde kapattıktan sonra System.GC () arayın. Normal koşullarda, System.GC () bir ADO bağlantısı, bağlantı serbest olarak kapattıktan sonra call gerekmez.
Çözüm
Bu sorun en son hizmet paketleri Windows 2000 ve MDAC 2.5 düzeltildi.
  • Bu sorunu gidermek için, en son Windows 2000 hizmet paketini edinin. Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
    260910En son Windows 2000 hizmet paketi nasıl elde edilir
  • Bu sorunu gidermek için <a0></a0>, Microsoft Data Access Components 2.5 için en son hizmet paketini edinin. Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
    293312BILGI: son MDAC 2.5 nasıl elde edilir hizmet paketi
Bu düzeltmenin ingilizce sürümünde aşağıdaki dosya öznitelikleri olmalı veya daha yenisi:
File name       Date        Size      Version      -----------------------------------------------------Msado15.dll     1/26/2000   329KB     2.12.4926.0				
Durum
Microsoft, Microsoft Data Access Objects2.1 SP2 ve 2.5 bir sorun olduğunu onaylamıştır. Bu sorun ilk olarak Microsoft Data Access Components 2.5 Service Pack 2 ve Windows 2000 Service Pack 2'de giderilmiştir.
Daha fazla bilgi
Bağlantı/oturum sorunu havuzu, aşağıdaki koşulların tümü geçerli olduğunda oluşur:
  1. Microsoft Data Access Objects 2.1 SP2 yüklüdür.
  2. Parametreli hale getirilmiş bir ADO Command nesnesi kullanılır.
  3. Java COM nesnesi, MTS veya COM + barındırılıyor.
  4. Java COM nesnesinin bağlantısı kesilmiş bir recordset oluşturur.

Davranışı Yeniden Oluşturma Adımları

  1. Visual J ++ aşağıdaki kodu kullanarak 6.0 ile ConnLoss adlı bir Java COM nesnesi proje oluştur:
    import com.ms.wfc.data.*;public class ConnLoss{  // Modify this connection string to point to a running SQL Server.  private static String m_connect =     "Provider=SQLOLEDB;Server=(Local);Database=Pubs;UID=sa;PWD=;";  public com.ms.wfc.data.adodb._Recordset     FindAuthorsLastName( String au_id, boolean fCallGC )  {    Connection conn = null;    Command cmd   = null;    Recordset rs  = null;    try    {           // Open connection to SQL Server.      conn = new Connection();      conn.setCursorLocation( AdoEnums.CursorLocation.CLIENT );      conn.open( m_connect );            // Prepare command object.      cmd = new Command();      cmd.setActiveConnection( conn );            cmd.setCommandText( "select au_lname from authors where au_id=?" );          cmd.getParameters().append(         cmd.createParameter( "au_id",                    AdoEnums.DataType.VARCHAR,                   AdoEnums.ParameterDirection.INPUT,                   20, au_id ) );            // Execute command.      rs = cmd.execute();            // Disconnect recordset and close connection.      rs.setActiveConnection( (Connection) null );      conn.close();            // Call gc if requested.      if (fCallGC) System.gc();            // Return disconnected recordset.      return (com.ms.wfc.data.adodb._Recordset) rs.getDataSource();          }    catch( AdoException adoEX )    {      // Log errors here.    }    return null;  }}					
  2. Java COM nesnesi, MTS veya COM + paketi ekleyin.
  3. Java COM nesnesi ile aşağıdaki Microsoft Visual Basic for Applications (VBA) kodunu arayın:
    Sub TestConnLoss()Dim objCL As ObjectDim i As LongDim rs As ADODB.recordset  set objCL = CreateObject("ConnLoss.ConnLoss")  For i = 1 To 100    Set rs = objCL.FindAuthorsLastName("756-30-7391", False)    Debug.Print rs.Fields("au_lname").Value    rs.Close    Set rs = Nothing      Next i    End Sub					
  4. Windows NT Performans izleyicisi, SQL Server 7.0 bulunduğu makine üzerinde çalıştırmak ve SQL Server: genel istatistikler performans sayacı altında kullanıcı bağlantıları izleyin.
  5. Istemci VBA kodu çalıştırın. Bu noktada, 100 kullanıcı bağlantılarını OLE DB Oturum Kuyruğu düzgün Java COM nesnesi tarafından kullanılan SQL OLE DB sağlayıcısı için çalışmıyor olduğunu gösteren, Windows NT Performans izleyicisi tarafından bildirildiği şekilde kod tarafından oluşturulur.

  6. Ikinci FindAuthorsLastName parametresi true olarak System.GC () kodu etkinleştirmek için değiştirin.
  7. Durdurun ve MTS veya COM + paketi yeniden başlatın.
  8. Istemci VBA kodu için bir kez çalıştırın.
Bu aşamada yalnızca birkaç kullanıcı bağlantılarını OLE DB Oturum Kuyruğu düzgün System.GC () çağrıldığında Java COM nesnesi tarafından kullanılan SQL OLE DB sağlayıcısı için çalıştığını gösteren bir kod tarafından oluşturulur.

Not: Çağrı System.GC (), Java COM nesnesinin performansını büyük ölçüde etkiler, dikkat etmeniz gereken performansı, böylece System.GC () çağrılıyor genel kaçınılmalıdır. Örneğin, iş nesnesi yalnızca her 10 veya 100 yöntem çağrıları azaltmak System.GC ()'ı çağırmak için kodlanmış System.GC () çağırma yöntemi performans etkisi başına. Ayrıca bir parametreli komut nesnesi kullanımını sabit kodlama parametre değerleri bir SQL dizesi ve yukarıdaki örnekte olduğu gibi parametre simgelerini kullanarak kaçınılması; bu da sorunu circumvents.

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 247757 - Son İnceleme: 02/23/2014 13:57:10 - Düzeltme: 3.0

  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.5
  • Microsoft Visual J++ 6.0 Standard Edition
  • kbnosurvey kbarchive kbmt kbqfe kbhotfixserver kbbug kbfix kbmdac250sp2fix KB247757 KbMttr
Geri bildirim