CPU老是飙到100%,帮忙看一下SQLHelper写法有问题吗?

问题描述

写了一个程序,CPU老是飙到100%,但是又不知道那个地方写法有问题,本地测试一点问题都没有,放在服务器上,开始也没有问题,就是一段时间之后CPU就升上去了,有的时候只有40%到50%,有的时候居然100%,底层数据访问使用如下的SQLHelper辅助类来实现,所有查询都是调用ExecuteTable()函数,举个例子:没有分了,抱歉,都来看一下吧!stringsql="Pro_PageALL_new";SQLHelpersqlHelper=newSQLHelper();sqlHelper.AddInParameter("@TableName",SqlDbType.VarChar,200,tableName);sqlHelper.AddInParameter("@Fields",SqlDbType.VarChar,2000,fields);sqlHelper.AddInParameter("@WhereClause",SqlDbType.VarChar,2000,whereClause);sqlHelper.AddInParameter("@OrderBy",SqlDbType.VarChar,2000,orderBy);sqlHelper.AddInParameter("@PageIndex",SqlDbType.Int,pageIndex);sqlHelper.AddInParameter("@PageSize",SqlDbType.Int,pageSize);sqlHelper.AddOutParameter("@PageCount",SqlDbType.Int);sqlHelper.AddOutParameter("@RecordCount",SqlDbType.Int);DataTabledt=sqlHelper.ExecuteTable(sql);

