C# C使用SQL连接对象作为计时器函数

C# C使用SQL连接对象作为计时器函数,c#,timer,database-connection,C#,Timer,Database Connection,我正在创建一个winforms应用程序。 其中一个表单是透明的,此表单用于显示一些弹出消息框,使用计时器此表单每秒钟查询一次数据库 目前我正在使用数据库连接在这里使用方法postgres数据库 方法1 因此,每秒钟都会创建并释放此连接对象 注意:我没有将此对象用于任何其他目的,也没有在任何窗体或方法中使用 是否可以创建和使用该类的单个全局连接对象,并使用内部计时器勾号函数?以及在窗体关闭事件中进行处理 方法2 考虑到内存、资源使用、执行时间等因素,哪一个更好?请给出选择方法的适当理由。查看连接类

我正在创建一个winforms应用程序。 其中一个表单是透明的,此表单用于显示一些弹出消息框,使用计时器此表单每秒钟查询一次数据库

目前我正在使用数据库连接在这里使用方法postgres数据库

方法1

因此,每秒钟都会创建并释放此连接对象

注意:我没有将此对象用于任何其他目的,也没有在任何窗体或方法中使用

是否可以创建和使用该类的单个全局连接对象,并使用内部计时器勾号函数?以及在窗体关闭事件中进行处理

方法2


考虑到内存、资源使用、执行时间等因素,哪一个更好?请给出选择方法的适当理由。

查看连接类的文档,这似乎支持连接池。这意味着到同一端点的连接和同一连接字符串将重用现有连接,而不是产生创建新连接的开销

我不熟悉您的特定连接,但是如果行为类似于ADO.net的SQLConnection类,那么重复创建到同一连接字符串的新连接在计算上应该不会特别昂贵


另一方面,我会将您的连接逻辑包装在try/finally中,以确保在出现应用程序异常时关闭它。

我看不出每次运行新查询时实例化新连接有什么好处。我知道这经常是在代码中完成的,但是有与之相关的开销,不管多么小。如果从程序开始到程序结束运行多个查询,我认为应该重用现有的连接对象

如果您的目标是使连接从服务器上消失,我通常不会担心这个程序是否在一台机器上运行-如果它在几十台机器上运行,那又是另一回事-查找PgBounce,那么关闭连接池应该同样容易实现,然后Close方法会处理它

你问了一些正反两方面的问题,虽然在循环中实例化连接并不一定有害,但我无法想象这样会更好

值得注意的是,您可能希望考虑将连接作为一个属性最好在窗体类之外进行,因为您可能希望最终在别处使用它。大概是这样的:

 private NpgsqlConnection _PgConnection;
 public NpgsqlConnection PgConnection
 {
     get
     {
         if (_PgConnection == null)
         {
            NpgsqlConnectionStringBuilder sb = new NpgsqlConnectionStringBuilder();
            sb.Host = "hostname.whatever.com";
            sb.Port = 5432;
            sb.UserName = "scott";
            sb.Password = "tiger";
            sb.Database = "postgres";
            sb.Pooling = true;

            _PgConnection = new NpgsqlConnection(sb.ToString());
         }

         if (!_PgConnection.State.Equals(ConnectionState.Open))
             _PgConnection.Open();

         return _PgConnection;
     }

     set { _PgConnection = value; }
 }
然后,在表单中或在执行SQL的任何位置,都可以调用该属性:

NpgSqlCommand cmd = new NpgSqlCommand("select 1", Database.PgConnection);
...
Database.PgConnection.Close();
您不必担心连接是否打开或关闭,或者连接是否已经创建


唯一悬而未决的问题是,您是否希望该连接在服务器上实际消失,这将通过更改池属性进行更改。

我创建了一个自动关闭弹出窗口以显示最后的条目数,从表1中选择Count*,不再复杂,并且可以在distructor方法中使用close和Dipose方法~。不要依赖distructor来关闭连接,您无法控制何时/是否调用它。最好自己关闭连接。这里POOLING=TRUE在default中,conn.openinsideformconstructor不是每个计时器都会滴答作响吗?和conn.close inside destructor一般来说,您希望在最短的时间内打开连接。可能的连接数量有限,您不想无缘无故地挂起连接。您可以在文档中看到默认情况下ConnectionLifeTime=15秒,我在每秒钟或0.5秒查询一次。
 private NpgsqlConnection _PgConnection;
 public NpgsqlConnection PgConnection
 {
     get
     {
         if (_PgConnection == null)
         {
            NpgsqlConnectionStringBuilder sb = new NpgsqlConnectionStringBuilder();
            sb.Host = "hostname.whatever.com";
            sb.Port = 5432;
            sb.UserName = "scott";
            sb.Password = "tiger";
            sb.Database = "postgres";
            sb.Pooling = true;

            _PgConnection = new NpgsqlConnection(sb.ToString());
         }

         if (!_PgConnection.State.Equals(ConnectionState.Open))
             _PgConnection.Open();

         return _PgConnection;
     }

     set { _PgConnection = value; }
 }
NpgSqlCommand cmd = new NpgSqlCommand("select 1", Database.PgConnection);
...
Database.PgConnection.Close();