FIX: استخدام معلمات الأوامر في ADO تسرب اتصال

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية247757
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الأعراض
عند استخدام Windows Foundation فئات لـ Java (WFC) ADO ثم فتح كائن مجموعة سجلات باستخدام أمر ذات معلمات الاتصالات بشكل صحيح مغلقة تجميعها ثم يتم إعادة استخدامها بشكل غير صحيح, مما يؤدي إلى leaked الاتصالات. كمحاولة للتغلب على هذه المشكلة استدعاء System.gc() بعد إغلاق الاتصال ADO في كائن COM Java. في الحالات العادية لا تحتاج إلى الاتصال System.gc() بعد إغلاق اتصال ADO لتحرير الاتصال.
الحل
تم إصلاح هذه المشكلة في أحدث حزم الخدمة لـ Windows 2000 و MDAC 2.5.
  • لحل هذه المشكلة، يجب الحصول على أحدث حزمة خدمة لنظام التشغيل Windows 2000. للحصول على معلومات إضافية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
    260910كيفية الحصول على أحدث حزمة خدمة لبرنامج Windows 2000
  • لحل هذه المشكلة، يجب الحصول على أحدث حزمة خدمة لـ Microsoft بيانات Access مكونات 2.5. للحصول على معلومات إضافية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
    293312INFO: كيفية الحصول على أحدث MDAC 2.5 حزمة الخدمات
يجب أن يكون للنسخة الإنجليزية من هذا الإصلاح سمات الملفات التالية أو أحدث:
File name       Date        Size      Version      -----------------------------------------------------Msado15.dll     1/26/2000   329KB     2.12.4926.0				
تصريح
أقرت Microsoft أن هذه مشكلة في بيانات Microsoft Access SP2 Objects2.1 و 2.5. تم تصحيح هذه المشكلة لأول مرة في Microsoft بيانات Access مكونات 2.5 المزود بحزمة الخدمة Service Pack 2 "و" Microsoft Windows 2000 Service Pack 2.
معلومات أخرى
الاتصال/جلسة هذه تجمع المشكلة تحدث عند وجود كافة الشروط التالية:
  1. يتم تثبيت Microsoft بيانات Access كائنات 2.1 SP2.
  2. يتم استخدام كائن ADO الأوامر ذات معلمات.
  3. يتم استضافة كائن COM Java في MTS أو COM +.
  4. إنشاء كائن COM Java مجموعة سجلات تم قطع اتصالها.

خطوات إعادة إنشاء في سلوك

  1. إنشاء مشروع كائن COM Java المسمى ConnLoss مع Visual J ++ 6.0 باستخدام التعليمات البرمجية التالية:
    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. إضافة كائن COM Java MTS أو حزمة COM +.
  3. استدعاء كائن COM Java مع التالي Microsoft Visual Basic للتعليمات البرمجية Applications (VBA):
    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 على الجهاز حيث يوجد SQL Server 7.0 ومراقبة "اتصالات المستخدمين" ضمن عداد الأداء SQL Server: عام الإحصائيات.
  5. تشغيل التعليمات البرمجية العميل VBA. عند هذه النقطة، يتم إنشاء اتصالات المستخدمين 100 بواسطة الرمز كما تم الإعلام عنها من قبل مراقب أداء Windows NT تشير إلى أن تجمع جلسة OLE DB لا يعمل بشكل سليم لموفر SQL OLE DB المستخدمة من قبل كائن COM Java.

  6. تغيير المعلمة الثانية FindAuthorsLastName إلى True لتنشيط رمز System.gc().
  7. إيقاف وإعادة تشغيل حزمة MTS أو COM +.
  8. تشغيل التعليمات البرمجية العميل VBA مرة ثانية.
عند هذه النقطة يتم إنشاء عدة اتصالات المستخدمين فقط بواسطة رمز يشير إلى أن تجمع جلسة OLE DB يعمل بشكل سليم لموفر SQL OLE DB المستخدمة من قبل كائن COM Java عندما يتم استدعاء System.gc().

ملاحظة: للطلب System.gc() يؤثر أداء كائن COM Java بشكل كبير, لذا استدعاء System.gc() عام يجب تجنب عندما تم وضع الأداء في الاعتبار. على سبيل المثال، قد يكون ترميز كائن الأعمال للاتصال System.gc() باستدعاء أسلوب كل 10 أو 100 لتقليل فقط كل أسلوب تأثير الأداء من استدعاء System.gc(). أيضاً، قد يتم تجنب استخدام الكائن الأمر ذات معلمات بواسطة ترميز الثابت قيم المعلمة إلى سلسلة SQL ومن عدم استخدام الرموز المميزة المعلمة كما في المثال أعلاه; هذا circumvents المشكلة أيضاً.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 247757 - آخر مراجعة: 02/21/2014 00:39:13 - المراجعة: 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 KbMtar
تعليقات