সত্তা ফ্রেমওয়ার্ক সময়সীমা


324

শেষ হতে 30 সেকেন্ডের বেশি সময় লাগে এমন কোনও ফাংশন আমদানি ব্যবহার করার সময় আমি সত্ত্বা ফ্রেমওয়ার্ক (EF) ব্যবহার করে টাইমআউটগুলি পাচ্ছি। আমি নিম্নলিখিতগুলি চেষ্টা করে দেখেছি এবং এই সমস্যাটি সমাধান করতে সক্ষম হইনি:

আমি এখানে প্রস্তাবিত EDMX ফাইল রয়েছে এমন প্রকল্পের App.Config ফাইলের Default Command Timeout=300000সংযোগের স্ট্রিংয়ে যুক্ত করেছি ।

এটি আমার সংযোগের স্ট্রিংয়ের মতো দেখাচ্ছে:

<add 
    name="MyEntityConnectionString" 
    connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
       res://*/MyEntities.msl;
       provider=System.Data.SqlClient;provider connection string=&quot;
       Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
       Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
       MultipleActiveResultSets=True;Default Command Timeout=300000;&quot;"
    providerName="System.Data.EntityClient" />

আমি সরাসরি আমার সংগ্রহস্থলে কমান্ডটাইমআউট সেট করার চেষ্টা করেছি:

private TrekEntities context = new TrekEntities();

public IEnumerable<TrekMatches> GetKirksFriends()
{
    this.context.CommandTimeout = 180;
    return this.context.GetKirksFriends();
}

সময় নির্ধারণের সময় থেকে EF পেতে আমি আর কী করতে পারি? এটি কেবল খুব বড় ডেটাসেটের জন্যই ঘটে। ছোট ডেটাসেটের সাহায্যে সবকিছু ঠিকঠাক কাজ করে।

আমি যে ত্রুটিগুলি পাচ্ছি তার মধ্যে একটি এখানে রয়েছে:

System.Data.EntityCommandExecutionException: কমান্ড সংজ্ঞা কার্যকর করতে গিয়ে একটি ত্রুটি ঘটেছে। বিশদ জন্য অভ্যন্তরীণ ব্যতিক্রম দেখুন। ---> System.Data.SqlClient.SqlException: সময়সীমা শেষ হয়ে গেছে। অপারেশন শেষ হওয়ার আগে সময়সীমা পেরিয়ে গেছে বা সার্ভার সাড়া দিচ্ছে না।


ঠিক আছে - আমি এই কাজ পেয়েছিলাম এবং এটি কি নির্বোধ ছিল। আমি উভয় সংযোগ স্ট্রিং ছিল Default Command Timeout=300000এবং CommandTimeout 180. সেট যখন আমি মুছে Default Command Timeoutসংযোগ স্ট্রিং থেকে, এটা কাজ করে। সুতরাং উত্তরটি হ'ল ম্যানুয়ালি আপনার কনটেক্সট অবজেক্টে আপনার সংগ্রহস্থলে কমান্ডটাইমআউট সেট করুন:

this.context.CommandTimeout = 180;

স্পষ্টতই সংযোগের স্ট্রিংয়ে টাইমআউট সেটিংস সেট করার কোনও প্রভাব নেই।


সরান & quot; সংযোগ স্ট্রিং থেকে
ব্রায়ান ওয়েবস্টার


5
@ hamlin11 একটি EF সংযোগের স্ট্রিং-এ, সংযোগের স্ট্রিংটি কোন অংশ এবং EF মেটাডেটা কোন অংশ তা নির্ধারণ করতে হবে। &quot;স্ট্রিং ছেড়ে দিন ।
শেভ

2
আমার প্রস্তাবনাটি হ'ল আপনি সময়সীমা বাড়ানোর আগে EF কেন সময় শেষ হচ্ছে তা দেখার জন্য প্রথমে তদন্ত করতে হবে। আমাদের ক্ষেত্রে আমরা বুঝতে পেরেছিলাম যে আমাদের NONCLUSTEREDকয়েকটি সারণীতে সূচি যোগ করতে হবে, এটি আমাদের জন্য সময়সীমা সমাধান করেছে।
জুলুকোদা

