数据库statement的问题

xqian 2003-10-20 05:03:36
在javaBean里面这样写:

public class loginBean {

public ResultSet sample;
private static Connection conn;
private static Statement stmt;

//取得当前用户信息
public ResultSet getLogin(String paralogin,String paraIP) {
try {
if (conn == null){
//OpenConnection是一个自己写的,专门打开connection的包,getconn方法返回一个connection.
OpenConnection oc1=new OpenConnection();
conn=oc1.getconn();
}
if(stmt!=null) //(2)
{
stmt.close();
}
stmt = conn.createStatement (); //(1)
String querystr = "select * from user where userid='" + paralogin + "'";
ResultSet rset = stmt.executeQuery (querystr);
sample = rset;

} catch(Exception e) {e.printStackTrace();}
return sample;
}

……

}


原来并没有(2)处的if块,在网站刚刚重新发布的时候是没问题的,但是过了一段时间(大约是1小时吧)后,调用的网页就得不到ResultSet返回了。进行调试,发现程序运行到(1)处的时候不会动了。后来加上了(2)处的if块,结果1小时后在(2)处的close语句不会动了。
请问这是怎么一回事啊?
...全文
91 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqian 2003-10-21
  • 打赏
  • 举报
回复
没有用到连接池啊,我就直接用jdbc连接了。我迟点是会用连接池的,但是就不明白为什么会出现上面的问题,而且不知道用了连接池是否能避免上面的问题。哪位有经验的高手帮忙解释一下啊?
wwwevil 2003-10-21
  • 打赏
  • 举报
回复
如果你用了数据库连接池的话,应该释放Connection的实例给连接池
xqian 2003-10-21
  • 打赏
  • 举报
回复
啊?会有这样的同步问题的吗?为什么开始运行不会出错,运行久了就会有问题呢?那解决问题是怎样呢?
starfeng 2003-10-20
  • 打赏
  • 举报
回复
你的这种设计会带来很多的问题,最好不要private static Statement stmt,因为这会带来同步或其它的一些问题,开始运行不会出错,运行久了就问题来了。
比方你的这条语句:
1.stmt = conn.createStatement ();
2.String querystr = "select * from user where userid='" + paralogin + "'";
3.ResultSet rset = stmt.executeQuery (querystr);
A用户执行了语句2,这时B用户执行b到语句1
那么,这时就出了一个问题了,因为stmt是只有一个实例的,当初A生成的那个实例就被B给盖掉了!!!!

xqian 2003-10-20
  • 打赏
  • 举报
回复
问题是页面的jsp要用到Resultset啊,难道要重新写一个方法来关掉rs,stmt和conn吗?明天回来继续。先谢过各位
fft123 2003-10-20
  • 打赏
  • 举报
回复
ResultSet用完了也要释放的
stmt在rs关闭后也可以释放
conn的话,如果本次连接不再需要,最好也释放掉
关闭的顺序是,先rs,然后stmt,最后conn

如果数据库访问率高,最好配连结池
xqian 2003-10-20
  • 打赏
  • 举报
回复
我试过在return后面执行stmt.close和conn.close,结果出错了,错误信息大概是还在使用当中,不能关闭之类的吧。
huangjiuyt 2003-10-20
  • 打赏
  • 举报
回复
你應該用完以後close關閉呀
xqian 2003-10-20
  • 打赏
  • 举报
回复
不懂得怎样释放,因为要返回ResultSet,所以不敢写stmt.close和conn.close。
请问应该在哪里写?
fft123 2003-10-20
  • 打赏
  • 举报
回复
用完的资源都释放了没?
xqian 2003-10-20
  • 打赏
  • 举报
回复
在每条语句后加上system.out.print(前一条语句),这样就知道他执行到哪个语句了。因为很繁琐,所以贴代码的时候把他们删掉了。
huangry 2003-10-20
  • 打赏
  • 举报
回复
up
hajavaor 2003-10-20
  • 打赏
  • 举报
回复
怎么调试的呀?
请问。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