import java.sql.*;
public class DbConnect{
private static final String sConnStr = "jdbc:odbc:cafd2004";
private static final String sDBDriver= "sun.jdbc.odbc.JdbcOdbcDriver";
private Connection con = null;
private ResultSet rs = null;
private Statement stmt = null;
private PreparedStatement prestmt = null;
public DbConnect(){
try{
Class.forName(sDBDriver);
}catch(ClassNotFoundException e){
System.err.println(e.getMessage());
}
}
//执行SQL语句
public ResultSet executeSQL(String sql){
try{
con = DriverManager.getConnection(sConnStr);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
}catch(SQLException error){
System.err.println("执行executeSQL出错:"+error.getMessage());
}
return rs;
}
}
我多次调用函数executeSQL(String sql),但第二次调用时,执行到rs = stmt.executeQuery(sql);就执行不下去了,也不说出错,请问这是什么原因?
18 个解决方案
#1
rs没有关闭,可能导致数据表被锁住,第二次访问要等待第一次的访问释放资源。
try{
con = DriverManager.getConnection(sConnStr);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
}catch(SQLException error){
System.err.println("执行executeSQL出错:"+error.getMessage());
}finally{
rs.close();
}
try{
con = DriverManager.getConnection(sConnStr);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
}catch(SQLException error){
System.err.println("执行executeSQL出错:"+error.getMessage());
}finally{
rs.close();
}
#2
可我在执行前加了条语句rs =null;也不行啊
而且我把ResultSet rs = null;声明成函数内部的局部变量也不行,就是在public ResultSet executeSQL(String sql){ 的下面声明
而且我把ResultSet rs = null;声明成函数内部的局部变量也不行,就是在public ResultSet executeSQL(String sql){ 的下面声明
#3
同意二楼的。
要关闭
要关闭
#4
是的,每次用完数据库资源都应该及时关闭!
#5
rs = null;
和
rs.close();
是2码事。
就好像一个东西弄丢了和他在这个世界消失了有所不同。
和
rs.close();
是2码事。
就好像一个东西弄丢了和他在这个世界消失了有所不同。
#6
编程习惯不好,RS&CONN一定要关的,不然连接到了一定的个数后就再也连不上了
#7
rs = null;
这个结果集要等jvm垃圾回收的时候才会被关闭,但是你不知道jvm什么时候进行垃圾回收。
这个结果集要等jvm垃圾回收的时候才会被关闭,但是你不知道jvm什么时候进行垃圾回收。
#8
final{
rs.close(); //关闭结果集连接
rs=null; //结果集置空
con.close(); //关闭数据库连接
}
rs.close(); //关闭结果集连接
rs=null; //结果集置空
con.close(); //关闭数据库连接
}
#9
还有stmt也要关闭吗?
#10
我在一些地方看到说,使用同一个stmt,打开第二个rs的时候,它会自动把第一个打开的rs关闭,这样的话怎么还需要手动关闭?
谢谢
谢谢
#11
ResultSet rs1;
ResultSet rs2;
rs1 = stmt.executeQuery(sql);
rs2=rs1
其中rs2需不需要close?不过close好像也不会出错吧??
ResultSet rs2;
rs1 = stmt.executeQuery(sql);
rs2=rs1
其中rs2需不需要close?不过close好像也不会出错吧??
#12
!!!!
#13
rs2=rs1;
这两个就变成同一个东东啦,所以rs1如果close,等同于rs2也close了。
stmt这个东东是使用tcpip连接访问数据库的,同一个连接是不能支持两个打开的对话(就如同你不能用一个电话同时和两个人说话一样),所以你一定要先挂掉一个电话,再拨一次号
这两个就变成同一个东东啦,所以rs1如果close,等同于rs2也close了。
stmt这个东东是使用tcpip连接访问数据库的,同一个连接是不能支持两个打开的对话(就如同你不能用一个电话同时和两个人说话一样),所以你一定要先挂掉一个电话,再拨一次号
#14
一个Statement只能对应一个查询
一个Statement可以对应多个插入、删除、更新操作
每个查询使用完毕后 Statement对象必须关闭 ResultSet对象最好关闭
一个Statement可以对应多个插入、删除、更新操作
每个查询使用完毕后 Statement对象必须关闭 ResultSet对象最好关闭
#15
你使用的查询方式是
ResultSet.CONCUR_UPDATABLE
这种查询会在记录级或表级上加锁,相当于
select * from user for update
又一个线程也想
select * from user for update
数据库就不干了,所以就会停在这里,只有等第一个线程执行完后
或commit结束了它的事物,第二个线程才能继续执行下去
ResultSet.CONCUR_UPDATABLE
这种查询会在记录级或表级上加锁,相当于
select * from user for update
又一个线程也想
select * from user for update
数据库就不干了,所以就会停在这里,只有等第一个线程执行完后
或commit结束了它的事物,第二个线程才能继续执行下去
#16
哦,怪不得我一次用ResultSet.CONCUR_READONLY没事,改用ResultSet.CONCUR_UPDATABLE就不执行了,原来如此,谢谢!!
#17
学习
#18
对的锁住了
#1
rs没有关闭,可能导致数据表被锁住,第二次访问要等待第一次的访问释放资源。
try{
con = DriverManager.getConnection(sConnStr);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
}catch(SQLException error){
System.err.println("执行executeSQL出错:"+error.getMessage());
}finally{
rs.close();
}
try{
con = DriverManager.getConnection(sConnStr);
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
}catch(SQLException error){
System.err.println("执行executeSQL出错:"+error.getMessage());
}finally{
rs.close();
}
#2
可我在执行前加了条语句rs =null;也不行啊
而且我把ResultSet rs = null;声明成函数内部的局部变量也不行,就是在public ResultSet executeSQL(String sql){ 的下面声明
而且我把ResultSet rs = null;声明成函数内部的局部变量也不行,就是在public ResultSet executeSQL(String sql){ 的下面声明
#3
同意二楼的。
要关闭
要关闭
#4
是的,每次用完数据库资源都应该及时关闭!
#5
rs = null;
和
rs.close();
是2码事。
就好像一个东西弄丢了和他在这个世界消失了有所不同。
和
rs.close();
是2码事。
就好像一个东西弄丢了和他在这个世界消失了有所不同。
#6
编程习惯不好,RS&CONN一定要关的,不然连接到了一定的个数后就再也连不上了
#7
rs = null;
这个结果集要等jvm垃圾回收的时候才会被关闭,但是你不知道jvm什么时候进行垃圾回收。
这个结果集要等jvm垃圾回收的时候才会被关闭,但是你不知道jvm什么时候进行垃圾回收。
#8
final{
rs.close(); //关闭结果集连接
rs=null; //结果集置空
con.close(); //关闭数据库连接
}
rs.close(); //关闭结果集连接
rs=null; //结果集置空
con.close(); //关闭数据库连接
}
#9
还有stmt也要关闭吗?
#10
我在一些地方看到说,使用同一个stmt,打开第二个rs的时候,它会自动把第一个打开的rs关闭,这样的话怎么还需要手动关闭?
谢谢
谢谢
#11
ResultSet rs1;
ResultSet rs2;
rs1 = stmt.executeQuery(sql);
rs2=rs1
其中rs2需不需要close?不过close好像也不会出错吧??
ResultSet rs2;
rs1 = stmt.executeQuery(sql);
rs2=rs1
其中rs2需不需要close?不过close好像也不会出错吧??
#12
!!!!
#13
rs2=rs1;
这两个就变成同一个东东啦,所以rs1如果close,等同于rs2也close了。
stmt这个东东是使用tcpip连接访问数据库的,同一个连接是不能支持两个打开的对话(就如同你不能用一个电话同时和两个人说话一样),所以你一定要先挂掉一个电话,再拨一次号
这两个就变成同一个东东啦,所以rs1如果close,等同于rs2也close了。
stmt这个东东是使用tcpip连接访问数据库的,同一个连接是不能支持两个打开的对话(就如同你不能用一个电话同时和两个人说话一样),所以你一定要先挂掉一个电话,再拨一次号
#14
一个Statement只能对应一个查询
一个Statement可以对应多个插入、删除、更新操作
每个查询使用完毕后 Statement对象必须关闭 ResultSet对象最好关闭
一个Statement可以对应多个插入、删除、更新操作
每个查询使用完毕后 Statement对象必须关闭 ResultSet对象最好关闭
#15
你使用的查询方式是
ResultSet.CONCUR_UPDATABLE
这种查询会在记录级或表级上加锁,相当于
select * from user for update
又一个线程也想
select * from user for update
数据库就不干了,所以就会停在这里,只有等第一个线程执行完后
或commit结束了它的事物,第二个线程才能继续执行下去
ResultSet.CONCUR_UPDATABLE
这种查询会在记录级或表级上加锁,相当于
select * from user for update
又一个线程也想
select * from user for update
数据库就不干了,所以就会停在这里,只有等第一个线程执行完后
或commit结束了它的事物,第二个线程才能继续执行下去
#16
哦,怪不得我一次用ResultSet.CONCUR_READONLY没事,改用ResultSet.CONCUR_UPDATABLE就不执行了,原来如此,谢谢!!
#17
学习
#18
对的锁住了