আমি এসকিউএল টাইম আউট ইস্যুতে এমএস সাপোর্ট নিয়ে কাজ করছি - এটি তখন যখন এসকিউএল অ্যাজুরে ডিবি হোস্ট করা হয়। আমাকে সমস্ত Azure Paa পরিষেবাদি (PaaS ওয়েবসাইট এবং এসকিউএল আজুর ইত্যাদি) সম্পর্কে জানানো হয়েছিল যে সেখানে সর্বজনীন সময়সীমা আছে 230 সেকেন্ড, এবং আপনি নিজে নিজে সময়সীমা নির্ধারণ করলেও এটি সর্বদা অগ্রাধিকার গ্রহণ করে। এটি বহু-ভাড়াটে PaaS পরিকাঠামোর সংস্থানগুলি রক্ষা করার জন্য।
আয়ান রবার্টসন

উত্তর:


552

EF সংযোগের স্ট্রিংয়ের মধ্যে ডিফল্ট কমান্ডের সময়সীমা নির্দিষ্টকরণ সহ একটি পরিচিত বাগ রয়েছে।

http://bugs.mysql.com/bug.php?id=56806

সংযোগের স্ট্রিং থেকে মানটি সরান এবং এটি ডেটা প্রসঙ্গের বস্তুতে সেট করুন। আপনি যদি সংযোগের স্ট্রিং থেকে বিরোধী মানটি সরিয়ে থাকেন তবে এটি কাজ করবে।

সত্তা ফ্রেমওয়ার্ক কোর 1.0:

this.context.Database.SetCommandTimeout(180);

সত্তা ফ্রেমওয়ার্ক 6:

this.context.Database.CommandTimeout = 180;

সত্তা ফ্রেমওয়ার্ক 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

সত্তা ফ্রেমওয়ার্ক 4 এবং নীচে:

this.context.CommandTimeout = 180;

5
আমি কীভাবে এডিএমএক্স ব্যবহার করে এটি অর্জন করতে পারি?
ইরোয়েল

2
সত্তা ফ্রেমওয়ার্কের কোন সংস্করণে এটি ঠিক করা হয়েছে? আমি এটির জন্য EF বাগটি খুঁজে পাচ্ছি না।
রুডিমিটার

7
আমি বিশ্বাস করি না এটি একটি ত্রুটি, বরং ডিজাইনের মাধ্যমে মন্তব্যগুলি বিভাগের লিঙ্কটি
মিক পি

3
কিছু সেটিংস এমএসে এবং কিছু এস-তে রয়েছে বলে আমি এটি এখানে সন্ধান করেছি , কমান্ডটাইমআউট কয়েক সেকেন্ডে।
জ্যাবারওয়কি ডিকম্পলারের

6
সত্তা ফ্রেমওয়ার্ক 7 এ আপনি এটি ডিবি কনটেক্সট / আইডেন্টিটিবিবি কনটেক্সট এর নির্মাতাতে সেট করতে পারেন:this.Database.SetCommandTimeout(180);
টমাস হ্যাগ্রস্টেম

101

আপনি যদি DbContext ব্যবহার করে থাকেন তবে কমান্ডের সময়সীমা নির্ধারণ করতে নিম্নলিখিত কনস্ট্রাক্টরটি ব্যবহার করুন:

public class MyContext : DbContext
{
    public MyContext ()
    {
        var adapter = (IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = 1 * 60; // value in seconds
    }
}

3
@ এরিকপেট্রু, যাতে আপনি সহজেই এটিকে কয়েক মিনিটের বিভিন্ন সংখ্যায় পরিবর্তন করতে পারেন :), কম্পাইলার যদি সেই গুণটিকে আরও অনুকূল করে ফেলে তবে আমি খুব অবাক হব না!
জোয়েল ভারহাগন

2
@ জোয়েল ভারহেন, অবাক হবেন না। অটো অনুকূলকরণ যখন ঘটে তখন এর একটি ভাল ব্যাখ্যা এখানে দেওয়া হয়েছে: stackoverflow.com/questions/160848/… । এই ক্ষেত্রে, আমি মনে করি যে এমনকি এটি ঘটেছে (যেহেতু তারা দুটি আক্ষরিক মান) তবে সত্যই আমি মনে করি কোডটি এইভাবে একরকম অদ্ভুত।
এরিক পেট্রোসেলী

33
মেহ ... বাচ্চারা অনাহারে আছে ... কে 1 * 60 এর যত্ন করে?
টিমারজ

9
@ এরিকপেট্রু, এটি আসলে খুব সাধারণ অনুশীলন এবং কোডটি আরও পাঠযোগ্য।
ক্যালভিন

