2013-10-01 115 views
0

我有2個類ConnectionUtil,DemoResultSet。問題是當我運行插入2次()。然後只有1條記錄被插入數據庫。第二個插入創建錯誤:"Error:The connection is closed."。所以當我取消close() statement。它運行得很好。我不知道有什麼麻煩。任何人都給我一些想法Java jdbc無法插入數據庫

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()); 
     } 
    } 
} 

回答

2

您正在關閉插入內的連接,所以第二次插入發生在關閉的連接上。

的conn.close(),應該被放在像這樣:

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

這樣就可以保證連接在任何問題的情況下正常關閉。

0

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

但它不是!

關閉此連接後,您不會再打開它。

0

jdbc連接是一個有點沉重的對象,它背後的想法並不是在每次操作之後都關閉它,而是將連接重用於多個任務。你的應用程序完成後,你應該關閉你的連接。如果你堅持自己的連接,你必須在每次關閉後重新初始化。

0

問題是您在關閉所述連接後正在嘗試寫入Connection。 你可以取消註釋該行,但這只是不好的做法。 我的建議是:調用initialize();方法不是來自主方法內部,而是作爲插入方法中的第一條語句。

這樣,您確定每次需要時都有連接。

+0

我按照你的說法做了。但是我做錯了 – haind

+0

你會得到什麼錯誤? – Stultuske

+0

它顯示:2013年10月1日下午4點34分20秒ResultSetDemo.DemoResultSet初始化 錯誤:連接已關閉。 SEVERE:null – haind