WildFly Postgres DataSource远程连接 - 网址被忽略

时间:2017-07-08 09:29:37

标签: postgresql wildfly keycloak

我遇到了在独立群集模式下设置Keycloak服务器的一些配置问题。尽管将数据源配置为在{REMOTE_IP}上使用postgres数据库,但是无法启动服务器抱怨它无法连接到localhost:5432

我一直都在搜索,但是我很困惑为什么当connection-url设置为远程主机时,DataSource会尝试连接到localhost。

我的配置有错吗?我怎样才能弄清楚为什么PG试图连接到localhost而不是{REMOTE_IP}

我的设置是1个Postgres数据库服务器和2个Keycloak服务器

我遵循了使用关系数据库的安装说明,并为Postgres添加了JDBC驱动程序v9.4.1212。​​

我的DataSource配置如下:

<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:postgresql://{REMOTE_IP}:5432/keycloak</connection-url>
    <driver>postgresql</driver>
    <pool>
        <max-pool-size>20</max-pool-size>
    </pool>
    <security>
        <user-name>keycloak</user-name>
        <password>{PASSWORD}</password>
    </security>
</datasource>

日志中的错误消息显示为:

...
Caused by: org.postgresql.util.PSQLException: Connection to localhost:5432 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:262)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:52)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:216)
    at org.postgresql.Driver.makeConnection(Driver.java:404)
    at org.postgresql.Driver.connect(Driver.java:272)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:86)
    at org.postgresql.ds.PGPoolingDataSource.getConnection(PGPoolingDataSource.java:309)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:312)
    ... 43 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    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.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.postgresql.core.PGStream.<init>(PGStream.java:61)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
    ... 52 more

我已经确认我可以使用psql连接到postgres

# psql -h {REMOTE_IP} keycloak keycloak
psql (9.5.7)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, 
bits: 256, compression: off)
Type "help" for help.

keycloak=>

2 个答案:

答案 0 :(得分:8)

我设法解决了这个问题。 postgres的JDBC驱动程序配置为使用PGPoolingDataSource并定义了datasource-class

<driver name="postgresql" module="org.postgresql">
    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
    <datasource-class>org.postgresql.ds.PGPoolingDataSource</datasource-class>
</driver>

定义datasource-class后,必须通过connection-property而不是connection-url传递连接网址。我更新了配置,服务器启动正常。

<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:postgresql://{REMOTE_IP}:5432/keycloak</connection-url>
    <connection-property name="url">jdbc:postgresql://{REMOTE_IP}:5432/keycloak</connection-property>
    <driver>postgresql</driver>
    <pool>
        <max-pool-size>20</max-pool-size>
    </pool>
    <driver-class>org.postgresql.Driver</driver-class>
    <security>
        <user-name>keycloak</user-name>
        <password>{PASSWORD}</password>
    </security>
</datasource>

此问题在wildfly问题跟踪器中注明 https://issues.jboss.org/browse/WFLY-6157

答案 1 :(得分:0)

a) 以下是wildfly 18.0.1.Final的standalone.xml的快照

 <datasources>
                    <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
                        <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                        <driver>h2</driver>
                        <security>
                            <user-name>sa</user-name>
                            <password>sa</password>
                        </security>
                    </datasource>
                    <datasource jndi-name="java:jboss/jdbc/myapp-ds" pool-name="myapp-ds" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
                        <connection-url>jdbc:postgresql://mydatabase.mycompany.com:5445/customerdb</connection-url>
                        <connection-property name="url">
                            jdbc:postgresql://mydatabase.mycompany.com:5445/customerdb
                        </connection-property>
                        <driver>postgresql</driver>
                        <pool>
                            <max-pool-size>20</max-pool-size>
                        </pool>
                        <security>
                            <user-name>postgres</user-name>
                            <password>password123$</password>
                        </security>
                    </datasource>
                    <drivers>
                        <driver name="h2" module="com.h2database.h2">
                            <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                        </driver>
                        <driver name="postgresql" module="org.postgresql">
                            <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                            <datasource-class>org.postgresql.ds.PGPoolingDataSource</datasource-class>
                        </driver>
                    </drivers>
                </datasources>

b) 还要确保在路径 wildfly-18.0.1.Final\modules\org\postgresql\main 中添加以下文件(如果文件夹不存在则创建):

  1. module.xml:

  2. postgresql-42.2.22.jar(从网上下载jar文件)

模块.xml:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.postgresql">
 <resources>
 <resource-root path="postgresql-42.2.22.jar"/>
 </resources>
 <dependencies>
 <module name="javax.api"/>
 <module name="javax.transaction.api"/>
 </dependencies>
</module>