PSQLException при подключении к серверу Postgres через JDBC в той же локальной сети (работает PGAdmin)

У меня есть серьезные проблемы с подключением из DBVisualizer (8.0.9) к серверу PostgreSQL, который работает в той же локальной сети. DBVis основан на Java, поэтому использует JDBC для соединения. Соединение с PGAdmin работает как чудо - только DBVis соединение через JDBC - нет. И мне нужно это решить!

Specs:
My PC: Ubuntu 12.04 LTS (64Bit), IP: 192.168.110.193
Server OS: Suse LINUX Enterprise Server 11, IP: 192.168.110.12
Postgresql server version: 9.1
Java VM: Java HotSpot(TM) 64-Bit Server VM
Java Version: 1.6.0_33
Java Vendor: Sun Microsystems Inc.
OS Name: Linux
OS Arch: amd64
OS Version: 3.2.0-25-generic 

При установлении соединения я получаю сообщение "Соединение...", и после ~5 минут ожидания в окне соединения появляется следующее сообщение об ошибке:

"An error occurred while establishing the connection:
Long Message:
The connection attempt failed.
Details:
Type: org.postgresql.util.PSQLException
SQL State: 08001"

В консоли отладки я получаю:

12:04:57 [DEBUG pool-2-thread-8 D.ā] RootConnection: Driver.acceptsURL("jdbc:postgresql://192.168.110.12:5432/MYDATABASE")
12:04:57 [DEBUG pool-2-thread-8 D.ā] RootConnection: Driver.connect("jdbc:postgresql://192.168.110.12:5432/MYDATABASE", {user=******, password=******})
12:24:58 [DEBUG pool-2-thread-8 D.ā] RootConnection: EXCEPTION -> org.postgresql.util.PSQLException: The connection attempt failed.

Отладочная информация драйвера JDBC также предоставляется:

org.postgresql.util.PSQLException: The connection attempt failed.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:150)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at com.onseven.dbvis.d.B.D.ā(Z:1548)
at com.onseven.dbvis.d.B.F$A.call(Z:278)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679) 

Для удобства соответствующая часть сервера pg_hba.conf:

#"local" is for Unix domain socket connections only
local all all peer

#IPv4 local connections:
host all all 192.168.110.0/24 md5

#IPv6 local connections:
host all all ::1/128 md5

И соответствующие части postgresql.conf:

# - Connection Settings -

listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost', '*' = all
                                        # (change requires restart)
#port = 5432                            # (change requires restart)
max_connections = 100                   # (change requires restart)
# Note:  Increasing max_connections costs ~400 bytes of shared memory per
# connection slot, plus lock space (see max_locks_per_transaction).
#superuser_reserved_connections = 3     # (change requires restart)
#unix_socket_directory = ''             # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)
#unix_socket_permissions = 0777         # begin with 0 to use octal notation
                                        # (change requires restart)
#bonjour = off                          # advertise server via Bonjour
                                        # (change requires restart)
#bonjour_name = ''                      # defaults to the computer name
                                        # (change requires restart)

# - Security and Authentication -

#authentication_timeout = 1min          # 1s-600s
#ssl = off                              # (change requires restart)
#ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'      # allowed SSL ciphers
                                        # (change requires restart)
#ssl_renegotiation_limit = 512MB        # amount of data between renegotiations
#password_encryption = on
#db_user_namespace = off

# Kerberos and GSSAPI
#krb_server_keyfile = ''
#krb_srvname = 'postgres'               # (Kerberos only)
#krb_caseins_users = off

# - TCP Keepalives -
# see "man 7 tcp" for details

#tcp_keepalives_idle = 0                # TCP_KEEPIDLE, in seconds;
                                        # 0 selects the system default
#tcp_keepalives_interval = 0            # TCP_KEEPINTVL, in seconds;
                                        # 0 selects the system default
#tcp_keepalives_count = 0               # TCP_KEEPCNT;
                                        # 0 selects the system default

2 ответа

Решение

Сейчас соединение установлено, но, к сожалению, я не могу точно сказать, какие шаги привели к решению. Во всяком случае, я постараюсь набросать их:

Я установил старую версию DBVisualizer (7.1.5) и смог успешно установить соединение с сервером БД. Затем я вернулся к версии DBVis 8.0.9 и снова протестировал соединение. Неожиданно здесь также работало соединение, хотя я не менял конфигурации - ни в моей установке DBVis 8.0.9, ни на сервере БД. Вот и все. Может быть, у кого-то есть еще несколько подсказок по этому вопросу.

Код ошибки 08001 - это общий код ошибки, говорящий о том, что драйверу JDBC не удалось подключиться к базе данных. Причин тому могло быть много.

Вы должны ввести IP-адрес или DNS-имя сервера, на котором база данных работает как сервер базы данных, и порт базы данных, который он прослушивает для соединений TCP/IP, по умолчанию 5432.

После того, как вы ввели его, используйте кнопку Ping Server, чтобы узнать, можете ли вы связаться с этим сервером и портом. Если вы получили сообщение об ошибке, вы либо ввели неверные значения сервера базы данных или порта, существует брандмауэр, блокирующий соединение, либо сервер PostgreSQL не настроен для доступа к соединениям с вашего ПК. Если Ping Server сообщает, что все в порядке, но вы по-прежнему не можете подключиться, проблема, скорее всего, связана с учетными данными для входа в указанную вами учетную запись.

Другие вопросы по тегам