【发布时间】:2019-08-15 05:17:40
【问题描述】:
更新
无法连接到 postgres 数据库。 postgres的依赖是通过maven添加的。
Maven 依赖项
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
Postgres 池
public class PostgresDB implements DBPool {
public PostgresDB() {
}
private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
static {
try {
Properties props = new Properties();
props.setProperty("ssl", "false");
comboPooledDataSource.setDriverClass( "org.postgresql.Driver" );
comboPooledDataSource.setJdbcUrl("jdbc:postgresql://ec2-79-125-4-72.eu-west-1.compute.amazonaws.com:5432/d35hi5u7rnue7f");
comboPooledDataSource.setUser("user");
comboPooledDataSource.setPassword("xxxxxxxx");
comboPooledDataSource.setProperties(props);
} catch (Exception e) {
System.out.println("Error");
// handle the exception
}
}
public Connection getConnection() throws SQLException {
return comboPooledDataSource.getConnection();
}
}
获取连接的代码
Connection connection = PostgresDB.getConnection();
错误
警告:com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@2326357e -- 获取尝试失败!!!清除挂起的获取。在尝试获取所需的新资源时,我们未能成功超过允许的最大获取尝试次数 (30)。上次获取尝试异常:org.postgresql.util.PSQLException:Der Verbindungsversuch schlug fehl。在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:152) 在 org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66) 在 org.postgresql.jdbc2.AbstractJdbc2Connection.(AbstractJdbc2Connection.java: 125) 在org.postgresql.jdbc3.AbstractJdbc3Connection.(AbstractJdbc3Connection.java:30) 在org.postgresql.jdbc3g.AbstractJdbc3gConnection.(AbstractJdbc3gConnection.java:22) 在org.postgresql.jdbc4.AbstractJdbc4Connection.(AbstractJdbc4Connection.java:32)在 org.postgresql.jdbc4.Jdbc4Connection.(Jdbc4Connection.java:24) 在 org.postgresql.Driver.makeConnection(Driver.java:393) 在 org.postgresql.Driver.connect(Driver.java:267) 在 com.mchange .v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:119) 在 com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:143) 在 com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataS我们.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32) at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810) at com.mchange.v2.async.ThreadPoolAsynchronousRunner$ PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 原因:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在 java.base/ 中找到请求目标的有效证书路径在 java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321) 在 java.base/sun.security.ssl.TransportContext 的 sun.security.ssl.Alert.createSSLException(Alert.java:128)。 java.base/sun.security.ssl.TransportCo 的致命(TransportContext.java:264) ntext.fatal(TransportContext.java:259) 在 java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:642) 在 java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate( CertificateMessage.java:461) 在 java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:361) 在 java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)在 java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) 在 java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421) 在 java.base/sun.security .ssl.TransportContext.dispatch(TransportContext.java:178) 在 java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164) 在 java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl .java:1152) 在 java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063) 在 java.base/sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:402) 在 java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(SSLSocketImpl.java:716) 在 java.base/sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:970) ) 在 java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81) 在 java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142) 在 org.postgresql.core.PGStream.flush( PGStream.java:523) 在 org.postgresql.core.v3.ConnectionFactoryImpl.sendStartupPacket(ConnectionFactoryImpl.java:259) 在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:105) ... 16 更多 原因:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在 java.base/sun.security.validator.PKIXValidator.doBuild( PKIXValidator.java:385) 在 java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:290) 在 java.base/sun.security.validator.Validator.validate(Validator.java:264) 在 java .base/sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:321) 在 java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:221) 在 java.base/sun.security.ssl .X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129) 在 java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:626) ... 33 更多 原因:sun.security.provider.certpath.SunCertPathBuilderException:无法在 java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 在 java.base/ 中找到请求目标的有效证书路径sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 在 java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) 在 java.base/sun.security.validator。 PKIXValidator.doBuild(PKIXValidator.java:380) ... 39 更多
修复
如果你有同样的问题,把代码改成这样:
comboPooledDataSource.setJdbcUrl("jdbc:postgresql://url:port/database");
Properties props = new Properties();
props.setProperty("sslmode", "require");
props.setProperty("ssl", "true");
props.setProperty("sslfactory", "org.postgresql.ssl.NonValidatingFactory");
props.setProperty("user", "username");
props.setProperty("password", "xxxxxxx");
comboPooledDataSource.setProperties(props);
【问题讨论】:
-
取消注释 "comboPooledDataSource.setDriverClass( "org.postgresql.Driver" );" 会发生什么?
-
@NotaJD 没有改变任何东西,我仍然得到同样的错误。
-
仍然收到带有消息“没有合适的驱动程序”的 SQLException?诡异的。如果你 Class.forName("org.postgresql.Driver") 会发生什么?会扔吗?
-
@NotaJD 我的错。网址中的拼写错误。我写的是 postgres 而不是 postgresql。现在我收到一个新错误。
标签: java database ssl heroku c3p0