【问题标题】:c3p0 and Heroku postgres, issues with SSLc3p0 和 Heroku postgres,SSL 问题
【发布时间】: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


【解决方案1】:

代替props.setProperty("ssl", "false");试试:

props.setProperty("sslmode", "disable");

有关更多信息,请参阅 Heroku 在 Connecting to Relational Databases on Heroku with Java 上的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2015-09-22
    • 2020-06-26
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    相关资源
    最近更新 更多