আমার DbContextউত্পন্ন ক্লাসটি কোনও edmxফাইল থেকে স্বয়ংক্রিয়ভাবে উত্পন্ন হয়েছিল তা হ্যান্ডেল করার সর্বোত্তম উপায় কী ?
ম্যাট বার্ল্যান্ড 15

41

আপনি যদি DbContextএবং EF v6 + ব্যবহার করে থাকেন তবে বিকল্পভাবে আপনি এটি ব্যবহার করতে পারেন:

this.context.Database.CommandTimeout = 180;

13

সাধারণত আমি আমার ক্রিয়াকলাপ একটি লেনদেনের মধ্যে পরিচালনা করি । আমি যেমন অভিজ্ঞতা পেয়েছি, কনটেক্সট কমান্ডের সময়সীমা নির্ধারণ করা যথেষ্ট নয়, তবে লেনদেনের সময়সীমা পরামিতি সহ একটি নির্মাণকারীর প্রয়োজন। এটি সঠিকভাবে কাজ করার জন্য আমাকে উভয় সময় নির্ধারণ করতে হয়েছিল।

int? prevto = uow.Context.Database.CommandTimeout;
uow.Context.Database.CommandTimeout = 900;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) {
...
}

ফাংশন শেষে আমি কমান্ড টাইমআউটটি পূর্ববর্তী মানটিতে পূর্ববর্তীতে সেট করেছিলাম।

EF6 ব্যবহার করে


মোটেই ভাল পন্থা নয়। আমি প্রচুর লেনদেনের সুযোগ যুক্ত করতাম এবং এটি একটি প্রকল্পে আমার কাছে দুঃস্বপ্ন হয়ে ওঠে। ঘটনাচক্রে সমস্ত লেনদেনের সুযোগটি এএফ 6+ এ একক SAVEChanges () এর সাথে প্রতিস্থাপিত করে। এই কোডারওয়াল.com
চাঁদ দেখুন

এই উত্তরের ভোট বেশি হওয়া উচিত। সময়সীমা বাড়ানোর জন্য আমি বিভিন্ন উপায়ে চেষ্টা করেছি তবে কেবল যখন আমি উভয় প্রসঙ্গ কমান্ড সময়সীমা এবং লেনদেনের সুযোগ সেট করি তখন এটি কার্যকর হয়েছিল।
গ্যাং করুন

3

আমি জানি এটি খুব পুরানো থ্রেড চলছে, তবে এখনও ইএফ এটি স্থির করে নি। স্বতঃ উত্পাদিত লোকেরা DbContextম্যানুয়ালি টাইমআউট সেট করতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন use

public partial class SampleContext : DbContext
{
    public SampleContext()
        : base("name=SampleContext")
    {
        this.SetCommandTimeOut(180);
    }

    public void SetCommandTimeOut(int Timeout)
    {
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = Timeout;
    }

3

আপনি যদি আমার মতো সত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করছেন তবে আপনার সূচনা ক্লাসে সময় অনুযায়ী সময় নির্ধারণ করা উচিত:

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));

1

এই আমি ফান্ড আউট করেছি। হতে পারে এটি কারও সাহায্য করবে:

সুতরাং আমরা এখানে যেতে:

আপনি যদি EF এর সাথে লিনকিউ ব্যবহার করেন তবে তালিকার মতো কিছু সঠিক উপাদান অনুসন্ধান করে:

await context.MyObject1.Include("MyObject2").Where(t => IdList.Contains(t.MyObjectId)).ToListAsync();

আইডিএলিস্টে একাধিক আইডি না হওয়া পর্যন্ত সবকিছু ঠিকঠাক হয়ে যাচ্ছে।

তালিকায় কেবল একটি আইডি থাকলে "টাইমআউট" সমস্যাটি প্রকাশিত হয়। শর্তটি আইডলিস্টে আইডির সংখ্যা চেক করার জন্য শর্তটি ব্যবহার করুন।

উদাহরণ:

if (IdList.Count == 1)
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.FirstOrDefault()==t. MyObjectId).ToListAsync();
}
else
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.Contains(t. MyObjectId)).ToListAsync();
}

ব্যাখ্যা:

কেবল এসকিউএল প্রোফাইলার ব্যবহার করার চেষ্টা করুন এবং সত্ত্বা ফ্রেমেরোক দ্বারা উত্পন্ন সিলেক্ট স্টেটমেন্টটি চেক করুন। ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.