环境: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();
看来不能乱偷懒啊!