vb.net操作数据库的效率问题

赵子逸 2014-01-20 03:43:37
最近在写一个vb.net客户端链接远程数据库的程序,发现程序和数据库交互效率特别低。本来怀疑数据库服务器带宽的问题,但是今天监控了一下各个环节的耗时,结果让我很惊讶,哪位高人能指点一下为什么效率是在fill环节这么低,我想要提高效率应该在哪里做一些优化

Dim m_SqlConn As MySqlConnection
m_SqlConn = Nothing
Try
Dim str As String
str = "1:" & get_now() & Now.Millisecond
m_SqlConn = connect_sql()
str = str & vbCrLf & "2:" & get_now() & Now.Millisecond
Dim strQuery As String = "select name from xxxx "
Dim daAdapter As MySqlDataAdapter = New MySqlDataAdapter(strQuery, m_SqlConn)
str = str & vbCrLf & "3:" & get_now() & Now.Millisecond
Dim dsTable As DataSet = New DataSet
str = str & vbCrLf & "4:" & get_now() & Now.Millisecond
daAdapter.Fill(dsTable)
str = str & vbCrLf & "5:" & get_now() & Now.Millisecond
MsgBox(str)
Catch
MsgBox("连接数据库出现异常,请检查你的网络,点击退出!")
Finally
m_SqlConn.Close()
End Try

如上是我的代码简化版,我监控了一下各个步骤的耗时,在第4步以前都是毫秒级的,时间完全一致,在第4步到第5步之间居然耗时1.5S,没错,是1.5S而不是1.5毫秒,这让我非常不能理解,请各位指点。为什么是这样
...全文
454 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵子逸 2014-04-09
  • 打赏
  • 举报
回复
引用 10 楼 overown 的回复:
也许Fill的时候才是真正的连接数据库,执行查询,返回结果,填充DataSet
这个回复是最靠谱的,我后来做了一些测试,确实是由于在执行fill的同时隐形的执行了open动作导致的时间比较慢,我在fill之前显示的打开数据库,那么fill的动作就很快了 顺便鄙视一下某些专家,不好好研究,上来就鄙视别人
想飞的狼 2014-02-18
  • 打赏
  • 举报
回复
这个就是这样,FILL的速度没法和VF或低版本的开发工具比较,必定VB.NET是在framework2.0以上工作的
benjoyeh 2014-01-25
  • 打赏
  • 举报
回复
1.5秒很正常吧,好象说用户在等待3秒~5秒才觉得有延迟。可能fill的时候,要再分配一次内存?然后,再对对象进行操作,还有一个网络延迟的问题?反正说实话,微软的东西就这样,好用但效率不高。 另外,我觉得,你可以试一下,连接本地数据库,看是不是也是这个级别?这样才能扣去服务器响应,网络延迟等问题。
ttsffgg 2014-01-23
  • 打赏
  • 举报
回复
也许Fill的时候才是真正的连接数据库,执行查询,返回结果,填充DataSet
赵子逸 2014-01-20
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
[quote=引用 4 楼 zhaoziyi0425 的回复:] 只有1行,我的软件返回数据量都不大,最多也就20几行,我测试下来1行和20行在这个fill环节都是1.5S左右
你应该使用ado.net自己写,并且自己创建一个DataSet来保存数据。这样就知道问题出在哪里了。[/quote] dataset我也试过,结果是一样的,dataadapter.fill(dataset,"")耗时也是1.5S以上的,很不理解
赵子逸 2014-01-20
  • 打赏
  • 举报
回复
引用 楼主 zhaoziyi0425 的回复:
最近在写一个vb.net客户端链接远程数据库的程序,发现程序和数据库交互效率特别低。本来怀疑数据库服务器带宽的问题,但是今天监控了一下各个环节的耗时,结果让我很惊讶,哪位高人能指点一下为什么效率是在fill环节这么低,我想要提高效率应该在哪里做一些优化

