2011-10-21 13 views
1

データベース接続を別のクラスとして保存してから、メインコードからデータベースオブジェクトを呼び出すことはできますか?すなわち、データベース接続を別に保存するクラス - Java

public class main{ 
    public static void main{ 
     try{ 
      Class.forName("com.jdbc.driver"); 
      Database to = new Database(1,"SERVER1","DATABASE"); 
      Database from = new Database(2,"SERVER2","DATABASE"); 

      String QueryStr = String.format("SELECT * FROM TABLE WHERE Id = %i", to.id) 
      to.results = sql.executeQuery(QueryStr); 

      while (to.results.next()) { 
       String QueryStr = String.format("INSERT INTO Table (A,B) VALUES (%s,%s)",to.results.getString(1),to.results.getString(2)); 
       from.sql.executeQuery("QueryStr"); 
      } 
      to.connection.close() 
      from.connection.close() 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     { finally { 
      if (to.connection != null) 
       try { 
        to.connection.close(); 
        } catch (SQLException x) { 
        } 
      if (from.connection != null) 
       try { 
        from.connection.close(); 
        } catch (SQLException x) { 
        } 

     } 
    } 

    public static class Database { 
    public int id; 
     public String server; 
     public String database; 
     public Connection connection; 
     public ResultSet results; 
     public Statement sql; 

     public Database(int _id, String _server, String _database) { 
      id = _id; 
      server = _server; 
      database = _database; 
      String connectStr = String.format("jdbc:driver://SERVER=%s;port=6322;DATABASE=%s",server,database); 
      connection = DriverManager.getConnection(connectStr); 
      sql = connection.createStatement; 
     } 
    } 
} 

私は、接続は、すぐにデータベースの初期化が行われるように閉じたように、私はto.results = sql.executeQuery("SELECT * FROM TABLE");を呼び出すときに「Connectionオブジェクトがクローズされた」エラーを得続けます。

私が尋ねる理由は、私がマスターデータベースにダンプしているものとほぼ同じである複数のデータベースがあることです。私は、それぞれのfromデータベースを通過し、同じクラスを使用して各toデータベースに挿入するためのループをセットアップするのが良いと思った。これは不可能ですか? Databaseには、これよりも多くのメソッドも含まれます。私はかなりJavaに新しいので、これはうまくいけば、これは意味をなさない...

また、私のコードは、おそらく構文エラーで謎めいているので、それに集中しようとしないでください。

+1

あなたのコードが実際にやっていることを知らず、それは言うことは不可能です。接続をどこで/どのように開いているか、 'sql'とは何か、接続とのやりとりなどの手掛かりはありません。 –

+2

' String.format'を使用してパラメータを渡すことをお勧めします。これはあなたが脆弱である可能性が高い方法ですSQLインジェクション。 'PreparedStatement'を使い、代わりにセッターを介してパラメータを設定してください。 – Bruno

+0

Dave、 'Database to = new Database(...) 'でデータベースを初期化すると接続が行われます。(') 'sql'はデータベース' connection.createStatement'です。 –

答えて

1

Connectionオブジェクトは、接続が閉じていることを意味しないを閉じているが、接続に対する物体が閉じていること(それはStatement又はResultSetすることができます)。

それがトリミングされているので、/再配置されたそれは、あなたの例から見ることは難しいですが、あなたはそのがStatementを対応する再使用した後ResultSetを使用しようとすることができるように見えます。 documentationを参照してください:

デフォルトでは、Statementオブジェクトごとに1つだけのResultSetオブジェクトを同時に 開くことができます。したがって、1つのResultSetオブジェクトの読み取り値が で、別のResultSetオブジェクトの読み取り値とインターリーブされている場合は、異なるStatementオブジェクトによってそれぞれ が生成されている必要があります。 Statementのすべての実行メソッド は、 が存在する場合、Statmentの現在のResultSetオブジェクトを暗黙的に閉じます。

0

この例では、autoCommitがデフォルトでtrueに設定されている可能性があります。これはjava.sql.Connectionクラスでオーバーライドできます。複数のテーブルを更新する場合は、トランザクションフレームワークを使用する方が良いでしょう。

関連する問題