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

by_封爱 版主 2014-07-25 03:42:48
c# winform上位机.运行在服务器上的exe

N多硬件跟手机连接(更新db)发送数据(插入db)

比如我这个简单的sql就是


insert xx values('1')

当然了.这里面的1是来自其他东西发送过来的数据..

传统的写法 我们都是


using(sqlcon con=new sqlcon(""))
{
con.open();
using(sqlcmd cmd=new sqlcmd(con))
{
//执行sql
}
con.close()
}


但是我这地方很频繁..甚至1分钟内执行120次..

所以一直开启关闭开启关闭开启关闭开启关闭开启关闭开启关闭好吗?

还是弄个static sqlcon之后一直open 不close

总之是很频繁很频繁很频繁很频繁

所以这地方要如何弄?
...全文
5971 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
大叔爱loli 2014-07-26
  • 打赏
  • 举报
回复
参考ADO线程池相关知识
alexander0729 2014-07-26
  • 打赏
  • 举报
回复
对于2的扩展: 因为咱们当时假定的是不关心状态的设计, 如果要关心状态的话, 那就要对消息进行一点点的扩张, 知道消息的来源,然后把消息的处理结果再发送给来源
alexander0729 2014-07-26
  • 打赏
  • 举报
回复
对于1的扩展: 可以是单一的,也可以是多个服务器。比如说数据量太大了,一个服务器忙不过来,那在接口不变的情况下,对处理的节点可以进行扩充。
alexander0729 2014-07-26
  • 打赏
  • 举报
回复 1
我很少回答问题, 但我觉得上面兄弟们的回答有点片面性, 1. 数据库的连接, 可以open, 就一定可以close。 2. 所谓用的时候open, 不用的时候close, 这估计是教程看多了, 或是没写过大型的程序 3. 楼主的问题,有一点没说清楚, 你的这个插入, 要不要返回状态(就是是否插入成功的标志), 要不要返回状态,是一个十分重要的问题, 会影响系统的设计。 4. 假定就是个插入语句,无所谓而且也不关心是否是成功的时候, 我给你说个比较典型的应用设计场景 没错,就是消息队列: 1. 一个服务, 对外提供一个接口, 接收数据 2. 接收数据后放入一个队列 3. 这个服务本身会不停的从队列中取数据,然后操作数据 很多人一看,觉得你这不是废话么, 谁都知道, 但真正理解并且能用好的人,确实不多, 而且这个模型扩展性极强
渃水 2014-07-25
  • 打赏
  • 举报
回复
先拼sql语句啊,然后一起执行
phommy 2014-07-25
  • 打赏
  • 举报
回复
如果连接数够用,那就不关,上面提到的网络问题什么的都可以捕获异常后做补偿 如果连接不够用,那就每执行完条后看有没有待执行的,如果没有了就关掉。这个场景用Semaphore正合适,要插入的东西放Queue
程序员-阿勇 2014-07-25
  • 打赏
  • 举报
回复
引用 30 楼 diaodiaop 的回复:
[quote=引用 29 楼 u012394290 的回复:] 你这样没看懂楼主问的呢而且你这插入是效率最低的方法 自测10W数据要3分多 试试这个方法吧http://blog.csdn.net/u012394290/article/details/38090047
哥哥我那只有一个sql...是不同者调用方法参数不同执行不同的sql ....[/quote]我知道 所以我说他没理解你说的啊
by_封爱 版主 2014-07-25
  • 打赏
  • 举报
回复
引用 29 楼 u012394290 的回复:
你这样没看懂楼主问的呢而且你这插入是效率最低的方法 自测10W数据要3分多 试试这个方法吧http://blog.csdn.net/u012394290/article/details/38090047
哥哥我那只有一个sql...是不同者调用方法参数不同执行不同的sql ....
程序员-阿勇 2014-07-25
  • 打赏
  • 举报
