java jdbc不允许任何操作
我得到一个java jdbc不允许任何操作,java,jdbc,Java,Jdbc,我得到一个语句关闭后不允许进行任何操作。-非常明显,也不言自明 至于我的代码是怎么回事。在任何情况下,我想知道我如何能做到这一点在一个干净的方式 public class BaseClass { Connection con; Statement st; protected void establishDBConnection() throws ClassNotFoundException, SQLException { Class.forN
语句关闭后不允许进行任何操作。
-非常明显,也不言自明
至于我的代码是怎么回事。在任何情况下,我想知道我如何能做到这一点在一个干净的方式
public class BaseClass {
Connection con;
Statement st;
protected void establishDBConnection() throws ClassNotFoundException,
SQLException {
Class.forName("com.mysql.jdbc.Driver");
String cString = "....";
con = DriverManager.getConnection(cString, user, password);
st = con.createStatement();
}
public BaseClass() {
try {
createDBConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public ClassB extends BaseClass {
public ClassB() {
super();
}
public void doSomething() {
try {
String q = "select * from my_table";
String moreQuery = "update my_table ...."
String anotherQuery = "do something fancy..."
rs = st.executeQuery(q);
while (rs.next()) {
st.executeUpdate(moreQuery);
st.executeUpdate(anotherQuery);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error in getAllAssociatesOfMra: " + e);
}
}
}
当前我的代码正在抛出一个com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:语句关闭后不允许执行任何操作。
关于发生了什么,例外是显而易见的,但我想知道如何处理基类中的结束
更新
我知道有几个像我这样的相关问题。这些问题的唯一问题是所有的事情都是在主课上完成的。认为这是一种设计/抽象问题 < P>你的设计不好。您最好从连接池获取连接,在
doSomething()
方法的开头创建语句(例如调用超类方法),然后在完成“某事”后关闭语句
和结果集
.如果我理解您的问题和目标,您将需要在doSomething()
中创建多个语句对象,并且您需要在finally块中清理语句和结果集,如-
Statement st = con.createStatement();
String q = "select * from my_table";
String moreQuery = "update my_table ....";
String anotherQuery = "do something fancy...";
ResultSet rs = st.executeQuery(q);
try {
while (rs.next()) {
Statement stmt = null;
try {
stmt = con.createStatement();
stmt.executeUpdate(moreQuery);
} finally {
if (stmt != null) {
stmt.close();
}
}
try {
stmt = con.createStatement();
stmt.executeUpdate(anotherQuery);
} finally {
if (stmt != null) {
stmt.close();
}
}
}
} finally {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
}
我提出几点建议:
- 使用连接池设计
- 要防止语句关闭,可以使用
块关闭它们finally
- 因为在另一个查询之后有一个查询,所以使用(提交/回滚)来防止事情“半途而废”
- 它们需要一段时间来初始化,足够长的时间你不会想为每个用户请求创建一个新的。(如果数据库在同一台机器上,这几乎不会是一个大问题。)
- 它们的数量有限,您不希望一个用户请求占用的时间超过需要的时间,因为这将限制可以同时连接的其他用户的数量
- 在数据库连接对象上有一个提交方法,允许您将操作分组到事务中,以便a)您的查询具有一致的数据视图,b)以全有或全无的方式应用操作(如果操作失败,您不会有一半的操作将数据库弄得乱七八糟,您必须撤消)。当前,您的连接处于自动提交模式,这意味着每个操作都是单独提交的(并且您不能将操作分组在一起)
- 它们是同步的,因此一次只有一个线程可以使用它们。这样,多个用户就不会破坏彼此的工作,但如果您只有一个连接,您的应用程序将无法扩展,因为每个用户都在排队等待连接