频繁的访问数据库,sqlconnection可以一直open不close吗(2)

by_封爱 版主 2014-07-25 04:27:55
我的socket服务有一个方法

void BeginRec(byte[] data, SocketAsyncEventArgs ar)
{
//通过不同的data来执行insert或者update
}


当然有tcp/ip连接并且发送数据的时候 会执行上面的 方法,当前方法执行频率比较高. 1分钟可能执行几百次.(硬件下位机上传数据)

所以问题来了..这个地方对数据库的操作是每次操作先开启后关闭(第一种方法).还是一直开启不关闭(第二种方法)?

第一种方法

void BeginRec(byte[] data, SocketAsyncEventArgs ar)
{
using (SqlConnection con = new SqlConnection(""))
{
con.Open();
using (SqlCommand cmd=new SqlCommand("insert into ......",con))
{
cmd.ExecuteNonQuery();
}
con.Close();
}
}

第二种

public static SqlConnection con = new SqlConnection("");
//当启动窗体的时候 执行
con.Open();
void BeginRec(byte[] data, SocketAsyncEventArgs ar)
{
using (SqlCommand cmd=new SqlCommand("insert into ......",con))
{
cmd.ExecuteNonQuery();
}
}
...全文
912 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
开销得分清楚, using (SqlConnection con = new SqlConnection("")) 这个最后的销毁,只是在.net服务器这边销毁了, 数据库那边的连接池里面还在呢. .net下一次发起连接申请,数据库的连接池如果缓存还在,马上就连上了,几乎没什么开销的.
  • 打赏
  • 举报
回复
建立长连接,是可以的,但是一直占着,需要考虑一下。
alexander0729 2014-07-26
  • 打赏
  • 举报
回复
刚刚知道不能连续回复3次, 我就在这里回复了: 对于3的扩展, 对于队列来说, 可以用一个线程来取数据, 也可以用多个线程来取数据,同样也可以用多台服务器,多个进程,多个线程来取, 这取决于数据的规模 总的来说, 大型的,效率要求高的, 多个服务器协作的程序, 一般对经验要求的较多, 而且有些比较固定的模式,就是来处理你所说的问题的。 你应该把问题描述的更加清楚, 然后写出你自己的设计, 让牛人们来看看你的设计是否可行, 然后根据设计,再想想代码怎么写, 也拿出来交流下, 这样交流完了, 对你的提升会非常大。 从你的发问可以看出, 你代码的能力尚可,但还缺一些经验, 多找老鸟们讨论讨论吧。 我很少回复, 啰嗦了这么多, 希望对你有帮助
wangnaisheng 2014-07-26
  • 打赏
  • 举报
回复
你这是否可以理解为类似死循环是的,一直开启,永不关闭,服务器压力有点大啊。
  • 打赏
  • 举报
回复
sqlconnection执行close,就是把数据库连接放到连接池里供其它程序共享。你还以为一定是“关闭数据库连接”吗? 如果你不去使用数据库连接池,要知道风险在哪里。
bwangel 2014-07-25
  • 打赏
  • 举报
回复
事实上,你可以把算法优化一下,比如说搞个数据缓冲池,到一定数据量再一次性写入。这样是不是效率高一些。
bwangel 2014-07-25
  • 打赏
  • 举报
回复
没事,都是连接池管理的,平时怎么做现在还怎么做。 试想,一般网站上不也这么写的。如果随便几十个并发,这种写法就挂了,那早该换另一种写法了。
  • 打赏
  • 举报
回复
另外给你一个忠告,不要再服务器上开多少个“窗体”。服务就是服务,不是窗体程序。
  • 打赏
  • 举报
回复
这要看你的所谓服务器是什么编程水平。你的服务端处理消息时会多线程处理吗?你的一个数据访问操作循环(DataReader.Read()方法循环)内部还会需要再嵌套执行数据库操作吗?我们的程序中,这些东西每秒可能发生10次,那么我们自然就会使用数据库连接池进行自动化管理。
sunny906 2014-07-25
  • 打赏
  • 举报
回复
用第二种比较符合你的原意,不过得加上对connection对象状态的判断

        //判断connection的连接状态,防止con意外关闭
        private void CheckConnection()
        {
            if (con.State != System.Data.ConnectionState.Open)
            {
                con.Close();
                con.Open();
            }
        }

void BeginRec(byte[] data, SocketAsyncEventArgs ar)
{
                using (SqlCommand cmd=new SqlCommand("insert into ......",con))
                {
                    CheckConnection();
                    cmd.ExecuteNonQuery();
                }
}
getti66 2014-07-25
  • 打赏
  • 举报
回复
引用 8 楼 GT7466 的回复:
SqlConnection 对象本身就是连接池处理的~~ 选第一种。 当然如果你就几个客户端,那每个长期占着一个连接也无所谓,频繁申请和销毁的开销其实你多虑了。
比较赞同这个
GT7466 2014-07-25
  • 打赏
  • 举报
回复
SqlConnection 对象本身就是连接池处理的~~ 选第一种。 当然如果你就几个客户端,那每个长期占着一个连接也无所谓,频繁申请和销毁的开销其实你多虑了。
  • 打赏
  • 举报
回复
直接开启数据库连接池就行了。
by_封爱 版主 2014-07-25
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
一直开启不关闭,你的BeginRec 方法总会一个时间截止点来停止接收数据??
我既然叫服务了 肯定24小时*365天不停止了... 直到天荒地老,服务器爆炸...
exception92 2014-07-25
  • 打赏
  • 举报
回复
一直开启不关闭,你的BeginRec 方法总会一个时间截止点来停止接收数据??
mjp1234airen4385 2014-07-25
  • 打赏
  • 举报
回复
一直开着就好。 你这是exe的程序,不是网站,网站的话,如果访问的用户多了,数据库长时间连接开销很大。 你这是exe程序,而且是服务端的程序,也没有几个用户,一直连着就行了。
程序员-阿勇 2014-07-25
  • 打赏
  • 举报
回复
真要做的话我会选择先存下来,达到一定数量或者一定时间再一次性提交,如果你们客户的需求是要及时的话,只能在你上面2中方案中选的话,个人觉得还是频繁开关好点,不关感觉还是不好,服务器压力大的
程序员-阿勇 2014-07-25
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
你的SqlCommand是在using中使用的,出了using就销毁了,好的习惯是用完释放
版主 他说的是频繁访问
bdmh 2014-07-25
  • 打赏
  • 举报
回复
你的SqlCommand是在using中使用的,出了using就销毁了,好的习惯是用完释放

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