捕获Java SQLExceptions

时间:2017-07-07 18:16:30

标签: java jdbc

我没有很多Java经验,如果你对这个问题有所启发,我将不胜感激。

我有以下代码(方法)来建立与PostgreSQL数据库的JDBC连接:

public void establishDBConnection() throws SQLException {

    try (Connection connection = DriverManager.getConnection(
                "jdbc:postgresql://" + dbServer + ":" + dbPort + "/" + 
                dbDatabase, dbUser, dbPassword))
    catch (SQLException e) {
        logger.error("Connection to Postgres Database Failed: " + 
        e.printStackTrace();
    }
 }

我希望只要方法无法与数据库建立连接(服务器关闭),catch块就会捕获SQLException。 catch块将异常置于控制台上但我看到在getConnection方法执行之后立即显示相同的异常。因此,我在控制台上有两个完全相同的例外。见下文。

问题是这是什么原因以及如何强制应用程序仅显示catch块生成的异常。

日志:

Jul 07, 2017 9:11:53 PM org.postgresql.Driver connect
SEVERE: Connection error: 
**org.postgresql.util.PSQLException: Connection to localhost:5433 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.**
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:265)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194)
    at org.postgresql.Driver.makeConnection(Driver.java:431)
    at org.postgresql.Driver.connect(Driver.java:247)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at excel2db.service.impl.DBConnectionPostgresImpl.establishDBConnection(DBConnectionPostgresImpl.java:38)
    at excel2db.excel2db.main(excel2db.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.postgresql.core.PGStream.<init>(PGStream.java:62)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
    ... 13 more

21:11:53.465 [main] ERROR e.s.impl.DBConnectionPostgresImpl - **Connection to Postgres Database Failed: Connection to localhost:5433 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.**

2 个答案:

答案 0 :(得分:3)

您的示例中只打印了一个异常:捕获了SQLException。您认为第二个例外仅是(如文本所示)SQLException的原因:Postgres抛出一个SQLException,它本身被抛出,因为当Portgres尝试连接时存在网络ConnectException。

当您需要诊断故障时,这一系列异常非常方便。它允许返回问题的原始低级别来源。就像,例如,知道您没有收到邮件(NoMailException)因为邮局处于罢工(OnStrikeException),因为政府决定降低工资(WagesTooLowException),这很有用。如果您刚刚拥有原始的NoMailException,您将无法知道您没有邮件的原因,知道它可能是暂时的,等等。

在这种特殊情况下,您可以推断出无法连接到服务器,例如,密码不正确。

链接异常只需通过调用另一个异常构造函数来实现,这些异常构造函数将另一个异常作为参数(大多数异常都可以)。请参阅https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html#Exception-java.lang.String-java.lang.Throwable-

答案 1 :(得分:0)

您需要将驱动程序的类加载到内存中。试试这段代码:

尝试{

Class.forName("org.postgresql.Driver");

Connection connection = DriverManager.getConnection(jdbc:postgresql://server_address:5432/database_name?user=usernam&password=password);

} catch(异常异常){

exception.printStackTrace();

}