2016-09-07 54 views
0

我有我的控制器类的以下代码。我从控制器刷新我的视图。每次刷新发生时,我的整个类构造函数都会被调用,我只想刷新我的Show函数及其附加的View。 如何避免每次调用此构造函数。控制器在5秒后刷新 - 避免构造函数调用

public class DriverController : Controller 
{ 
    OdbcConnection DBConnection; //= new OdbcConnection("DSN=pitbuccx"); 
    OdbcConnection DBConnection2; // = new OdbcConnection("DSN=pitbuccx2"); 
    Query q; 
    string myQuery; 
    OdbcCommand cmd; 
    OdbcCommand cmd2; 
    OdbcDataReader DbReader; 
    OdbcDataReader DbReader2; 

    string LoggedInAgents; 
    string OnCalls;    
    string AgentsInReadyState; 
    string AgentsInNotReadyState; 
    string AgentsInWrapup;  
    string ReservedAgents;  
    string CallsOffered;   
    string CallsAnswered;   
    string CallsAbandoned;  
    string CallsInQueue;   
    string LongestCallInQueue; 
    string AbandRate;    
    string ServiceLevelPct;  
    string ASA;     
    string AHT; 
    string LongestTalkDuration; 

    public DriverController() 
    { 
     OdbcConnection DBConnection = new OdbcConnection("DSN=pitbuccx01"); 
     DBConnection.Open(); 
     OdbcConnection DBConnection2 = new OdbcConnection("DSN=pitbuccx02"); 
     DBConnection2.Open(); 
     q = new Query(); 
     myQuery = q.getQuery(); 

     cmd = DBConnection.CreateCommand(); 
     cmd2 = DBConnection2.CreateCommand(); 
     cmd.CommandText = myQuery; 
     cmd2.CommandText = myQuery; 

     Console.WriteLine("This is Constructor"); 
    } 

    public ActionResult Show() 
    { 
     DbReader = cmd.ExecuteReader(); 
     DbReader2 = cmd2.ExecuteReader(); 
     DbReader.Read(); 
     DbReader2.Read(); 

     string testData1; 
     string testData2; 
     //Checking Connection Data Validity. 
     testData1 = DbReader["A"].ToString(); 
     testData2 = DbReader2["B"].ToString(); 

     Response.AddHeader("Refresh", "5"); 
     return View(); 
    } 
} 

~DriverController() 
    { 

     DbReader.Close(); 
     cmd.Dispose(); 
     DBConnection.Close(); 

     DbReader2.Close(); 
     cmd2.Dispose(); 
     DBConnection2.Close(); 
    } 
+4

_“如何避免每次都调用这个构造函数。”_ - 你不能默认,你不应该这样做。控制器被初始化以处理一个请求。听起来像是一个XY问题。每五秒运行构造函数有什么问题?你可以创建你自己的控制器工厂,但是,你真的不想。 – CodeCaster

+4

无法停止每次调用构造函数。无论如何,它看起来相当简单,所以没有真正的性能影响(除非'q.getQuery()'需要大量资源) – DavidG

+0

DavidG @ In构造函数调用“Connection.Open”。这是昂贵的功能,我不想每5秒打开一次。需要打开一次,然后每次获取更新的数据 –

回答

1

如何避免每个请求的控制器实例化?

你可以做到这一点的implementing and registering your own controller factory,它实例化一个给定控制器只有一次,然后在AppDomain中某处存储它,使其保持活着比当前请求更长的时间,例如在一些静态变量。

但是这个问题像XY problem这样反复出现。您似乎关心为每个请求打开数据库连接的相对成本。

好吧,大家好!你不是第一个想到这个问题的人,你不应该担心,因为框架构建者早就已经解决了这个问题:.NET uses connection pooling

简而言之,这意味着您不必担心打开数据库连接,因为先前打开的连接将保存在池中,并在请求时返回到您的应用程序。

2

你不应该在你的控制器中这样做。根据定义,控制器是Web请求的主管。至少需要一个域类型来创建和释放像DB连接这样的外部资源,并对数据源执行查询。我什至不能看到连接正在关闭/处置。

+0

添加关闭/处置在析构函数中。我只需要在LIfetime打开和关闭连接 –

+0

@BASEERULHASSAN - 不,* no *,不!在整个应用程序中不要只使用一个连接!每当你需要访问你的数据库时,将它包装在一个'使用'块中... –

+0

Geoff @仅仅因为必须每5秒访问一次同一个数据库,那么一个连接会出现什么问题。为什么不直接利用原创的Connection /。 –