2016-01-06 45 views
1

在極少數情況下,我遇到了petapoco的一些問題。Peta poco - ExecuteReader需要一個開放且可用的連接

有時我得到以下異常:

System.InvalidOperationException: ExecuteReader requires an open and available Connection. The connection's current state is connecting. 
    at System.Data.SqlClient.SqlConnection.GetOpenConnection(String method) 
    at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) 
    at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
    at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() 
    at PetaPoco.Database.<Query>d__44`1.MoveNext() 

我真的不知道該怎麼辦纔好。有沒有人見過這個?有關它爲什麼會發生的任何建議以及如何處理它?

,因爲它很少發生(也許2-3分貝的呼叫%)

我使用petapoco的5.0.1版我不能複製。

謝謝! :)

編輯:

我使用下面的構造方法實例數據庫:

public Database(string connectionString, string providerName) 
{ 
    _connectionString = connectionString; 
    _providerName = providerName; 
    CommonConstruct(); 
} 

我使用依賴注入象下面實例它作爲一個單身:

Container.Register(Component.For<IDatabase>().ImplementedBy<Database>().UsingFactoryMethod(() => new Database(configuration.ConnectionString, configuration.DbFactoryProvider)).LifestyleSingleton()); 
+0

什麼是數據庫和驅動程序,您正在使用? – miensol

+0

我正在使用SQL Server Web,我如何知道我使用的驅動程序? – Diemauerdk

+0

你好。 PetaPoco的維護者在這裏。這是一個有趣的問題。你能確認你沒有早期處理PetaPoco嗎?另外,我可以問你是否使用共享連接構造函數? – Plebsori

回答

1

當我第一次讀這篇文章時,我想到了一個線程錯誤。但是,我並不是簡單地把它寫下來,因此沒有解釋。僅供參考,任何在Web應用程序中如此不一致的錯誤很可能是線程錯誤。

好的,爲什麼它是一個線程錯誤。您使用PetaPoco作爲單例實例,這意味着整個應用程序的一個實例。它的工作原理大部分是因爲PetaPoco具有內部智能來知道何時打開/關閉共享連接,並且就運氣本身而言,PetaPoco的使用不會發生碰撞,除非有2-3%的時間。

此外,還有一個內部計數器(智能),當零將創建一個新的連接或根據操作關閉現有的一個。現在給出PetaPoco不是線程安全的,這個內部計數器可能遭受形式的線程相關的問題也一樣,如果兩個或多個線程增量/解增量在同一時間等

TDLR櫃檯;在dotnet中,一般規則是假定/使靜態方法成爲線程安全的,而其他所有事情都不是線程安全的,除非在清楚地標記和有意義的地方。如果PetaPoco是線程安全的,那麼您使用PetaPoco會有效,但事實並非如此。要解決此問題,請爲每個請求創建一個PetaPoco的新實例;一個相當便宜的操作(流利配置更是如此)。

我看到您使用的是PetaPoco 5.0.1,我建議您查看最新版本,因爲它有一個新的FluentConfiguration功能。而恰巧恰好這個功能的文檔頁面在頁面底部有一個示例容器設置。我建議你檢查一下。 Documentation

快樂PetaPoco'er'ing

+0

非常感謝!我改變了我對Petapoco的用法,所以我爲每個請求創建一個Peta poco的新實例,如下所示:user = new Database(connection).Query (「SELECT * FROM [」+ TableName +「] WHERE Id = @ 0」 ,id).FirstOrDefault();.我已更新到最新版本的Peta poco。自那以後我沒有看到這個錯誤。非常感謝你! :) – Diemauerdk

+0

沒問題。根據容器的不同,您也可以爲每個請求創建一個實例。 – Plebsori

相關問題