2013-05-08 30 views
8

Hôm nay tôi gặp phải sự cố với thời gian chờ.NHibernate command_timeout không hoạt động với các lô

tôi có cấu hình sau đó được sử dụng để tạo ra một SessionFactory:

<property name="adonet.batch_size">50</property> 
<property name="command_timeout">600</property> 

tôi không lưu trữ nó trong web.config nhưng trong một tập tin XML được bằng tay thông qua với cấu hình:

configuration.Configure(cfgFile) 

Vì vậy, tôi có thể có nhiều nhà máy phiên (mỗi cơ sở dữ liệu) với cấu hình độc lập.

Nhưng command_timeout dường như chỉ có hiệu lực khi NHibernate không sử dụng lô. Nếu lệnh SQL được trộn sau đó cho một số lô lớn tôi nhận được:

NHibernate.Exceptions.GenericADOException: could not execute batch command. 
[SQL: SQL not available] ---> 
System.Data.SqlClient.SqlException: Timeout expired. 
The timeout period elapsed prior to completion of the operation or the server is not responding. 

Trong khi googling cho một giải pháp, tôi thấy một bài viết giải thích lý do tại sao điều này xảy ra: http://ronaldrosiernet.azurewebsites.net/Blog/2013/04/20/timeout_in_nhibernate_batched_sessions

Nguyên nhân của vấn đề là cho SQL batching NHibernate đang sử dụng Cfg.Environment.CommandTimeout thay vì command_timeout được chuyển đến một cấu hình khi tạo một phiên.

Tôi tìm thấy một cách để thực hiện một workaround khi tạo ra một cấu hình:

if (configuration.Properties.ContainsKey(NHibernate.Cfg.Environment.CommandTimeout)) 
    NHibernate.Cfg.Environment.Properties[NHibernate.Cfg.Environment.CommandTimeout] = 
      configuration.Properties[NHibernate.Cfg.Environment.CommandTimeout]; 

và bây giờ các đồng nghiệp của tôi nói rằng thời gian chờ dường như được cố định ngay bây giờ.

Nhưng những gì confuses me là thread sau: https://forum.hibernate.org/viewtopic.php?f=25&t=983105

mà nói:

Các NHibernate.Cfg.Environment.Properties tài sản trả về cho bạn một bản sao các tính chất toàn cầu, vì vậy bạn không thể sửa đổi nó.

Nếu NHibernate.Cfg.Environment.Properties là bản sao chỉ đọc thì tại sao giải pháp của tôi có vẻ hoạt động tốt? Là nó ổn định hoặc có thể sửa chữa này là không đáng tin cậy và có thể phá vỡ trong một số trường hợp khác?

Và tôi cũng tìm thấy một vấn đề có liên quan trong NHibernate JIRA:. https://nhibernate.jira.com/browse/NH-2153

Nếu họ nói rằng họ cố định vấn đề với command_timeout trong v3.1.0, thì tại sao anh vẫn phải sử dụng workaround của tôi trong NHibernate v3.3.2 . ?

Có ai có thông tin chi tiết về điều này không?

Trả lời

5

Tôi gặp vấn đề tương tự khi sử dụng lô. Nhibernate class SqlClientBatchingBatcher sử dụng lệnh timeout từ Environment.GlobalProperties chỉ đọc. Tôi thấy chỉ có hai cách để thiết lập thời gian chờ trên SqlClientBatchingBatcher.currentBatch lệnh

1) sử dụng thời gian chờ trong file app.config

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

2) thiết lập môi trường.

FieldInfo field = typeof(global::NHibernate.Cfg.Environment).GetField("GlobalProperties", System.Reflection.BindingFlags.NonPublic |          System.Reflection.BindingFlags.Static); 
Dictionary<string, string> gloablProperties = field.GetValue(null) as Dictionary<string, string>; 
gloablProperties.Add("command_timeout","120"); 
+0

Tôi muốn sử dụng thuộc tính 'global :: NHibernate.Cfg.Environment.CommandTimeout' thay cho chuỗi không đổi' "command_timeout" 'tại đây. – Alex

Các vấn đề liên quan