publicclassSQLHelper{privatestring_connstr="";privateSqlCommand_cmd=null;privateSqlParameter_param=null;///<summary>///默认构造函数///</summary>publicSQLHelper(){_cmd=newSqlCommand();_cmd.CommandTimeout=300;_connstr=ConfigurationManager.ConnectionStrings["SQLConnString"].ConnectionString;_cmd.Connection=newSqlConnection(_connstr);}///<summary>///根据数据库链接标识实例化构造函数///</summary>///<paramname="connkey">数据库链接标识</param>publicSQLHelper(stringconnkey){_cmd=newSqlCommand();_cmd.CommandTimeout=300;_connstr=ConfigurationManager.ConnectionStrings[connkey].ConnectionString;_cmd.Connection=newSqlConnection(_connstr);}///<summary>///添加命令参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">类型</param>///<paramname="direction">方向</param>publicvoidAddParameter(stringname,SqlDbTypedbType,ParameterDirectiondirection){_param=newSqlParameter(name,dbType);_param.Direction=direction;_cmd.Parameters.Add(_param);}///<summary>///添加命令参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">数据类型</param>///<paramname="size">大小</param>///<paramname="direction">方向</param>publicvoidAddParameter(stringname,SqlDbTypedbType,intsize,ParameterDirectiondirection){_param=newSqlParameter(name,dbType,size);_param.Direction=direction;_cmd.Parameters.Add(_param);}///<summary>///添加命令参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">数据类型</param>///<paramname="direction">方向</param>///<paramname="value">值</param>publicvoidAddParameter(stringname,SqlDbTypedbType,ParameterDirectiondirection,objectvalue){_param=newSqlParameter(name,dbType);_param.Direction=direction;_param.Value=value;_cmd.Parameters.Add(_param);}///<summary>///添加命令参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">数据类型</param>///<paramname="size">大小</param>///<paramname="direction">方向</param>///<paramname="value">值</param>publicvoidAddParameter(stringname,SqlDbTypedbType,intsize,ParameterDirectiondirection,objectvalue){_param=newSqlParameter(name,dbType,size);_param.Direction=direction;_param.Value=value;_cmd.Parameters.Add(_param);}///<summary>///添加命令输入参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">数据类型</param>///<paramname="value">值</param>publicvoidAddInParameter(stringname,SqlDbTypedbType,objectvalue){_param=newSqlParameter(name,dbType);_param.Direction=ParameterDirection.Input;_param.Value=value;_cmd.Parameters.Add(_param);}///<summary>///添加命令输入参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">数据类型</param>///<paramname="size">大小</param>///<paramname="value">值</param>publicvoidAddInParameter(stringname,SqlDbTypedbType,intsize,objectvalue){_param=newSqlParameter(name,dbType,size);_param.Direction=ParameterDirection.Input;_param.Value=value;_cmd.Parameters.Add(_param);}///<summary>///添加命令输出参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">数据类型</param>publicvoidAddOutParameter(stringname,SqlDbTypedbType){_param=newSqlParameter(name,dbType);_param.Direction=ParameterDirection.Output;_cmd.Parameters.Add(_param);}///<summary>///添加命令输出参数///</summary>///<paramname="name">名称</param>///<paramname="dbType">数据类型</param>///<paramname="size">大小</param>publicvoidAddOutParameter(stringname,SqlDbTypedbType,intsize){_param=newSqlParameter(name,dbType,size);_param.Direction=ParameterDirection.Output;_cmd.Parameters.Add(_param);}///<summary>///获取输出类型命令参数的值///</summary>///<paramname="ParamName"></param>///<returns></returns>publicobjectGetOutParameterValue(stringname){return_cmd.Parameters[name].Value;}///<summary>///清空命令参数///</summary>publicvoidClearParameters(){_cmd.Parameters.Clear();}///<summary>///增删改的公共方法///</summary>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>影响行数</returns>publicintExecuteNonQuery(stringcommandText){_cmd.CommandType=CommandType.StoredProcedure;_cmd.CommandText=commandText;try{_cmd.Connection.Open();return_cmd.ExecuteNonQuery();}catch(SqlException){throw;}catch(Exception){throw;}finally{if(_cmd.Connection!=null&&_cmd.Connection.State!=ConnectionState.Closed){_cmd.Connection.Close();}}}///<summary>///增删改的公共方法///</summary>///<paramname="commandType">Sql语句类型</param>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>影响行数</returns>publicintExecuteNonQuery(CommandTypecommandType,stringcommandText){_cmd.CommandType=commandType;_cmd.CommandText=commandText;try{_cmd.Connection.Open();return_cmd.ExecuteNonQuery();}catch(SqlException){throw;}catch(Exception){throw;}finally{if(_cmd.Connection!=null&&_cmd.Connection.State!=ConnectionState.Closed){_cmd.Connection.Close();}}}

解决方案

解决方案二:
///<summary>///返回查询结果的第一行第一列///</summary>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>第一行第一列</returns>publicObjectExecuteScalar(stringcommandText){_cmd.CommandType=CommandType.StoredProcedure;_cmd.CommandText=commandText;try{_cmd.Connection.Open();return_cmd.ExecuteScalar();}catch(SqlException){throw;}catch(Exception){throw;}finally{if(_cmd.Connection!=null&&_cmd.Connection.State!=ConnectionState.Closed){_cmd.Connection.Close();}}}///<summary>///返回查询结果的第一行第一列///</summary>///<paramname="commandType">Sql语句类型</param>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>第一行第一列</returns>publicObjectExecuteScalar(CommandTypecommandType,stringcommandText){_cmd.CommandType=commandType;_cmd.CommandText=commandText;try{_cmd.Connection.Open();return_cmd.ExecuteScalar();}catch(SqlException){throw;}catch(Exception){throw;}finally{if(_cmd.Connection!=null&&_cmd.Connection.State!=ConnectionState.Closed){_cmd.Connection.Close();}}}///<summary>///查询集合///</summary>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>SqlDataReader集合</returns>publicSqlDataReaderExecuteReader(stringcommandText){SqlDataReadersr=null;_cmd.CommandType=CommandType.StoredProcedure;_cmd.CommandText=commandText;try{_cmd.Connection.Open();sr=_cmd.ExecuteReader(CommandBehavior.CloseConnection);returnsr;}catch(SqlException){throw;}catch(Exception){throw;}}///<summary>///查询集合///</summary>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>Datatable</returns>publicDataTableExecuteTable(stringcommandText){DataTabledt=newDataTable();SqlDataAdaptersda=null;_cmd.CommandType=CommandType.StoredProcedure;_cmd.CommandText=commandText;try{_cmd.Connection.Open();sda=newSqlDataAdapter(_cmd);sda.Fill(dt);returndt;}catch(SqlException){throw;}catch(Exception){throw;}finally{if(_cmd.Connection!=null&&_cmd.Connection.State!=ConnectionState.Closed){_cmd.Connection.Close();}}}///<summary>///查询集合///</summary>///<paramname="commandType">Sql语句类型</param>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>SqlDataReader集合</returns>publicSqlDataReaderExecuteReader(CommandTypecommandType,stringcommandText){SqlDataReadersr=null;_cmd.CommandType=commandType;_cmd.CommandText=commandText;try{_cmd.Connection.Open();sr=_cmd.ExecuteReader(CommandBehavior.CloseConnection);returnsr;}catch(SqlException){throw;}catch(Exception){throw;}}///<summary>///查询集合///</summary>///<paramname="commandType">Sql语句类型</param>///<paramname="commandText">Sql语句火存储过程名称</param>///<paramname="prms">参数集合</param>///<returns>Datatable</returns>publicDataTableExecuteTable(CommandTypecommandType,stringcommandText){DataTabledt=newDataTable();SqlDataAdaptersda=null;_cmd.CommandType=commandType;_cmd.CommandText=commandText;try{_cmd.Connection.Open();sda=newSqlDataAdapter(_cmd);sda.Fill(dt);returndt;}catch(SqlException){throw;}catch(Exception){throw;}finally{if(_cmd.Connection!=null&&_cmd.Connection.State!=ConnectionState.Closed){_cmd.Connection.Close();}}}}

解决方案三:
cpu应该与dbhelp没关系把内存与dbhelp有关系你不释放资源内存就漫了
解决方案四:
真狠,把这么多都粘上来了,从上面拖到最下面都晕了,更不用说看了。。。
解决方案五:
CPU高要先确认是哪个程序,在程序里要看主要的循环部分。你的代码可是一点关系都没有。
解决方案六:
这里有点小问题,private SqlCommand _cmd = null;privateSqlParameter_param=null;你既然在类中维护这种继承IDisposable的非托管的对象,那么在你这个SQLHelper类中就应该实现IDisposable。应该实现手动Dispose()释放非托管资源,同时最好再实现~SQLHelper()析构函数来实现垃圾回收时自动释放非托管资源。具体可以参考非托管资源的释放。
解决方案七:
CPU100%跟你这段代码没关系~~
解决方案八:
引用5楼minhua1983的回复:

这里有点小问题,private SqlCommand _cmd = null;privateSqlParameter_param=null;你既然在类中维护这种继承IDisposable的非托管的对象,那么在你这个SQLHelper类中就应该实现IDisposable。应该实现手动Dispose()释放非托管资源,同时最好再实现~SQLHelper()析构函数来实现垃圾回收时自动释放非托管资源。具体可以参考非托管资源的释放。

你的意思是不是这样:想DataReader和SqlConnection这样的对象都需要Dispose()释放资源?
解决方案九:
不晓得楼主以何为依据判断瓶颈是在sqlhelper??
解决方案十:
不知道楼主以何为依据判断问题就是在sqlhelper!!
解决方案十一:
调用的DataReader没有关闭吧
解决方案十二:
引用9楼shiyong7682719的回复:

不知道楼主以何为依据判断问题就是在sqlhelper!!

有死锁的情况发生,发生在查询分页数据的时候,之前好像在网上看过微软petshop的SqlHelper的函数使用抽象类的形式,调用静态方法好像不会发生死锁。所以怀疑自己写法有问题。
解决方案十三:
引用7楼YourBer的回复:

Quote: 引用5楼minhua1983的回复:
这里有点小问题,private SqlCommand _cmd = null;privateSqlParameter_param=null;你既然在类中维护这种继承IDisposable的非托管的对象,那么在你这个SQLHelper类中就应该实现IDisposable。应该实现手动Dispose()释放非托管资源,同时最好再实现~SQLHelper()析构函数来实现垃圾回收时自动释放非托管资源。具体可以参考非托管资源的释放。

你的意思是不是这样:想DataReader和SqlConnection这样的对象都需要Dispose()释放资源?

我的意思是你的SQLHelper._cmd和SQLHelper._param属于SQLHelper的字段,而不是在SQLHelper的某个方法中定义的,如果定义在某个方法里面,就不用实现IDispose接口,即便在某个方法中定义的话,也最好使用using来写,这样当超出using语句块,会自动调用_cmd.Dispose()或_param.Dispose()的。而你SQLHelper的这种写法(SQLHelper._cmd和SQLHelper._param属于SQLHelper的字段)就应该实现IDispose接口。以前我也不知道应该这样写,但是我看了非托管资源的释放之后才知道的。不过我不确认这个是否就是引起你100%CPU的原因。
解决方案十四:
引用11楼YourBer的回复:

Quote: 引用9楼shiyong7682719的回复:
不知道楼主以何为依据判断问题就是在sqlhelper!!

有死锁的情况发生,发生在查询分页数据的时候,之前好像在网上看过微软petshop的SqlHelper的函数使用抽象类的形式,调用静态方法好像不会发生死锁。所以怀疑自己写法有问题。

如果楼主想确认是否是由sqlhelper引起的,那很好办,你把你的SQLHelper换成静态的即可,然后测试下就知道原因了。
解决方案十五:
把底层数据访问层换成微软的petshop那种,CPU依然飙到了100%,最后查看日志发现只有一个异常——“死锁”,而死锁发生在查询分页数据的时候,现在做的操作是在分页查询语句后面加上WITH(NOLOCK),还在测试,先测几天看看。
解决方案:
调用的DataReader没有用using
解决方案:
是写SQL语句的问题跟这东西没关系
解决方案:
引用14楼YourBer的回复:

把底层数据访问层换成微软的petshop那种,CPU依然飙到了100%,最后查看日志发现只有一个异常——“死锁”,而死锁发生在查询分页数据的时候,现在做的操作是在分页查询语句后面加上WITH(NOLOCK),还在测试,先测几天看看。

分页这会也不死锁了,CPU依然飙到100%,无语了,看日志有一个异常:HttpExceptionExceptionmessage:ApotentiallydangerousRequest.Pathvaluewasdetectedfromtheclient(?).然后百度了一下,好像是有特殊字符才会出现这个异常,但是访问出错的路径,都正常访问,也没有特殊字符,我就是想知道,什么原因会导致CPU上升呢?

时间: 2024-12-22 09:18:12

CPU老是飙到100%,帮忙看一下SQLHelper写法有问题吗?的相关文章

asp.net ado.net c#-这句老是说有参数没指定值 大神们帮忙看下

问题描述 这句老是说有参数没指定值 大神们帮忙看下 cartid和cartCount都是有值的 解决方案 代码呗挡住了,看不见,肯定是你sql中要求一个参数,但是你的parameter没给.仔细检查下.因为你是有分支的,所以调试下在特定分支下是不是没有赋值. 解决方案二: 解决方案三:

svm-求帮忙看一个python的SVM程序改主成分维度改哪里

问题描述 求帮忙看一个python的SVM程序改主成分维度改哪里 200C 从zouxy大神那里拷贝来的程序 源程序在这里 from numpy import *import timeimport matplotlib.pyplot as plt # calulate kernel valuedef calcKernelValue(matrix_x sample_x kernelOption): kernelType = kernelOption[0] numSamples = matrix_x

acm-ACM HDU1879继续畅通工程 提交RE.求各路大神帮忙看一下哪儿错了

问题描述 ACM HDU1879继续畅通工程 提交RE.求各路大神帮忙看一下哪儿错了 题目大意: 求最小生成树的权值和,并输出.已经修建的路(已经连上的边)是不会算入到最后的ANS中. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建. 当N为0时输入结束. Samp

c语言-特殊回文数,大神们帮忙看一看,为什么编译通过而不会运行

问题描述 特殊回文数,大神们帮忙看一看,为什么编译通过而不会运行 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n . 输入格式 输入一行,包含一个正整数n. 输出格式 按从小到大的顺序输出满足条件的整数,每个整数占一行. 样例输入 52 样例输出 899998 989989 998899 #include int main() { int a,b,c,d,e,f,n,m; scanf("%dn&quo

启动-Apple To Send请大神帮忙看一下

问题描述 Apple To Send请大神帮忙看一下 题目:平安夜到了,yjj准备给她的盆友们发苹果.于是yjj在这美好的夜晚,从家里出发,骑着她酷炫的魄罗电动车给盆友们送苹果了! 现在定义yjj的家为原点(坐标为0),她盆友们的家都是一维数轴正方向上的整数点,并且yjj每行驶距离1需要1秒,到一个盆友家送出苹果需要10秒,电动车每次启动需要5秒.然后给出yjj送苹果的地址顺序,聪明的你帮忙算一下yjj送完苹果并最后回到家中需要多少秒吧~! PS: 1.yjj一定是按照地址的顺序送出苹果的,并且

各位帮帮忙看下,为什么writebuffer总往文件里写入第一次读取的内容?

问题描述 本人写了一段代码用byte[8]数组做缓冲读写文件,但总是写入第一次读取的内容(即writebuffer内容总是第一次循环的结果),能否帮帮忙看哪里出问题了?XOR函数和Encode函数返回类型均为byte[8]数组,将Encode函数中temp改成readbuffer后(相当于直接跳过XOR函数),文件写入正常,XOR函数如下:各位帮帮忙,谢谢! 解决方案 解决方案二:不知道你想做什么,思路混乱.解决方案三:通常要这样写intlen=0;while((len=fin.Read(rea

c++-帮忙看一下这个DataDeal函数有啥好办法优化吗?

问题描述 帮忙看一下这个DataDeal函数有啥好办法优化吗? void DataDeal(char* data, int size) { int32_t index = 0; int32_t start = 0; int32_t end = 0; for(;index <= size;) { if (!start) { if (data[index++] == 0x00 && data[index++] == 0x00 && data[index++] == 0x0

大神帮忙看下面代码运行后怎么写入txt文件????

问题描述 大神帮忙看下面代码运行后怎么写入txt文件???? #include #include #include #include #include //输入/输出文件流类 using namespace std; const int Maxr=100;//最多的读者 const int Maxb=100;//最多的图书 const int Maxbor=5;//每位读者最多借五本书 //读者类,实现对读者的信息的描述 class Reader { private: int tag; //删除

QT5的问题,具体形容在下面,请大神帮忙看一下

问题描述 QT5的问题,具体形容在下面,请大神帮忙看一下 输入条形码查询显示在最下面的Qlineedit中然后输入库存回车显示tableview中获取信息用的qnetwork这已经完成了,但是第一次输条形码回车输库存回车显示一条信息,第二次就变成2条同样的了,第三次三遍了,求助大神,求帮助啊,下面贴了代码上传的错误如上图,图片上的网络错误已经解决,上传状态都正常,只是上传数量的错误一直没有解决,第一条传了一遍,第二条传了两遍,第三条传了三遍 解决方案 看下代码,估计是你使用的是相同的对象或者结构