Dim m_SqlConn As MySqlConnection        
m_SqlConn = Nothing        
Try   
Dim str As String            
str = "1:" & get_now() & Now.Millisecond            
m_SqlConn = connect_sql()            
str = str & vbCrLf & "2:" & get_now() & Now.Millisecond            
Dim strQuery As String = "select name from xxxx "            
Dim daAdapter As MySqlDataAdapter = New MySqlDataAdapter(strQuery, m_SqlConn)            
str = str & vbCrLf & "3:" & get_now() & Now.Millisecond            
Dim dsTable As DataSet = New DataSet            
str = str & vbCrLf & "4:" & get_now() & Now.Millisecond            
daAdapter.Fill(dsTable)            
str = str & vbCrLf & "5:" & get_now() & Now.Millisecond            
MsgBox(str)        
Catch            
MsgBox("连接数据库出现异常,请检查你的网络,点击退出!")        
Finally            
m_SqlConn.Close()  
End Try
如上是我的代码简化版,我监控了一下各个步骤的耗时,在第4步以前都是毫秒级的,时间完全一致,在第4步到第5步之间居然耗时1.5S,没错,是1.5S而不是1.5毫秒,这让我非常不能理解,请各位指点。为什么是这样
补充一下测试结果: 可以看出,连接数据库用了0.9S,查询用了30毫秒,但是这个fill居然执行了2.5S,我是真的不太理解,是我的用法有问题么?网上vb.net操作数据库基本都是我这个模板写的,急求高手指点!
赵子逸 2014-01-20
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
请你告诉我,凭什么你认为fill应该是1.5毫秒呢? 比如说我写1000行代码的一个程序,而你不过是声明了三个变量,给第一个变量设置了一个叫做“数据库连接”字符串的属性,给第二个变量变量传了一个(或者两个)叫做“查询Sql语句”的字符串属性,第三个变量不过是定义了一下类型名称,而真正的连接数据库、等待数据库响应、查询数据、等待数据库返回数据、对数据进行解析、创建内存数据库结构等等比你的代码多一万倍功能的工作,都是我的方法做的。你凭什么要求我的方法跟你的三个变量的声明速度一样?
兄弟,先别这么激动,一个小问题有必要这么激动么,大过年的气出点毛病就不好了 首先请仔细看一下我的代码,我的连接动作是在调试1和调试2之间做的,没有到1毫秒。查询动作是在调试2和调试3之间做的,也没有到1毫秒,反而这个不和网络交互,仅仅是本地资源操作的fill要了1.5秒。 我想问的是为什么一个fill动作就要1.5秒,我没说要达到1.5毫秒才满意,难道所有人的fill函数都要执行1.5S?那么是不是所有软件都会卡了?我的疑问在这里,明白的话就给回答一下
  • 打赏
  • 举报
回复
引用 4 楼 zhaoziyi0425 的回复:
只有1行,我的软件返回数据量都不大,最多也就20几行,我测试下来1行和20行在这个fill环节都是1.5S左右
你应该使用ado.net自己写,并且自己创建一个DataSet来保存数据。这样就知道问题出在哪里了。
  • 打赏
  • 举报
回复
请你告诉我,凭什么你认为fill应该是1.5毫秒呢? 比如说我写1000行代码的一个程序,而你不过是声明了三个变量,给第一个变量设置了一个叫做“数据库连接”字符串的属性,给第二个变量变量传了一个(或者两个)叫做“查询Sql语句”的字符串属性,第三个变量不过是定义了一下类型名称,而真正的连接数据库、等待数据库响应、查询数据、等待数据库返回数据、对数据进行解析、创建内存数据库结构等等比你的代码多一万倍功能的工作,都是我的方法做的。你凭什么要求我的方法跟你的三个变量的声明速度一样?
赵子逸 2014-01-20
  • 打赏
  • 举报
回复
引用 2 楼 eaqpi 的回复:
返回了多少行数据?
只有1行,我的软件返回数据量都不大,最多也就20几行,我测试下来1行和20行在这个fill环节都是1.5S左右
eaqpi 2014-01-20
  • 打赏
  • 举报
回复
返回了多少行数据?
赵子逸 2014-01-20
  • 打赏
  • 举报
回复
代码里的连接函数还有那个select语句不用怀疑了,我这里是为了信息安全才没有全贴出来。就是搞不懂fill那里怎么会这么耗时,如果本来就是这样那别人的代码是怎么写的,才能保证软件运行流畅?谢谢各位了!

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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