0

我有 2 个类 ConnectionUtil、DemoResultSet。问题是当我运行insert 2 times()时,只有 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());
        }
    }
}
4

4 回答 4

2

您正在关闭插入内的连接,因此第二次插入发生在关闭的连接上。

conn.close() 应该像这样放置:

public static void main(String[] args) throws Exception{
    try{
        initialize();
        insert();
        insert();
    }
    finally{
        conn.close();
    }
}

这样您就可以保证在出现任何问题时正确关闭连接。

于 2013-10-01T07:44:54.297 回答
0

在您的插入方法中,您有conn.close(); //uncomment it's okay

但它不是!

关闭此连接后,您不会再次打开它。

于 2013-10-01T07:44:58.987 回答
0

jdbc 连接是一个有点重的对象,其背后的想法不是在每次操作后都关闭它,而是将连接重用于多个任务。应用程序完成后,您应该关闭连接。如果您坚持自己的连接,则必须在每次关闭后重新初始化。

于 2013-10-01T07:45:37.320 回答
0

问题是您在关闭所述连接后尝试写入连接。您可以取消注释该行,但这只是不好的做法。我的建议:调用初始化();方法不是来自主方法内部,而是作为插入方法中的第一条语句。

这样,您就可以确定每次需要时都能获得连接。

于 2013-10-01T07:45:40.777 回答