目标:确保所有代码路径都抛出或返回有效连接;我试图不惜一切代价明确避免连接对象返回为“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);
}
}
}
我在这里坚如磐石吗?有没有更好、更简洁/优雅/健壮的方式来确保“连接”永远不会“空”?
编辑:
我添加了一个 jdbcConnection.isValid() 检查,但我忽略了输入验证。我会在实际代码中这样做。