回复
引用 26 楼 chz415767975 的回复:
using(sqlcon con=new sqlcon("")) { con.open(); using(sqlcmd cmd=new sqlcmd(con)) { //执行sql insert 1 //执行sql insert 2 //执行sql insert 3 //执行sql insert 4 //执行sql insert 5 } con.close() } 写个执行 sql语句数组的方法。减少con开关次数。
你这样没看懂楼主问的呢而且你这插入是效率最低的方法 自测10W数据要3分多 试试这个方法吧http://blog.csdn.net/u012394290/article/details/38090047
by_封爱 版主 2014-07-25
  • 打赏
  • 举报
回复
引用 26 楼 chz415767975 的回复:
...
引用 25 楼 u012394290 的回复:
...
引用 23 楼 Z65443344 的回复:
...
引用 16 楼 duanzi_peng 的回复:
...
结贴了..可能是我没说清楚.. 看这里
sunny906 2014-07-25
  • 打赏
  • 举报
回复
完全可以

sqlcon con=new sqlcon(""); //定义全局变量

private void OpenConnection()
{
     con.Open(); //初始化的时候就打开连接
}
        
        //判断connection的连接状态
        private void CheckConnection()
        {
            if (con.State != System.Data.ConnectionState.Open)
            {
                con.Close();
                con.Open();
            }
        }
执行ddl,每次执行都判断connection的连接状态

            SqlCommand cmd = new SqlCommand("", con);
            CheckConnection(); 
            cmd.ExecuteNonQuery();
霜寒月冷 2014-07-25
  • 打赏
  • 举报
回复
using(sqlcon con=new sqlcon("")) { con.open(); using(sqlcmd cmd=new sqlcmd(con)) { //执行sql insert 1 //执行sql insert 2 //执行sql insert 3 //执行sql insert 4 //执行sql insert 5 } con.close() } 写个执行 sql语句数组的方法。减少con开关次数。
程序员-阿勇 2014-07-25
  • 打赏
  • 举报
回复
引用 19 楼 diaodiaop 的回复:
[quote=引用 12 楼 u012394290 的回复:] 如果让我做我可能会用一个static list<model> 保存要插入的值 然后判断list.count>100或1000登 在做一次批量插入 list.count<100或1000 list.add(...) 这只是我想到的一个方案 不知道是不是可行
当然很多人都会怎样想..但是 如果不能得到及时的数据库操作. 用户在别的地方查询数据库 会看不到刚刚的信息..
引用 13 楼 Z65443344 的回复:
那你到底指不关闭什么? 线程? 如果你的数据库连接没有关闭,底层的socket其实就是在保持长连接啊. 问题就是会遇到网络不稳定时,连接被迫关闭(你没关,数据库给关了)
现在的问题 跟socket没什么关系... 就是一个方法 1分钟可能调用1000次. 而1000次都要访问数据库 是执行1000次的open close 还是在执行操作之前 就一直open不close...[/quote] 你不能这样吗? 当他提交后反馈给客户数数据正在处理中,可能会有延迟,这样不行吗?
by_封爱 版主 2014-07-25
  • 打赏
  • 举报
回复
引用 23 楼 Z65443344 的回复:
如果用户一天才去查询一次,你是1秒更新一次还是1分钟更新一次,对用户来说根本没有区别
就算用户1天一查询 但是我要求数据库是最新的数据..你不能因为用户不查询就不保证数据库的数据不是最新的吧 所以 我们现在讨论的是 频繁的执行insert 以及update ....
於黾 2014-07-25
  • 打赏
  • 举报
回复
引用 20 楼 diaodiaop 的回复:
[quote=引用 17 楼 Z65443344 的回复:] 即使你做到了1秒更新100次,查询的时候不会也1秒去查询100次吧 既然那么多数据一下查询出来会很慢,那更新那么快有什么用?
现在跟查询没任何关系....不要考虑查询 只考虑insert以及update...[/quote] 业务逻辑是根据需求而定的,抛开查询不谈,根本没法讨论如何插入更好. 如果用户一天才去查询一次,你是1秒更新一次还是1分钟更新一次,对用户来说根本没有区别
程序员-阿勇 2014-07-25
  • 打赏
  • 举报
回复
引用 16 楼 duanzi_peng 的回复:
[quote=引用 2 楼 whnxdd 的回复:] 本屌觉得你这思路不对吧 如果一个链接操作数据库open 其它链接还能操作吗 可以做个缓存池 批量更新 如果是实时的那就一个线程往池中插入 插入就返回成功 一个线程往数据库插入
有道理,个人也感觉思路不对。这么频繁的与数据库交互 着实不能频繁的open ,close。[/quote] 赞这两位,个人觉得是正解
mjp1234airen4385 2014-07-25
  • 打赏
  • 举报
回复
保持一直open就OK了。
by_封爱 版主 2014-07-25
  • 打赏
  • 举报
回复
引用 17 楼 Z65443344 的回复:
即使你做到了1秒更新100次,查询的时候不会也1秒去查询100次吧 既然那么多数据一下查询出来会很慢,那更新那么快有什么用?
现在跟查询没任何关系....不要考虑查询 只考虑insert以及update...
by_封爱 版主 2014-07-25
  • 打赏
  • 举报
回复
引用 12 楼 u012394290 的回复:
如果让我做我可能会用一个static list<model> 保存要插入的值 然后判断list.count>100或1000登 在做一次批量插入 list.count<100或1000 list.add(...) 这只是我想到的一个方案 不知道是不是可行
当然很多人都会怎样想..但是 如果不能得到及时的数据库操作. 用户在别的地方查询数据库 会看不到刚刚的信息..
引用 13 楼 Z65443344 的回复:
那你到底指不关闭什么? 线程? 如果你的数据库连接没有关闭,底层的socket其实就是在保持长连接啊. 问题就是会遇到网络不稳定时,连接被迫关闭(你没关,数据库给关了)
现在的问题 跟socket没什么关系... 就是一个方法 1分钟可能调用1000次. 而1000次都要访问数据库 是执行1000次的open close 还是在执行操作之前 就一直open不close...
程序员-阿勇 2014-07-25
  • 打赏
  • 举报
回复
其实我不建议不关闭,数据库不关闭的话会一直占用的,其他的用户就没法插入了,在并发量高的情况下就... 我觉得最好是存下来 达到一定时间或者一定量 再批量插入会不会好点?
加载更多回复(17)

111,126

社区成员

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

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

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