sql server Java jdbc无法插入到数据库
我有两个类连接到DemoResultSet。问题是当我运行插入2次时()。然后只向数据库插入一条记录。第二个insert create错误:"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());
}
}
}
# 1 楼答案
您正在插入中关闭连接,因此第二次插入发生在关闭的连接上
conn.close()的位置应该是这样的:
这样,在出现任何问题时,您可以保证连接正确关闭
# 2 楼答案
问题是,在关闭所述连接后,您正试图写入连接。 你可以取消那一行的注释,但那只是一种糟糕的做法。 我的建议是:调用initialize();方法不是从主方法内部,而是作为insert方法中的第一条语句
这样,你就可以确保每次需要时都能连接到它
# 3 楼答案
在insert方法中有
conn.close(); //uncomment it's okay
但事实并非如此
关闭此连接后,将不再打开它
# 4 楼答案
jdbc连接是一个有点沉重的对象,它背后的想法不是在每次操作后关闭它,而是在多个任务中重用连接。应用程序完成后,您应该关闭连接。如果你坚持自己的连接,你必须在每次关闭后重新初始化