ASP.NET开发网站程序常见错误汇总

    1. 数据库连接超时篇
      若要知道数据库连接超时问题,先看下面一段代码:
      [Sample-01]:
      Public Shared Function getOEMPN(ByVal psPN As String, ByRef OEMPN As String) As BSResult
      0001 Dim clsResult As New BSResult
      0002 Try
      0003 clsResult.ResultID = -1
      0004 Dim dtResult As New DataTable
      0005 Dim Sql As String = String.Empty
      0006 Dim clsOraDb As New clsOraClienDb
      0007 Dim strConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
      0008 clsOraDb.Open(strConn) ‘这里Open后,后面看不到 clsOraDb.Close
      0009 Sql = "SELECT SATBMMBRND.OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND.MATNO = :MATNO"
      0010 Dim params() As OracleParameter = {New OracleParameter("MATNO", psPN)}
      0011 If clsOraDb.FillDataTable(Sql, dtResult, params) = False Then
      0012 Return clsResult
      0013 End If
      0014 If dtResult Is Nothing Then
      0015 Return clsResult
      0016 End If
      0017 If dtResult.Rows.Count > 0 Then
      0018 OEMPN = dtResult.Rows(0)("FRUNO").ToString()
      0019 Else
      0020 OEMPN = ""
      0021 End If
      0022 clsResult.ResultID = 1
      0023 Return clsResult
      0024 Catch ex As Exception
      0025 clsResult.ResultID = -1
      0026 Return clsResult
      0027 End Try
      End Function
      对上述代码行的部分解释:
      0006:引用数据库连接的类;
      0008:打开数据库连接;
      然后,整个函数你再找不到关闭数据库连接的动作,是要等着操作系统来释放吗? 有人就说啦,看起来好像没有什么大不了的,这仅仅是一个函数而已; 数据库打开连接,未关闭不会影响到整个应用程式; 果真是这样吗?
      让我们谈谈数据库连接的问题,在Oracle数据库里,一般默认的数据库连接数最多也就100多来个,不会超过200个,即使你改变这个连接数,但无论怎样,它的连接数是有限的,不可能无限地供你消耗。
      在Web这个程式里,它不仅不会自动关闭数据库连接,象这样的函数还会每次调用,都会重新用掉一个数据库连接; 如果象这样的函数很多的话,你就等着一个错误警告页面弹出来,如Database Connection Timeout...等讯息。
      这还不算什么,更有甚者,尽然在循环语句里写下面的代码如:
      [Sample-02]
      Foreach(DataRow row in tabl.select(“”,”ProductID”)
      ……………
      clsOraDb.Open(strConn)
      ………….
      Next
      有人还喜欢玩下面的语句:
      [Sample-03]
      Foreach(DataRow row in tabl.select(“”,”ProductID”)
      Foreach(DataColumn col in tbl.columns)
      ……………
      clsOraDb.Open(strConn)
      Next
      ………….
      Next
      说到这,有人就问啦,我在开发环境下测试一点问题都没有呀?是呀,你是没有问题,我想问的是,你开发环境的测试数据有几笔?
      现在,问题已经知道在哪里,怎么解决?
      针对[sample-01]做如下处理,注意下面代码:
      Public Shared Function getOEMPN(ByVal psPN As String, ByRef OEMPN As String) As BSResult
      0001 Dim clsResult As New BSResult
      0002 Try
      0003 clsResult.ResultID = -1
      0004 Dim dtResult As New DataTable
      0005 Dim Sql As String = String.Empty
      0006 Dim clsOraDb As New clsOraClienDb
      0007 Dim strConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
      0008 clsOraDb.Open(strConn) 注释:这里Open后,后面看不到 clsOraDb.Close
      0009 Sql = "SELECT SATBMMBRND.OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND.MATNO = :MATNO"
      0010 Dim params() As OracleParameter = {New OracleParameter("MATNO", psPN)}
      0011 If clsOraDb.FillDataTable(Sql, dtResult, params) = False Then
      0012 Return clsResult
      0013 End If
      0014 If dtResult Is Nothing Then
      0015 Return clsResult
      0016 End If
      0017 If dtResult.Rows.Count > 0 Then
      0018 OEMPN = dtResult.Rows(0)("FRUNO").ToString()
      0019 Else
      0020 OEMPN = ""
      0021 End If
      0022 clsResult.ResultID = 1
      0088 clsOraDb.Close 注释:后面看到 clsOraDb.Close
      0023 Return clsResult
      0024 Catch ex As Exception
      0099 clsOraDb.Close 注释:程序异常也看到 clsOraDb.Close
      0025 clsResult.ResultID = -1
      0026 Return clsResult
      0028 Throw ex
      0027 End Try
      End Function
      注意上面的两句代码:0088行和0099行。
      在异常处理的时候,特别提醒两点:
      一, 你的数据库关闭的时候应该是在代码行0028前,而不是后;
      二, 有人不习惯(或者一时疏忽)加上0088行的代码;
      针对[Sample-02]和[sample-03],把打开数据库连接写在所有的循环语句之前,如:
      clsOraDb.Open(strConn)
      Foreach(DataRow row in tabl.select(“”,”ProductID”)
      ……………
      ………….
      Next
      当然还有另外一个做法,就是用Using语
    2. 对象只管创建应用,不管释放篇
      我们继续用[Sample-01]的代码,我们现在看0004行的代码:
      0004 Dim dtResult As New DataTable
      谁会发现它被释放,你不能,我也不能,从来没有被释放过。
      "0004"
      行的代码解释是,要在内存划分一个空间给这个定义的对象dtresult;
      系统要划分多大的空间呢?呀,我没有研究过(留给那些有心人吧,呵呵..)。但有一点,要在内存划分一个空间,就是要占用内存。那么内存有多大呢,不是无
      限大吧,也是有限的,所有运行上述代码的最终结果是,系统的执行效率越来越慢,有人就怀疑,我有内存1到2G的,加上虚拟内存就更大,我只能说你的怀疑没
      错。可是你的应用程序就用这么一只函数吗?我想肯定不是,所以上百只函数的应用执行对内存的消耗可想而知。如果是后台自动运行的程序,及时是一个
      function,也会让系统崩溃。这只是一个简单的例子,有更复杂的。像这样的对象应用还有:Dataset,
      Datatable,DataReader,DataAdapter,Datagrid..等。
      那么怎么解决这些问题呢:
      2.1在Try catch 语句前定义好所用的对象,如:
      Dim dtResult As New DataTable
      Dim DR as New DataReader
      Dim DS as New Dataset
      Try
      ..
      Catch ex As Exception
      Throw ex
      Finally
      End Try
      2.2释放的语句如下
      Dim dtResult As New DataTable
      Dim DR as New DataReader
      Dim DS as New Dataset
      Try
      ..
      ……………..
      Catch ex As Exception
      --释放应用的对象
      Throw ex
      Finally
      --使用完后,释放应用的对象
      dtResult.dispose --从内存里清楚该对象
      DR.dispose -从内存里清楚该对象
      DS.dispose -从内存里清楚该对象
      End Try
      有人习惯写成下面这样:
      Dim dtResult As New DataTable
      Dim DR as New DataReader
      Dim DS as New Dataset
      Try
      ..
      ‘使用完后,释放应用的对象
      dtResult.dispose ‘从内存里清楚该对象
      DR.dispose ‘从内存里清楚该对象
      DS.dispose ‘从内存里清楚该对象
      Catch ex As Exception
      ‘释放应用的对象
      Throw ex
      Finally
      End Try
      这不是也释放了吗?我想问的是,如果程序出现异常,它们会释放吗 ?我肯定得告诉大家,它们一定不能释放,为了确保程序的稳定运行,我建议大家都来用Try Catch语句。
      2.3 绝不建议在循环语句写如下的语句, 具体为什么,自己思考。
      Foreach (DataRow row in tabl.select(“”,”ProductID”)
      ……………
      Dim DS new Dataset 记住此乃写代码之大忌;
      Dim DT new Databable….
      ………….
      Next
      还有一种写法
      Dim DS new Dataset
      Dim DT new Databable…
      Foreach (DataRow row in tabl.select(“”,”ProductID”)
      DS=GetDatase
      DT=GetDatatable……………
      .
      ………….
      Next
      正确的写法是:
      Dim DS new Dataset
      Dim DT new Databable…
      Try
      Foreach (DataRow row in tabl.select(“”,”ProductID”)
      DS=nothing ‘每次使用,都先把内存空间释放出来
      DT=nothing ‘每次使用,都先把内存空间释放出来
      DS=GetDatase
      DT=GetDatatable……………
      .
      ………….
      Next
      Catch ex As Exception
      Throw ex
      Finally
      DS.dispose
      DT.dispose
      End Try
      另外,提醒大家一点,记得用 For Each 语句替代For i=0 to Rowcount-1,这样的效率改善也是明显的。
    3. 调试(Debug)模式下编译就用于应用环境中篇
      大家看下面的图片:
      有人会留意这个界面吗?有,但一定不多。
      接着,程式开发好(也包括单元测试),然后编译直接分发到应用环境。
      整个过程就结束了。谁也不曾想,这里埋下了一个深深的地雷,据微软的人讲,这样分发的程式到应用环境,你有多少内存恐怕都不够。
      所以微软建议我们做如下的工作:
      “請將Web.config中的debug及Trace均設為False。還有您的所有程式請確保compile為Release Mode
      Application set up for debugging
      One
      reason for high memory that we see here in Support a lot is when you
      have debugging, tracing, or both enabled for your application.
      While
      you are developing your application, this is a necessity.By default,
      when you create your application in Visual Studio .NET, you will see the
      following attribute set in your Web.config file:
      <compilation … debug="true" />
      and/or
      <trace enabled="true" … />
      Also, when you do a final build of your application, make sure that you do this in "Release" mode, not "Debug" mode. ”
      如果不这样做会有什么事情发生? 我分享一个同事的感受给大家:
      “已经是很强悍的的DB和AP服务器(全部是刀片式服务器)了,可是问题一而再再而三地发生,那种感觉真的很无助很凄凉啊~”
      后来的结果发现是内存使用率超高,到一定限度的时候,就会反应变慢,这个时候只要重启IIS就可以好一段时间。后来分析IIS用到实体加虚拟的内存超过2G就会爆掉。
      这就是原因,你想遇到吗?那就不妨试试。

    4. 实际操作分享篇
      上面三个环节,任何一个发生问题,都会影响到系统的效率。我分享我们实际的作业的过程发生的一些情况,及怎么解决这些问题。
      4.1 内存使用达到峰值,导致程序无法继续运行。
      有个同事分享了他们的经验如下(原话分享):
      我们有一些程式是server跑的Job,并有越来越多之势。而大家在写程式的时候可能比较少考虑到耗内存这个问题。
      下面的例子也许会给我们一点启示。
      下面也是原话
      Pls
      help to check the Run In Rack Job program . It will no response after
      running two or three days . the AP server Memory usage will over 2.5G .
      after we close the the program , Memory will decrease to 1.5 .
      大致意思是:在服务器端(也叫后台)自动跑的一只程式,运行了两三天后,停止运行了。检查Server的内存使用率时,发现超过了2.5G;在关掉了这只程式后,它就降到了1.5G…下面的图片为证:
      4.2 进程请求过多,导致CPU无法及时处理,程序效率反应较慢。
      下面都是同事的原话:
      “年后产量逐渐增加,新的问题又出现了。从Server Performance上分析,和上次Memory过高不同的是CPU使用率过高。
      每当CPU过高的时候,产线会大面积的反应说慢(这点和连接到哪台AP有关系)。
      每次慢的时候,我们就找到CPU过高的那台AP,recycle IIS的application pool后就OK了。
      于是我么再次找到Bon帮忙分析(结论:微软结案报告 20090226V1 - SRT090119833891 Web service can‘t serve IISReset can fix.msg)。并给出了开发程序时的一些建议。
      结论大致是说,没有进程占用了特别高的CPU,也没有进程占用CPU时间过长。只是对DB的请求的进程过多(比较吻合3厂的实际状况—附件多,刷的快),加起来就整体过高。
      还发现了很多DLL是built in debug mode,这些DLL占用了过多的memory资源。
      后来根据Bon的建议,我们修改了IIS application pool的设定如下,解决过多请求不能及时处理,而造成CPU过高的问题。”
      这里有一些问答关于应用连接池(Application Pool)的设定,对理解这样的设置有一定的帮助:
      1. Is one application pool’s maximum memory usage 1.5G?
      A&:
      Each application pool is a w3wp.exe. w3wp.exe is a process. Every
      process has 2 G User mode virtual address, so the maximum memory usage
      for application pool is 2G. However, you can’t make sure that there is
      no memory fragment issue. Therefore, Out of memory always occur after
      1.5 G according to our experience.
      2. Is each application pool independent on memory usage?
      A&: Different application pools are different w3wp.exe, so each application pool’s maximum memory usage is 2G.
      3. Can setup maximum CPU usage on each application pool?
      A&: You can monitor it, but you can’t setup it.

时间: 2024-10-18 16:15:37

ASP.NET开发网站程序常见错误汇总的相关文章

李洪强iOS开发之OC常见错误汇总

// //  main.m //  16 - 常见错误汇总 // //  Created by vic fan on 16/7/13. //  Copyright © 2016年 李洪强. All rights reserved. // OC的常见错误汇总: 1 @interface ... @end  和 @implementation ..@end 之间不能嵌套 2只有类的声明没有类的实现 3 漏写@end 4 两个类的声明顺序可以打乱,但是类的声明一定要在类的实现前面 5 成员变量没有放在

eclipse远程debug服务器上的项目(Tomcat),打开、关闭及常见错误汇总

我们工作中,有时候测试/生产环境,出现的结果会与我们预计的不一样,只看代码又看不出去问题所在,这个时候就需要远程debug下服务器上的项目. 注意:(1)需要debug的代码,本机代码需与服务器上一致.(2)保证服务器下开了允许远程debug的端口 一.打开远程debug 1.右击要debug的项目,Run As ->Debug Configurations,找到Remove Java Application,如下: 填下远程主机IP和端口 备注:如何找预留的debug端口:一般而言,找到对应项

web程序常见错误及解决方法

404错误产生原因及解决方法 在刚开始进行Web应用开发的时候,经常看见页面出现404这个数字,我们一般会称之为运行产生了404错误.类似于404这个数字,还有可能在页面上看到405.500这两个数字,他们都是服务器执行完客户端的请求以后,返回给客户端的一个关于执行结果的状态编码说明. 如果在运行结果页面中没有看到期待的页面,却看到了404.405.500这样的数字,那么代表着服务器告诉客户端运行产生了错误,掌握何种错误情况产生对应的数字将有利于问题的解决. 404产生的原因为Web服务器(容器

微信小程序常见错误及基本排除方法

也接触了不少人解决问题的过程里,有一些比较难以排查的可能性列举在这,方便大家看一下: 也欢迎大家把自己常用的排除方法列举在这,一起互相学习探讨! 1:ES6:使用es6可能导致安卓端真机调试时很多问题出现,还有其他未知问题:原因未知: 2:字母拼错,包括字母拼写错误,大小写没有注意:微信小程序中,有大量这样的代码示例,从中间冒出一个大写,比如支付中的appId 3:官方文档示例代码有误,有时官方文档示例代码也会出现问题,比如大小写出错,或者其他缺少参数等问题: 4:https,这个坑目前遇到的人

hadoop 常见错误汇总

1:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out Answer: 程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了. 修改办法: 修改2个文件.        /etc/security/limits.conf vi /etc/security/limits.conf 加上: * soft nofile 102400 * h

vscode常见错误汇总(长期更新)

1.错误提示 Q:不是每一个红波浪线都是错误,都需要修改 A: 看下面这个地方: 这里的from确实标记了红色波浪线,鼠标放上去还有提示: 但是,这里并不需要修改,因为pep8检查很严格,我们这里前面是针对整个工程,把工程目录添加到了环境变量在前,所以这里不需要修改. 这里可以简单记作:只有运行python脚本的时候运行失败了,才是必须要修改的错误. 其他提示:比如空多少行,空多少格,单行字符串字数过多等,都可以课上的说明为主,忽略多余的警告提示. 2.插件安装 默认Py开头的,在需要时候会有提

第2坑:全局配置文件 app.json 常见错误汇总

[我是坑]:全局配置文件 app.json 容易出现错误如下: 文件路径出错. 没有在 pages 上配置页面. 代码注释. 使用单引号. [解决]: 1.文件路径出错文件路径写错,比如单词写错或少了目录名,这个比较容易发现.另外,文件名不需要写文件后缀,因为框架会自动去寻找路径下 .json, .js, .wxml, .wxss 四个文件进行整合. 2.没有在 pages 上配置页面这个错误也比较容易发现,毕竟 pages 配置项没有配置页面,跳转页面时也会有提示. 3.代码注释给代码写注释是

MyEclipse常见错误汇总,中英注释版(长期更新)

No.1 当一条语句漏写分号时错误描述如下 Syntax error, insert ";" to complete Statement(语法错误:插入分号完成语句描述) No.2 当漏写双引号的时候错误描述如下      你好cannot be resolved(你好 不能被解析)

jni开发中的常见错误

* java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 * 本地函数名写错 * 忘记加载.so文件 没有调用System.loadlibrary * findLibrary returned null * System.loadLibrary("libhello"); 加载动态链接库时 动态链接库名字写错 * 平台类型错误 把只支持arm平台的.so文件部署到了 x86cpu的设备上 * 在jni目录下创建