我没有很多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.**
答案 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();
}