有人可以告诉我在哪里以及如何关闭连接?我是否必须在Connection类或Controller类中关闭Connection?我已经尝试在连接类的方法结尾处放置followin:
def most_common(ar):
y = {}
for item in ar:
y.setdefault(item, 0)
y[item] += 1
return max(y.items(), key=lambda x: x[1])
array = [1, 2, 1, 1, 2, 1, 3, 3, 1]
most_common(array)
(1, 5) # (Most common item, occurrences of item)
然后我得到: “声明结束后不允许任何操作。”
这是我的代码:
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
我从这里叫它:
public class DB_Connection {
String url = "XXX";
Statement statement;
public DB_Connection (){
try {
Connection con = (Connection) DriverManager.getConnection(url);
statement = (Statement) con.createStatement();
}
catch (SQLException ex){
System.out.println("Failed connection");
}
}
public void addSubject(String subject) throws SQLException {
try {
statement.executeUpdate("INSERT INTO `Subject` VALUES ('" + subject + "')" );
System.out.println("Added " + subject + "to database");
} catch(SQLException e) {
System.out.println("SQL Exception");
}
}
}
感谢您的帮助!
答案 0 :(得分:4)
完成使用后,您需要关闭连接。有很多方法可以解决这个问题,但我建议你这样做:
public class DBConnection implements AutoCloseable {
private String url = ...
private Connection con;
private Statement statement;
public DBConnection () throws SQLException {
try {
con = DriverManager.getConnection(url);
statement = con.createStatement();
} finally {
// Avoid leak if an exception was thrown in createStatement
if (statement == null) {
con.close();
}
}
}
public void addSubject(String subject) throws SQLException {
statement.executeUpdate("INSERT INTO `Subject` VALUES ('" +
subject + "')" );
}
public void close() throws SQLException {
con.close();
}
}
然后像这样使用它:
try (DBConnection connection = new DBConnection()) {
connection.addSubject("English");
}
解释/评论:
close()
方法是应用程序告诉DBConnection
类“我已完成”的方式。DBConnection
声明为“AutoCloaseable”意味着我们可以使用try-with-resources来管理闭包......这样更简单,更健壮。private
。SQLException
传播给调用者。这些例外无法在DBConnection
类本身中正确处理。另一种方法是完全取消DBConnection
类,并让调用代码处理连接对象和自身的语句。当然,在这个小例子中,DBConnection
抽象增加了最小的价值。
答案 1 :(得分:1)
当你按照斯蒂芬的指导行事时,请看看PreparedStatement
......
声明PreparedStatement
而不是Statement
:
private PreparedStatement pStmt;
创建PreparedStatement
:
pStmt = con.prepareStatement("INSERT INTO `Subject` VALUES (?)");
重复使用PreparedStatement
:
public void addSubject(String subject) throws SQLException {
pStmt.setString(1, subject);
pStmt.executeUpdate();
pStmt.clearParameters();
}
允许重复使用并提供一些注射保护。
答案 2 :(得分:0)
根本不要将连接等作为成员变量。您应该将它们全部(Connection, Statement/PreparedStatement, ResultSet
)局部变量赋予它们并使用try-with-resources惯用法。
答案 3 :(得分:0)
不要在Connection类中关闭conn
对象,
最好只在DAO class
或Main method
或the Method itself.
例如:
public void addSubject(String subject) throws SQLException {
........
........//**some operations**
// close here after some operation done
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { sysout(e);}
}
}