帮朋友忙,检查一份代码,代码是一个未出校门的学生写的,我不做过多的评价,个人自己看吧。
1、数据库连接的关闭问题
在代码中,DBBean负责处理数据库的连接、更新和删除操作,在这个类中Hold了一个Connection,使用DBBean的类必须显示的调用close关闭数据库;另外一个处理数据库配置和连接的类DB的机制等同于DBBean,实际上,DBBean调用DB生成数据库连接。
代码中相关数据库连接的问题有
a)部分代码没有关闭数据库连接的操作,这样会导致并发性能下降。
b)没有异常处理,在业务逻辑处理过程中,如果出现异常,则不会关闭l连接,例如下面的代码
this.db.executeUpdateWithoutClose("delete from [convert]");
.....
this.db.closeDB();
如果在执行过程中executeUpdateWithoutClose出现异常,则数据库连接不会被主动关闭。
c)关闭数据库连接的时候最好先关闭对应的Statement,在Oracle9i最初的版本中我们测试出来一个很强的BUG就是关于这个的,连接被关闭之后服务器端游标还存在,游标很占资源。
2、异常处理问题
在代码中,异常处理近乎为0,表现在:
a)显式的捕捉异常,直接用System.out打印到后台,没有进行实际的处理。除非检查Tomcat的窗口,否则这些异常永远不会被发现。
b)大量的函数抛出的是公共异常(异常基类)Exception,而非专有异常,对程序调试和后期诊断是一个非常大的挑战。
c)当使用系统资源的时候(例如文件资源、数据库连接等等)检测到异常的时候没有释放异常,这个会导致内存泄露。
d)如第一点,异常信息无法反馈到前端页面,也就是说用户不会看到有异常。
e)没有空指针检查,这种检查简单而且实用,值得做做。
3、输出导致的性能问题
大量的使用System.out输出到Console窗口,导致性能下降,因为Console窗口输出缓冲比较小,内存切换的时间长。
4、SQL语句用法错误
SQL语句用法错误主要包括
a)变量名直接拼接SQL语句,例如"select * from A where F1="+V+" and X='"+X+"'",这个潜在的问题有,1、当V是空的时候,会拼接成一个null字符串在该处,2、当V是整数而且数据够大的时候,会生成科学计数法的字符串,在百分之90的数据库中被视为非法值导致SQL执行失败,3、X值中存在单引号的时候导致SQL失效,4、曾几何时,SQL注入攻击就是这么发生的。
b)表格名称使用了SQLSevrer系列(TSQL)的语法,不利于移植。 TOP也属于此列。
c)Insert语句中没有字段列表,直接使用的是Insert inti TableName values(...)的方式,严重依赖在数据库中表格字段的顺序,一旦顺序调换则产生不可预知的错误。
5、代码结构错误
代码结构中的错误包含设计结构上面的错误,JAVA语法的错误和封装错误,
a)DBBean所有成员变量为Public的,不合符封装的基础理论,
b)每一个DBBean的实例都携带一个数据库连接、一个ResultSet,太占资源了。
c)分页逻辑 getRecordsByCon 严重错误,具体为什么,请自行查看TOP的用法。
d)CheckBank类中,有久违的跳转函数(函数 doGet, 跳转标签 label98),应该避免。