您的位置:首页 > 数据库

Dao工具类能写成static方式吗?反复不定时出现"结果集关闭"或"空指针"问题的解决

2014-06-10 21:34 246 查看
环境:SQL Server 2000 ,Java7u55,TomCat

这几天在做Ajax过程中,发现了一个很严重的问题,

一个页面上,有三处get请求,在运行时经常随机出现各jdbc错误:

驱动中报异常:

1.空指针

2.结果集已关闭

3.socket closed

4....

5.很多种,想不起来了,

反正各种异常,问题是有一半的时间它是好用的,同一个页面有时又不好用了.最怕的就是这种现象啊,

解决过程:

1.由于SQL Server2000较老,怀疑是驱动问题,换了驱动,无果

2.怀疑连接打开太慢,加了c3p0连接池后,问题依旧

3.加入了各种调试语句,没有发现空指针的地方.

 

问题进入僵局.

 

看着自己写的Dao工具类,逻辑上没有发现不正确的地方,就是个简单的Jdbc调用过程.

但想到出现问题主要是在一个页面中有多次请求时,在一次请求的情况下并不出错,所以怀疑是并发方面的问题

突然想到自己为了偷懒,把工具类的执行方法写成了静态方法,把connection与ResultSet等数据库对象都写成了Static,

那么在快速的两次执行时,第二次在第一次没有结束时就开始执行,会不会是第二次与第一次干扰了呢,?

想到这里,我把Dao中数据库的cn和rs对象的Static去掉,把Dao类每次执行Sql语句时都New一下,问题解决

 

问题代码如下:

ResultSet rs=DaoDs.runSelect(sql, p);
//...使用Rs工作
DaoDs.close();//关闭相关对象

Dao工具类:cn,rs都是static的

public static ResultSet runSelect(String sql,Object ... p) throws Exception
{

try {

Class.forName(driver);
cn = DriverManager.getConnection(url, user, password);

ps = cn.prepareStatement(sql);

int i = 1;
if (p != null)
for (Object t : p) {
if (t == null)
break;
ps.setObject(i, t);
i++;
}

rs = ps.executeQuery();

return rs;
} catch (Exception e) {
// e.printStackTrace();
throw e;
// return null;
} finally {

}
}


修改后:Dao类中cn,rs不再是static,Dao工具类先new再用.

DaoDs2 d=new DaoDs2();
ResultSet rs=d.runSelect(sql, p);
//...使用Rs工作
d.close(); 

看来不能乱偷懒啊!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