2012-04-12 9 views
1

データベースへの複数の呼び出しを実行しようとしていますが、最初のもの(選択)はうまく動作しますが、2番目のエラーが発生したときにこのエラーが発生します。トランザクションの終了後に操作を実行できないことを示すプログラム

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.Util.getInstance(Util.java:381) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
    at com.mysql.jdbc.StatementImpl.checkClosed(StatementImpl.java:380) 
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1250) 
    at MysqlConnect.main(MysqlConnect.java:77) 
    at __SHELL13.run(__SHELL13.java:6) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at bluej.runtime.ExecServer$3.run(ExecServer.java:724) 

そしてここでは、私のコードは(まだ学んを言い訳してください)です

import java.sql.*; 

public class MysqlConnect{ 

    public static void main(String[] args) { 

    Connection conn = null; 

    String url = "jdbc:mysql://localhost:3306/"; 
    String dbName = "MyBussiness"; 
    String driver = "com.mysql.jdbc.Driver"; 
    String userName = "mambo"; 
    String password = "jambo"; 

    try { 
    Class.forName(driver).newInstance(); 
    conn = DriverManager.getConnection(url+dbName,userName,password); 



    System.out.println("Connected to the database"); 
     /*SELECTING DATA */ 
     // Get a statement from the connection 
     Statement stmt = conn.createStatement() ; 
     System.out.println("--------------------------------------------."); 
     System.out.println("Retrieving items from the customers table (USING SELECT)..."); 
     System.out.println("--------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the query 
     ResultSet rs = stmt.executeQuery("SELECT * FROM customers") ; 

     // Loop through the result set 
     while(rs.next()) 
     { 
      System.out.print(rs.getInt(1)) ; 
      System.out.print(",  "); 
      System.out.print(rs.getString(2)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(3)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(4)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(5)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(6)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(7)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(8)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(9)); 
      System.out.print(",  "); 
      System.out.println(rs.getString(10)); 
     } 

     // Close the result set, statement and the connection 
     rs.close() ; 
     stmt.close() ; 



     /*UPDATING DATA */ 
     // Get a statement from the connection 
     conn = DriverManager.getConnection(url+dbName,userName,password); 
     Statement stmt2 = conn.createStatement() ; 
     System.out.println("---------------------------------------------------------------------------."); 
     System.out.println("Updating Customers Table for Customer ID 1 Federico Gutierrez Address1 Field (USING UPDATE)..."); 
     System.out.println("---------------------------------------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the query 
     ResultSet rs2 = stmt.executeQuery("UPDATE Customers SET Address1='999 Mambo Avenue' WHERE CustomerID = 1"); 

     // Loop through the result set 
     while(rs2.next()) 
     { 
      System.out.print(rs2.getInt(1)) ; 
      System.out.print(",  "); 
      System.out.print(rs2.getString(2)); 
      System.out.print(",  "); 
      System.out.print(rs2.getString(3)); 
      System.out.print(",  "); 
      System.out.print(rs2.getString(4)); 
      System.out.print(",  "); 
      System.out.print(rs2.getString(5)); 
      System.out.print(",  "); 
      System.out.print(rs2.getString(6)); 
      System.out.print(",  "); 
      System.out.print(rs2.getString(7)); 
      System.out.print(",  "); 
      System.out.print(rs2.getString(8)); 
      System.out.print(",  "); 
      System.out.print(rs2.getString(9)); 
      System.out.print(",  "); 
      System.out.println(rs2.getString(10)); 
     } 

     // Close the result set, statement and the connection 
     rs2.close() ; 
     stmt2.close() ; 


      /*INSERTING DATA */ 
     // Get a statement from the connection 
     conn = DriverManager.getConnection(url+dbName,userName,password); 
     Statement stmt3 = conn.createStatement() ; 
     System.out.println("---------------------------------------------------------------------------."); 
     System.out.println("Inserting a new customer (Mario Villalobos) into the customers table ... (USING INSERT)"); 
     System.out.println("---------------------------------------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the query 
     ResultSet rs3 = stmt.executeQuery("INSERT INTO Customers (SSN, FirstName, LastName, Address1, Address2, State, City, Zip, PhoneNumber)"+ 
              " VALUES ('444559999','Mario','Villalobos','777 Boynton Beach','Apt 4R','FL','Boynton Beach','33436','(555)444-5555'"); 

     // Loop through the result set 
     while(rs3.next()) 
     { 
      System.out.print(rs3.getInt(1)) ; 
      System.out.print(",  "); 
      System.out.print(rs3.getString(2)); 
      System.out.print(",  "); 
      System.out.print(rs3.getString(3)); 
      System.out.print(",  "); 
      System.out.print(rs3.getString(4)); 
      System.out.print(",  "); 
      System.out.print(rs3.getString(5)); 
      System.out.print(",  "); 
      System.out.print(rs3.getString(6)); 
      System.out.print(",  "); 
      System.out.print(rs3.getString(7)); 
      System.out.print(",  "); 
      System.out.print(rs3.getString(8)); 
      System.out.print(",  "); 
      System.out.print(rs3.getString(9)); 
      System.out.print(",  "); 
      System.out.println(rs3.getString(10)); 
     } 

     // Close the result set, statement and the connection 
     rs3.close() ; 
     stmt3.close() ; 


        /*DELETING DATA */ 
     // Get a statement from the connection 
     conn = DriverManager.getConnection(url+dbName,userName,password); 
     Statement stmt4 = conn.createStatement() ; 
     System.out.println("---------------------------------------------------------------------------."); 
     System.out.println("Deleting customer where the name is George... (USING Delete)"); 
     System.out.println("---------------------------------------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the query 
     ResultSet rs4 = stmt.executeQuery("DELETE FROM Customers WHERE FirstName Like '%George%'"); 

     // Loop through the result set 
     while(rs4.next()) 
     { 
      System.out.print(rs4.getInt(1)) ; 
      System.out.print(",  "); 
      System.out.print(rs4.getString(2)); 
      System.out.print(",  "); 
      System.out.print(rs4.getString(3)); 
      System.out.print(",  "); 
      System.out.print(rs4.getString(4)); 
      System.out.print(",  "); 
      System.out.print(rs4.getString(5)); 
      System.out.print(",  "); 
      System.out.print(rs4.getString(6)); 
      System.out.print(",  "); 
      System.out.print(rs4.getString(7)); 
      System.out.print(",  "); 
      System.out.print(rs4.getString(8)); 
      System.out.print(",  "); 
      System.out.print(rs4.getString(9)); 
      System.out.print(",  "); 
      System.out.println(rs4.getString(10)); 
     } 

     // Close the result set, statement and the connection 
     rs4.close() ; 
     stmt4.close() ; 

     //Reseting data 
     conn = DriverManager.getConnection(url+dbName,userName,password); 
     Statement stmt5 = conn.createStatement() ; 
     ResultSet rs5 = stmt.executeQuery("UPDATE Customers SET Address1='555 YY Ave' WHERE CustomerID = 1"); 
     rs5.close() ; 
     stmt5.close() ; 

     conn = DriverManager.getConnection(url+dbName,userName,password); 
     Statement stmt6 = conn.createStatement() ; 
     ResultSet rs6 = stmt.executeQuery("DELETE FROM Customers WHERE FirstName Like '%Mario%'"); 
     rs6.close() ; 
     stmt6.close() ; 
     conn = DriverManager.getConnection(url+dbName,userName,password);  
     Statement stmt7 = conn.createStatement() ; 
     ResultSet rs7 = stmt.executeQuery("INSERT INTO Customers (SSN, FirstName, LastName, Address1, Address2, State, City, Zip, PhoneNumber)"+ 
              " VALUES ('923431432','George','Scott','2325 S Babcock St',' ','FL','Melbourne','32901','(321)984-4910'"); 
     rs7.close() ; 
     stmt7.close() ; 
     conn.close() ; 


    System.out.println("Disconnected from database"); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    } 
} 

任意の助けもいただければ幸いです。

注:最初のパスの後に接続が閉じられていますが、conn.Close()はありません。あなたが見ることができるように最後まで。

+0

私はそれを改善することができますので、投票の理由?。 – jedgard

答えて

3
ResultSet rs2 = stmt.executeQuery(...) 
      // ^^^^ 

ここにはstmt2を意味しました。文を再利用しないようにすべてのコードを再確認してください。

+0

多くの意味がありますので、再確認していただきありがとうございます – jedgard

+0

正解ですが、最初のクエリの後にstmtを閉じてしまっています(コードスニペットに行番号が表示されないのはなぜですか? – hcpl

1

これまでに見つからなかった場合は、すでに閉じた同じSQlStatementを再使用しています。ライン:

ResultSet rs2 = stmt.executeQuery("UPDATE Customers SET Address1='999 Mambo Avenue' WHERE CustomerID = 1"); 

は次のようになります。

ResultSet rs2 = stmt2.executeQuery("UPDATE Customers SET Address1='999 Mambo Avenue' WHERE CustomerID = 1"); 
0

いくつかの修正が行われますが、コードはまだ素敵ではありません。うまくいくはずです。

import java.sql.*; 

public class MysqlConnect{ 

    public static void main(String[] args) { 

    Connection conn = null; 

    String url = "jdbc:mysql://localhost:3306/"; 
    String dbName = "MyBussiness"; 
    String driver = "com.mysql.jdbc.Driver"; 
    String userName = "mambo"; 
    String password = "jambo"; 

    try { 
    Class.forName(driver).newInstance(); 
    conn = DriverManager.getConnection(url+dbName,userName,password); 



    System.out.println("Connected to the database"); 
     /*SELECTING DATA */ 
     // Get a statement from the connection 
     Statement stmt = conn.createStatement() ; 
     System.out.println("--------------------------------------------."); 
     System.out.println("Retrieving items from the customers table (USING SELECT)..."); 
     System.out.println("--------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the query 
     ResultSet rs = stmt.executeQuery("SELECT * FROM customers") ; 

     // Loop through the result set 
     while(rs.next()) 
     { 
      System.out.print(rs.getInt(1)) ; 
      System.out.print(",  "); 
      System.out.print(rs.getString(2)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(3)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(4)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(5)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(6)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(7)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(8)); 
      System.out.print(",  "); 
      System.out.print(rs.getString(9)); 
      System.out.print(",  "); 
      System.out.println(rs.getString(10)); 
     } 

     // DO NOT Close the result set, statement and the connection 



     /*UPDATING DATA */ 
     // Get a statement from the connection 
     System.out.println("---------------------------------------------------------------------------."); 
     System.out.println("Updating Customers Table for Customer ID 1 Federico Gutierrez Address1 Field (USING UPDATE)..."); 
     System.out.println("---------------------------------------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the UPDATE 
     stmt.executeUpdate("UPDATE Customers SET Address1='999 Mambo Avenue' WHERE CustomerID = 1"); 

     // Loop through the result set 
     //NO ResultSet for UPDATE 

     // DON'T Close the result set, statement and the connection 



      /*INSERTING DATA */ 
     // Get a statement from the connection 

     System.out.println("---------------------------------------------------------------------------."); 
     System.out.println("Inserting a new customer (Mario Villalobos) into the customers table ... (USING INSERT)"); 
     System.out.println("---------------------------------------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the UPDATE 
    stmt.executeUpdate("INSERT INTO Customers (SSN, FirstName, LastName, Address1, Address2, State, City, Zip, PhoneNumber)"+ 
              " VALUES ('444559999','Mario','Villalobos','777 Boynton Beach','Apt 4R','FL','Boynton Beach','33436','(555)444-5555'"); 

     // Loop through the result set INSERT HAS NO RESULTSET 

     // Close the result set, statement and the connection 


        /*DELETING DATA */ 
     // Get a statement from the connection 
     System.out.println("---------------------------------------------------------------------------."); 
     System.out.println("Deleting customer where the name is George... (USING Delete)"); 
     System.out.println("---------------------------------------------------------------------------."); 
     Thread.sleep(2000); 
     // Execute the query, NO UPDATE 
     stmt.executeUpdate("DELETE FROM Customers WHERE FirstName Like '%George%'"); 

     // Loop through the result set 


     // Close the result set, statement and the connection 

     //Reseting data 
     stmt.executeUpdate("UPDATE Customers SET Address1='555 YY Ave' WHERE CustomerID = 1"); 

     stmt.executeUpdate("DELETE FROM Customers WHERE FirstName Like '%Mario%'"); 

     stmt.executeUpdate("INSERT INTO Customers (SSN, FirstName, LastName, Address1, Address2, State, City, Zip, PhoneNumber)"+ 
              " VALUES ('923431432','George','Scott','2325 S Babcock St',' ','FL','Melbourne','32901','(321)984-4910'"); 

    // NOW CLOSE DB RS, STATEMENT, CONN 
     rs.close() ; 


     stmt.close() ; 
     conn.close() ; 


    System.out.println("Disconnected from database"); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    } 
} 
関連する問題