Openshift Tomcat 7 墨盒拒绝 Postgres 连接

Postgres connection refused from Openshift Tomcat 7 cartridge

我正在尝试在 Openshift Tomcat 7 (JBoss EWS 2.0) 卡带上部署应用程序,但我得到:

org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

这是我的数据源配置:

public class OpenshiftDataConfig {
    @Inject private Environment environment;
    @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setDataSourceClassName("org.postgresql.ds.PGSimpleDataSource");
        dataSource.setJdbcUrl(String.format("jdbc:%s/%s",
                environment.getProperty("OPENSHIFT_POSTGRESQL_DB_URL"), 
                "dev"));
        dataSource.setUsername(environment.getProperty("OPENSHIFT_POSTGRESQL_DB_USERNAME"));
        dataSource.setPassword(environment.getProperty("OPENSHIFT_POSTGRESQL_DB_PASSWORD"));
        return dataSource;
    }
}

我在测试期间记录了 JDBC URL,我已经尝试使用 username/password 嵌入:

jdbc:postgresql://<value of OPENSHIFT_POSTGRESQL_DB_USERNAME>:<value of OPENSHIFT_POSTGRESQL_DB_PASSWORD>@<value of OPENSHIFT_POSTGRESQL_DB_HOST>:<value of OPENSHIFT_POSTGRESQL_DB_PORT>/dev

和没有(使用略有不同的代码构建):

jdbc:postgresql://<value of OPENSHIFT_POSTGRESQL_DB_HOST>:<value of OPENSHIFT_POSTGRESQL_DB_PORT>/dev

我在登录应用程序时使用 psql 测试了连接性:

psql -h $OPENSHIFT_POSTGRESQL_DB_HOST -p $OPENSHIFT_POSTGRESQL_DB_PORT -U $OPENSHIFT_POSTGRESQL_DB_USERNAME

而且我可以看到我的数据在那里。我还验证了管理员用户是登录角色。 pg_hba.conf 文件应该允许连接:

# Allow all users to connect over the network with valid credentials
host    all         all           0.0.0.0/0             md5
host    all         all           ::/0                  md5

这似乎是两个卡式盒之间 Openshift 防火墙配置的问题,所以我也在联系他们的官方支持。

大部分答案都在 Openshift knowledge base 中:数据源提供给 Java 墨盒,就像它们的 Tomcat 7 (JBoss EWS 2.0)。它没有在文章中指定,但它似乎已经使用 Apache DBCP 进行了池化,因此设置很简单:

@Bean
public DataSource dataSource() throws NamingException {
    DataSource datasource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/PostgreSQLDS");
    return datasource;
}

我通过确保托管数据库的应用程序 可扩展.

解决了这个问题

阅读 OpenShift 文档时很容易忽略这一点:https://blog.openshift.com/sharing-database-across-applications/

这个网站也帮助我确定并解决了这个问题:http://www.hfaber.com/post/135256827109/openshift-sharing-database-across-applications

可扩展的应用程序至少需要 2 个齿轮,并且在创建应用程序时需要指定可扩展的,方法是在 rhc app create 命令中使用 -s 选项。

您可以在使用创建命令时使用 --from-app 参数克隆现有的不可扩展应用程序:https://access.redhat.com/documentation/en-US/OpenShift_Online/2.0/html/User_Guide/Cloning_an_Existing_Application.html