سؤال

في تطبيق C# .NET 3.5 الخاص بي، أستخدم CastleProject ActiveRecord عبر NHibernate.هذا هو تطبيق سطح المكتب باستخدام MS SQL Server 2008.لقد قمت بتعيين مهلة أمر ADO على 0 لمنع استثناء المهلة أثناء العمليات المجمعة:

  <activerecord>
    <config>
      ...
      <add key="hibernate.command_timeout" value="0" />
    </config>
  </activerecord>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      ...
      <property name="command_timeout">0</property>
    </session-factory>
  </hibernate-configuration>

ومع ذلك، ما زلت أتلقى استثناء المهلة!يُظهر سجل NHibernate شيئًا مثل هذا:

في مكان ما في البداية:

2010-10-02 06: 29: 47،746 info nhibernate.driver.driverbase-تعيين مهلة Command Ado.net إلى 0 ثانية

في مكان ما في النهاية:

2010-10-02 07:36:03,020 التصحيح NHibernate.AdoNet.AbstractBatcher - IDbCommand مغلق ، افتح IDbCommand s:0 2010-10-02 07:36:03,382 خطأ NHibernate.Event.Default.AbstractFlushingEventListener - تعذر مزامنة حالة قاعدة البيانات مع الجلسة NHibernate.HibernateException:و حدث استثناء عند التنفيذ استعلامات الدفعات ---> System.Data.S qlClient.SqlException:مهله انتهت.انقضت فترة المهلة قبل الانتهاء من الأوبرا أو الخادم لا يستجيب.في System.Data.SqlClient.SqlConnection.OnError(SqlException استثناء ، فاصل منطقي)

كيف ذلك؟كيف يمكن اصلاح هذا؟

هل كانت مفيدة؟

المحلول

من الصحيح أن القيمة 0 تشير إلى عدم وجود مهلة (مثل المحددة في مستندات MSDN)، ولكن في حين يقوم برنامج تشغيل NHibernate بتمرير قيمة التكوين إلى أمر db عندما تكون >= 0, ، حالة الخلطة التحقق من أن القيمة > 0.

ولذلك، عند تعيين تشغيل الدفعات، بقيمة مهلة 0، لا يتم نقل القيمة إلى أمر db، لذا تظل كقيمة افتراضية.

من الممكن تمامًا أن يكون هذا حسب التصميم، وأن مطوري NHibernate قاموا عمدًا بتعطيل تعطيل المهلات لسيناريوهات الدُفعات.يعد تعطيل المهلة فكرة سيئة على أي حال، إذا كانت لديك مشكلات تتعلق بأخطاء المهلة، فسأرفع القيمة، لكن لن أقوم بتعطيلها.

يرجى تأكيد ذلك مع مطوري NHibernate.

نصائح أخرى

قد تتطلع إلى تعيين المهلة لاستعلامات محددة وليس على مستوى الويب.

لقد وجدت مؤخرًا هذه الإجابة التي ساعدتني:

كيفية تعيين مهلة أمر nhibernate linq باستخدام session.query

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top