2017-02-16 101 views
0

我是Postgresql的新手。我正在使用Postgresql和實體framework6,使用npgsql。Postgresql npgsql首次連接時間過長

我已經擁有一個數據庫。我正在使用「Code First表單數據庫」選項。

問題是,第一次執行查詢時,執行它需要我很多時間。我認爲這是第一次打開連接的時候。

我創建了這個問題這個簡單的例子(TestJSONB是的DbContext):

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestQuery(); 
     TestQuery(); 
    } 

    private static void TestQuery() 
    { 
     using (DALJSONB.TestJSONB dataModel = new DALJSONB.TestJSONB()) 
     { 
      var query1 = 
       dataModel.Database.SqlQuery<int>(
        @" 

        SELECT 1; 
       "); 

      query1.ToList(); 

      var query2 = 
       dataModel.Database.SqlQuery<int>(
        @" 

        SELECT 1; 
       "); 

      query2.ToList(); 
     } 
    } 
} 

TestQuery()的第一個執行時間是這樣的:

  • query1.ToList() - 2348ms
  • query2.ToList() - TestQuer 2ms的

第二執行次Y()是這樣的:

  • query1.ToList() - 19ms
  • query2.ToList() - 2ms的

我的app.config是:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <connectionStrings> 
     <add name="TestJSONB" connectionString="Host=x.x.x.x;Username=x;Password=x;Persist Security Info=True;Database=TestJSONB" providerName="Npgsql" /> 
    </connectionStrings> 
    <entityFramework> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
     <providers> 
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" /> 
     </providers> 
    </entityFramework> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" /> 
       <bindingRedirect oldVersion="0.0.0.0-3.2.1.0" newVersion="3.2.1.0" /> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

是有可能減少這個時間?

在此先感謝。

回答

1

這很可能與PostgreSQL或Npgsql無關,而是Entitt Framework本身啓動,構建模型等。嘗試連接到沒有EF的數據庫(即只創建一個NpgsqlConnection並打開它)和您應該看到它很快運行。

對於EF應用程序來說,在實際服務用戶呼叫之前發送一種虛擬熱身查詢是很常見的,這正是爲了避免這種顯着的首次延遲。

+0

我有一臺虛擬機上的postgresql,託管在我的電腦中。我做了你告訴我的,發現了兩種不同的情況。首先,在我的電腦上。當我執行Npgsql.NpgsqlConnection連接=新Npgsql.NpgsqlConnection(「...」)它需要我2秒。其他人很快。第二種方案是在虛擬機中執行它。 Npgsql.NpgsqlConnection連接=新的Npgsql.NpgsqlConnection(「...」)很快,第一個查詢需要1.7秒,另一個查詢很快。有什麼想法? –

+0

想接受這個答案。認爲它確實與實體框架有關。謝謝 –

+1

另外一個補充;自從編寫這個答案以來,我收到了Npgsql 3.2.0(3.1.x沒有引起這個)的新啓動時間異常緩慢的報告。顯然,Npgsql 3.2.0的性能計數器的新用法會導致此問題,並且將在3.2.2中解決(請參閱https://github.com/npgsql/npgsql/issues/1435)。 –