0

目的:すべてのコード パスが有効な接続をスローまたは返すことを確認します。接続オブジェクトが「null」として返されることを明示的に回避しようとしています。

これは私が思いつくことができる最高のものです:

public class JdbcConnectionManager {
  public static class JdbcConnectionFailureException extends Exception {
    private static final String JDBC_CONNECTION_INVALID_MESSAGE =
        "JDBC connection invalid, checked with timeout value of: "
            + JdbcConnectionManager.JDBC_CONNECTION_VALIDATION_TIMEOUT_IN_SECONDS;
    private static final long serialVersionUID = 1L;
    public JdbcConnectionFailureException(String message) {
      super(message);
    }
    public JdbcConnectionFailureException(Throwable throwable) {
      super(throwable);
    }
  }
  private static int JDBC_CONNECTION_VALIDATION_TIMEOUT_IN_SECONDS = 3;
  public static Connection getJdbcConnection(
      JdbcConnectionParameters jdbcConnectionParameters)
      throws JdbcConnectionFailureException {
    try {
      if (jdbcConnectionParameters
          .driverNeedsHelpRegisteringUsingClassForName()) {
        Class.forName(jdbcConnectionParameters
            .getClassForNameDriverRegistrationString());
      }
      Connection jdbcConnection =
          DriverManager.getConnection(jdbcConnectionParameters
              .getJbdcConnectionUrl());
      if (!jdbcConnection
          .isValid(JdbcConnectionManager.JDBC_CONNECTION_VALIDATION_TIMEOUT_IN_SECONDS)) {
        throw new JdbcConnectionManager.JdbcConnectionFailureException(
            JdbcConnectionManager.JdbcConnectionFailureException.JDBC_CONNECTION_INVALID_MESSAGE);
      }
      // TODO: perform further validation on the connection
      return jdbcConnection;
    } catch (ClassNotFoundException classNotFoundException) {
      throw new JdbcConnectionManager.JdbcConnectionFailureException(
          classNotFoundException);
    } catch (SQLException sqlException) {
      throw new JdbcConnectionManager.JdbcConnectionFailureException(
          sqlException);
    }
  }
}

私はここで堅実ですか?「接続」が「null」にならないようにするための、より簡潔でエレガントで堅牢な方法はありますか?

編集:

jdbcConnection.isValid() チェックを追加しましたが、入力検証を省略しました。実際のコードでそれを行います。

4

3 に答える 3

1

は、私にはよく見えますよ。

コードを改善するためにできることがいくつかあります。

まず、常に前提条件を最初に置く必要があります。あなたの場合、メソッドの入力を最初に確認してください。jdbcConnectionParameters

Exception次に、キャッチされた例外はすべて再スローされるため、カスタム例外をキャッチして再スローすることで、すべての例外をキャッチできます。

何かのようなもの:

try {
      if (jdbcConnectionParameters.driverNeedsHelpRegisteringUsingClassForName()) {
        Class.forName(jdbcConnectionParameters.getClassForNameDriverRegistrationString());
      }
      jdbcConnection = DriverManager.getConnection(jdbcConnectionParameters.getJbdcConnectionUrl());
} catch (Exception exception) {
      exception.printStackTrace();
      throw new JdbcConnectionManager.JdbcConnectionFailureException(exception);
}
于 2012-06-09T17:05:12.400 に答える
1

try ブロック内から接続を返すだけの方がはるかに明確です。

public static Connection getJdbcConnection(
              JdbcConnectionParameters jdbcConnectionParameters)
                                     throws JdbcConnectionFailureException {
    try {
        if (jdbcConnectionParameters.driverNeedsHelpRegisteringUsingClassForName()) {
            Class.forName(jdbcConnectionParameters
                                .getClassForNameDriverRegistrationString());
        }
        return DriverManager.getConnection(jdbcConnectionParameters
                   .getJbdcConnectionUrl());
        // TODO: perform further validation on the connection
    } 
    catch (ClassNotFoundException classNotFoundException) {
        throw new JdbcConnectionManager.JdbcConnectionFailureException(
            classNotFoundException);
    } 
    catch (SQLException sqlException) {
        throw new JdbcConnectionManager.JdbcConnectionFailureException(
            sqlException);
    }
}

編集:デッドコードに関する質問に答えるには:

jdbcConnection は、この場所で null にすることはできません。null の場合、行で NPE がスローされるためです。

if (!jdbcConnection.isValid(...))
于 2012-06-09T17:05:27.337 に答える
1

あなたのコードは問題ありませんが、私にとっては少し複雑すぎます:

public static Connection getJdbcConnection(
  JdbcConnectionParameters jdbcConnectionParameters)
  throws JdbcConnectionFailureException {
    try {
      if (jdbcConnectionParameters.driverNeedsHelpRegisteringUsingClassForName()) {
        Class.forName(jdbcConnectionParameters
            .getClassForNameDriverRegistrationString());
      }
      return DriverManager.getConnection(jdbcConnectionParameters.getJbdcConnectionUrl());
    } catch (ClassNotFoundException classNotFoundException) {
      throw new JdbcConnectionManager.JdbcConnectionFailureException(classNotFoundException);
    } catch (SQLException sqlException) {
      throw new JdbcConnectionManager.JdbcConnectionFailureException(sqlException);
    }
}

DataSourceJdbcTemplatefrom 使用も検討してください。printStackTrace()また、その例外を原因として渡して再スローしている場合も、そうしないでください。2 回ログに記録されます。

于 2012-06-09T17:05:29.980 に答える