我有2个类ConnectionUtil,DemoResultSet。问题是当我运行插入2次()时。然后只有1条记录被插入数据库。第二个插入创建错误:"Error:The connection is closed."
。所以当我取消注释close() statement
时。它运行得很好。我不知道有什么麻烦。任何人都给我一些想法
public class ConnectionUtil {
private static String url = "jdbc:sqlserver://localhost:1433;databaseName=Northwind";
private static String username = "user";
private static String pw = "pass";
private static Connection conn = null;
static {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException ex) {
Logger.getLogger(ConnectionUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static Connection getConnection() {
if (conn == null) {
try {
conn = DriverManager.getConnection(url, username, pw);
} catch (SQLException ex) {
Logger.getLogger(ConnectionUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
return conn;
}
}
public class DemoResultSet {
private static ResultSet rs = null;
private static Connection conn = null;
public static void initialize() {
try {
conn = ConnectionUtil.getConnection();
Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE );
String sql = "select CategoryID, CategoryName from Categories";
rs = statement.executeQuery(sql);
} catch (SQLException ex) {
Logger.getLogger(DemoResultSet.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String[] args) {
initialize();
insert();
insert();
}
public static void insert() {
try {
rs.moveToInsertRow();
rs.updateString("CategoryName", "Test C1008G3");
rs.insertRow();
System.out.println("Inserted");
conn.close(); //uncomment it's okay
} catch (SQLException ex) {
System.out.println("Error:" + ex.getMessage());
}
}
}
答案 0 :(得分:2)
您正在关闭插入内部的连接,因此第二次插入发生在已关闭的连接上。
conn.close(),应该像这样放置:
public static void main(String[] args) throws Exception{
try{
initialize();
insert();
insert();
}
finally{
conn.close();
}
}
这样您就可以保证在出现任何问题时正确关闭连接。
答案 1 :(得分:0)
在您的插入方法中,您有conn.close(); //uncomment it's okay
但不是!
关闭此连接后,请勿再次打开它。
答案 2 :(得分:0)
jdbc连接是一个有点重的对象,它背后的想法并不是在每次操作后都不关闭它,而是重用多个任务的连接。应用程序完成后,您应该关闭连接。如果你坚持自己的连接,你必须在每次关闭后重新初始化。
答案 3 :(得分:0)
问题是你在关闭所述连接后试图写入连接。 你可以取消注释那条线,但这只是不好的做法。 我的建议:调用initialize();方法不是来自main方法,而是insert方法中的第一个语句。
这样,您确定每次需要时都有连接。