如何在不打开java连接的情况下获取连接字符串?

时间:2015-09-11 18:46:31

标签: java jdbc

是否可以在Java中执行此操作?连接字符串中的主机是不可解析的,所以在我能够在连接上调用getMetaData之前,我在DataSource的getConnection()中得到了SQLException。

这是我的代码:

DataSource ds = null;
Connection connection = null;
DataSourceProbeRequest request = null;

try {
  request = (DataSourceProbeRequest) probeRequest;

  ds = request.getDataSource();

  connection = ds.getConnection();
  final boolean validConnection = connection != null && connection.isValid(5000);
  if (validConnection) {
    LOGGER.info("Connection is ok: " + request.getTargetId());
    return new ProbeResult(request.getTargetId(), buildDatasourceMsg(connection, true));
  } else {
    return new ProbeResult(request.getTargetId(), new Exception(buildDatasourceMsg(connection, false)));
  }
} catch (Exception exp) {
  return new ProbeResult(request.getTargetId(), exp);
} finally {
  if (connection != null) {
    try {
      connection.close();
    } catch (SQLException e) {
      LOGGER.warn("Failed to close database connection", e);
    }
  }
}    

由于主机无法访问,connection = ds.getConnection();会抛出异常并导致new ProbeResult(request.getTargetId(), exp)返回。但是,该异常仅包含IO Error: The Network Adapter could not establish the connection之类的错误消息。它没有在连接字符串中给出主机名。我想显示主机名(或连接字符串),以便可以诊断它

1 个答案:

答案 0 :(得分:1)

这是来自Oracle的一个愚蠢的错误消息。网络适​​配器不建立连接。 TCP确实如此。而且,正如你所说,它会压制所有重要的信息。

但是,通过从原始异常中追逐detail链,进一步了解调用堆栈。某处应该有一个ConnectException,上面有你想要的信息。