2017-11-27 11 views
0

多くのH2データベースチュートリアルでサーフィンしたので、デフォルトでデータベースへの最後の接続を閉じるとデータベースが閉じられます。メモリ内のデータベースの場合、これはコンテンツが失われたことを意味します。接続を閉じた後でも、データはh2データベーステーブルにまだ残っています

私はEmployee1テーブルを作成し、レコードを挿入して接続を閉じました。しかし、私はいつか同じデータベースに再接続するとEmployee1データを取得することができます。なぜデータはまだ存在していますか?上記のプログラムの

package connection; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class Connector { 

static Connection conn = null; 
static Statement stmt = null; 

public static void main(String[] args) { 

    System.out.println("Welcome!"); 
    Connector connector = new Connector(); 
    connector.createConnection(); 
    connector.createTable("Employee2"); 
    connector.insertRecord("Employee2"); 
    connector.readRecord("Employee2"); 
    connector.readRecord("Employee1"); //Employee1 Table which is created in previous execution but still it reads the data 
    connector.closeConnection(); 
} 

public void createConnection() { 
    try { 
     System.out.println("Creating connection"); 
     // STEP 1: Register JDBC driver 
     Class.forName("org.h2.Driver"); 
     // STEP 2: Open a connection 
     System.out.println("Connecting to database..."); 
     conn = DriverManager.getConnection("jdbc:h2:mem/db1", "sa", ""); 
    } catch (SQLException se) { 
     // Handle errors for JDBC 
     se.printStackTrace(); 
    } catch (Exception e) { 
     // Handle errors for Class.forName 
     e.printStackTrace(); 
    } 

} 

public void createTable(String tableName) { 
    try { 
     // STEP 3: Execute a query 
     System.out.println("Creating table in given database with the name of ..." + tableName); 
     stmt = conn.createStatement(); 
     String sql = "CREATE TABLE " + tableName + "(id INTEGER not NULL, " + " first VARCHAR(255), " 
       + " last VARCHAR(255), " + " age INTEGER, " + " PRIMARY KEY (id))"; 
     stmt.executeUpdate(sql); 
     System.out.println("Created table in given database..."); 

    } catch (SQLException se) { 
     // Handle errors for JDBC 
     se.printStackTrace(); 
    } catch (Exception e) { 
     // Handle errors for Class.forName 
     e.printStackTrace(); 
    } 
} 

public void insertRecord(String tableName) { 
    try { 
     // STEP 3: Execute a query 
     stmt = conn.createStatement(); 
     String sql = "INSERT INTO " + tableName + " VALUES (500, 'Zara', 'Ali', 18)"; 

     stmt.executeUpdate(sql); 
     sql = "INSERT INTO " + tableName + " VALUES (501, 'Mahnaz', 'Fatma', 25)"; 

     stmt.executeUpdate(sql); 
     sql = "INSERT INTO " + tableName + " VALUES (502, 'Zaid', 'Khan', 30)"; 

     stmt.executeUpdate(sql); 
     sql = "INSERT INTO " + tableName + " VALUES(503, 'Sumit', 'Mittal', 28)"; 

     stmt.executeUpdate(sql); 
     System.out.println("Inserted records into the table..."); 
    } catch (SQLException se) { 
     // Handle errors for JDBC 
     se.printStackTrace(); 
    } catch (Exception e) { 
     // Handle errors for Class.forName 
     e.printStackTrace(); 
    } 
} 

public void readRecord(String tableName) { 
    try { 
     System.out.println("Reading data from "+tableName); 
     stmt = conn.createStatement(); 
     String sql = "SELECT id, first, last, age FROM " + tableName; 
     ResultSet rs = stmt.executeQuery(sql); 

     // STEP 4: Extract data from result set 
     while (rs.next()) { 
      // Retrieve by column name 
      int id = rs.getInt("id"); 
      int age = rs.getInt("age"); 
      String first = rs.getString("first"); 
      String last = rs.getString("last"); 

      // Display values 
      System.out.print("ID: " + id); 
      System.out.print(", Age: " + age); 
      System.out.print(", First: " + first); 
      System.out.println(", Last: " + last); 
     } 
     // STEP 5: Clean-up environment 
     rs.close(); 
    } catch (SQLException se) { 
     // Handle errors for JDBC 
     se.printStackTrace(); 
    } catch (Exception e) { 
     // Handle errors for Class.forName 
     e.printStackTrace(); 
    } finally { 
     // finally block used to close resources 
     try { 
      if (stmt != null) 
       stmt.close(); 
     } catch (SQLException se2) { 
     } // nothing we can do 
    } // end try 
} 

public void closeConnection() { 
    try { 
     if (conn != null) { 
      conn.close(); 
      System.out.println("Connection Closed.."); 
     } 
    } catch (SQLException se) { 
     se.printStackTrace(); 
    } // end finally try 
} 
} 

出力:

Welcome! 
Creating connection 
Connecting to database... 
Creating table in given database with the name of ...Employee2 
Created table in given database... 
Inserted records into the table... 
Reading data from Employee2 
ID: 500, Age: 18, First: Zara, Last: Ali 
ID: 501, Age: 25, First: Mahnaz, Last: Fatma 
ID: 502, Age: 30, First: Zaid, Last: Khan 
ID: 503, Age: 28, First: Sumit, Last: Mittal 
Reading data from Employee1 
ID: 400, Age: 18, First: freeze, Last: Ali 
ID: 401, Age: 25, First: dora, Last: Fatma 
ID: 402, Age: 30, First: xer, Last: Khan 
ID: 403, Age: 28, First: kilo, Last: Mittal 
Connection Closed.. 
+0

差が見る

jdbc:h2:mem:db1 

注意:https://stackoverflow.com/questions/インメモリデータベース接続文字列がなければならないため

27057900/in-memory-database-h2-how-long-keep-connection-open – duffymo

+0

実際には接続を閉じた後でも、コンテンツは失われていません。私もconn = DriverManager.getConnection( "jdbc:h2:mem/db1; DB_CLOSE_DELAY = 0"、 "sa"、 "");を試してみました。しかし、それは動作しません。 – KarthikaSrinivasan

+0

私はあなたの問題を理解しています。私には説明がありません。 – duffymo

答えて

2

あなたはhere

jdbc:h2:mem/db1 

を見ることができるようにはとてもmem/db1の相対パスデータをローカルデータベースにファイルを接続しますファイルが保存されているので、まだ存在します。これらのいずれかが設定されている場合/:

+0

ありがとうございました。私は間違いにつながる多くのコードを混乱させ編集していました。 – KarthikaSrinivasan

関連する問題