1

Oracle Express Editionデータベースに接続するために次のJavaコードを記述しました。接続、ステートメント、および結果を閉じることについて多くのことを読みましたが、この問題についていくつか質問があります。

1-私は通常コードを数回テストするので、接続を閉じないなどの場合、問題が発生しますか?!!(接続はコード内の同じ変数またはオブジェクトで行われるためです!!!!)

2-現在存在する接続の数をどのように理解できますか?(コードを数回テストした後)

3-新しいTRYCATCHブロックを使用してfinallyブロックにCLOSEメソッドを配置するか、mainメソッドの後にTHROWS SQLExceptionを追加する必要がありますか?!!!! これらと実装の違いは何ですか?!!!

package mainAssignment;

import java.sql.*;
import java.text.MessageFormat;
import java.math.*;
import java.util.*;
//import java.text.MessageFormat;

public class Conn {

/**
 * @param args
 */
public static void main(String[] args)throws SQLException{
    // TODO Auto-generated method stub

    String jdbcURL = "jdbc:oracle:thin:@localhost:1521:xe";
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    String user = "hr";
    String passwd = "hr";
    Scanner input = new Scanner(System.in);
    try {

        Class.forName("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection(jdbcURL, user, passwd);
        System.out.println("ok");
        System.out.println("Please enter the desired employee ID: ");
        Object[] arg={new String(input.nextLine())};
        String query = MessageFormat.format(
            "select * from EMPLOYEES where employee_id={0}", arg);
        //System.out.println(query);
        stmt = conn.createStatement();
        stmt.executeQuery(query);
        rs = stmt.getResultSet();
        while (rs.next()) {
                BigDecimal empid = rs.getBigDecimal(1);
                String firstname = rs.getString("FIRST_NAME");
                System.out.println("employee ID " + empid
                        + "  first name is " + firstname);
            }

    } catch (SQLException e) {
        e.printStackTrace();
        // TODO
    } catch (ClassNotFoundException e) {
        // TODO
        e.printStackTrace();
    } finally {
        conn.close();
        rs.close();
    if (conn.isClosed())
        System.out.println("no connection any more");
    else
        System.out.println("connection exists");
    }
   }
 }
4

2 に答える 2

3

1)実行が終了すると、多くのアイドル(ハング)接続が残ります。これを防ぐには、接続がnullかどうかを確認します。そうである場合-新しいものを確立し、nullでない場合-既存のものを使用します。

2)SQLサーバーで確認できます。ms sql serverの例:ms sqlserver2005で開いている/アクティブな接続の総数を確認する方法

3)finallyブロックにcloseメソッドを入れるのは良い習慣です。それを変えないでください。場合によっては、finallyブロックには、独自の内部try-catch-finallyブロックも必要です。

補足:例外をスローするメソッドを作成する場合、問題は解決されません。それは、あなたのメソッドを使用する人に例外を維持する必要性を押し付けているだけです。良いアプローチである場合もありますが、そうでない場合もあります。

実際のアプリケーションでは、データベースが使用可能であり、接続が確立されており、クエリ結果がnullでないかどうかも確認する必要があります。

付録1:OracleExpressでアクティブな接続の数を確認する方法:

Oracleでアクティブ/オープン接続を一覧表示するにはどうすればよいですか?

http://dbalink.wordpress.com/2008/06/08/find-active-sessions-in-oracle-database/

于 2012-07-12T17:36:09.903 に答える
1

接続プールを使用することをお勧めします。C3P0またはDBCPを見てください。結果セットとステートメントを閉じる必要がありますが、接続でcloseを呼び出すと、プールに返されます。更新:接続プールにHikariを数年間使用しており、非常に満足しています。

于 2012-07-13T16:06:09.463 に答える