2

次のコードを使用して、Oracle のデータベースに接続します。

Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
String jdbc_url = "jdbc:oracle:thin:hr/hr@localhost:1521:XE";
String query = "";
try {
   DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
   conn = DriverManager.getConnection(jdbc_url);
   stmt = conn.createStatement();
   query = "select username " + " from users ";
   rset = stmt.executeQuery(query);

   // my codes

} catch (SQLException sqle) {
   System.out.println("result error, " + e.getMessage());
} catch (NumberFormatException nfe) {

} finally {
   try {
      rset.close();
      stmt.close();
      conn.close();

   } catch (Exception e) {
      System.out.println("Error in closing " + e.getMessage());
   }
}

必要なすべてのクエリに対して行うすべてのアクションで、このコードを使用する必要がありますか? 接続を確立して終了しますか? 毎回?

4

3 に答える 3

2

毎回接続する必要はありません。毎回結果セットとステートメントを必ず閉じてください。優れた DB ラッパー クラスの例として、この回答を参照してください。

Connectionコンストラクターで初期化されるクラス変数を作成できます。このようなもの:

public class DbWrapper {
    private Connection conn = null;
    String jdbc_url="jdbc:oracle:thin:hr/hr@localhost:1521:XE";

    public DbWrapper() {
        conn=DriverManager.getConnection(jdbc_url);
    }

    public Arraylist<User> getUsers() {
         ...
    }
}
于 2012-05-26T13:08:17.897 に答える
0

アプリケーションがTomcat、GlassFishなどのサーバーで実行されている場合、最良の方法はJNDIを使用して接続を取得することです。それ以外の場合は、Oracle JDBCドライバーを使用しているため、クラスを使用できますOracleDataSource

オブジェクトを取得するために、シングルトンデザインパターンConnectionを実装できます。簡単な方法は、Java列挙を使用することです。

enum DBEnum {
    ORACLE_XE {
        private DataSource ds = initDataSource();
        private DataSource initDataSource() {
            try {
                OracleDataSource ds = new OracleDataSource();
                ds.setDriverType("thin");
                ds.setServerName("localhost");
                ds.setPortNumber(1521);
                ds.setDatabaseName("XE"); // Oracle SID
                ds.setUser("Herong");
                ds.setPassword("TopSecret");
                return ds;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        @Override
        public Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
    };
    public abstract Connection getConnection() throws SQLException;
}

そしてこれであなたはあなたのコードを変えるでしょう:

Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
String query = "";
try {
   conn = DBEnum.ORACLE_XE.getConnection();
   stmt = conn.createStatement();
   query = "select username " + " from users ";
   rset = stmt.executeQuery(query);

   // my codes

} catch (SQLException sqle) {
   System.out.println("result error, " + e.getMessage());
} catch (NumberFormatException nfe) {

} finally {
   try {
      rset.close();
      stmt.close();
      conn.close();

   } catch (Exception e) {
      System.out.println("Error in closing " + e.getMessage());
   }
}
于 2012-05-26T15:16:20.233 に答える
0

プールされた接続/データソースを使用することをお勧めします。

1 つの DataSource インスタンスは 1 つの作業単位であり、作業単位が終了したら閉じる必要があります (ただし、プールされた接続を使用している場合、db 接続は閉じられないことに注意してください)。

上位レベルの JPA の使用も検討してください。

于 2012-05-26T13:55:37.127 に答える