获取java.sql.SQLException:ResultSet关闭后不允许进行操作当我执行以下代码时,出现异常。我认为这是因为我正在与他相同的连接对象编写新语句。我应该如何重写它,以便可以创建准备好的语句并开始使用rs2?即使连接到相同的数据库,我也必须创建一个新的连接对象吗?
try
{
//Get some stuff
String name = "";
String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
name = rs.getString("name");
}
String sql2 = "SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";";
ResultSet rs2 = statement.executeQuery(sql2);
String updateSql = "INSERT INTO `blah`............";
PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql);
while(rs2.next())
{
int id = rs2.getInt("id");
int stuff = getStuff(id);
pst.setInt(1, stuff);
pst.addBatch();
}
pst.executeBatch();
}
catch (Exception e)
{
e.printStackTrace();
}
private int getStuff(int id)
{
try
{
String sql = "SELECT ......;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
return rs.getInt("something");
}
return -1;
}//code continues
问题在于你在中获取数据的方式getStuff()
。每次访问getStuff()
你都会获得新鲜的食物,ResultSet
但你不会关闭它。
这违反了Statement该类的期望(请参见此处-http : //docs.oracle.com/javase/7/docs/api/java/sql/Statement.html):
默认情况下,每个Statement
对象只能同时打开一个ResultSet
对象。因此,如果一个ResultSet
对象的读取与另一个的读取交错,则每个都必须由不同的Statement
对象生成。如果存在打开的语句,Statement
接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。
更糟糕的是rs调用代码中的。它也从statement
字段外派生,但未关闭。
底线:你有多个ResultSet
与同一个Statement
对象同时打开。
问题内容: 我正在尝试执行getPendingSalesOrderIDs()方法,该方法调用方法selectInAsending(…)。 但这显示了一个SQLException,它说java.sql.SQLException:在ResultSet关闭后不允许进行该操作 此处db.endSelect()将关闭所有连接。 我认为问题就在于此。 问题答案: 如果关闭ResultSet,为什么不删除它(在
问题内容: 我被错误卡住了,这里的第42行是,请帮我解决这个问题,我在这里待了几个小时。 这是我的代码: 问题答案: 一个对象只能具有一个active对象,因此在执行时,第一个ResultSet()被关闭。 创建两个对象,一个用于,另一个用于。 引用以下内容的javadoc : 默认情况下,每个对象只能同时打开一个对象。因此,如果一个对象的读取与另一个对象的读取是交错的,则每个对象必须已由不同的对
我尝试使用Flyway6.0.beta2BaseJavaMigration和Mysql 出于某种原因,我得到了一个错误 无法回滚事务java.sql.sqlnontransientConnectionException:连接关闭后不允许任何操作。 原因是什么
我正在将MySQL与Java结合使用,试图制作shoppingcartDB,并试图删除从订购到现在已经过了30天的元组。 但是编译器说: 我如何解决这个问题? 代码: 抛出异常的代码行是: stmt。executeUpdate(“从篮子中删除,其中orderdate=““Odate”;”);
问题内容: 我构建了一个应用程序,并在本地部署了……并且运行良好。我将其部署在远程服务器上,并开始获取主题行中提到的异常。这不是因为防火墙问题。 我更改了通过IP地址而不是本地主机进行连接的方式,现在我在本地部署的应用程序上获得了相同的超时。当我使应用程序运行超过一天时,出现此错误。 我自己提交事务或关闭会话之后,我不执行任何操作。我正在使用以下属性 引起原因:com.mysql.jdbc.exc
问题内容: 我被错误卡住了,这里的第42行是,请帮我解决这个问题,我在这个问题上待了几个小时。 这是我的代码: 问题答案: 一个对象只能有一个active对象,因此在执行时,第一个ResultSet()被关闭。 创建两个对象,一个用于,另一个用于。 引用以下内容的javadoc : 默认情况下,每个对象只能同时打开一个对象。因此,如果一个对象的读取与另一对象的读取交错,则每个对象必须已由不同的对象