2010-12-30 4 views
19

У меня есть работающий локальный экземпляр PostgreSql на Linux-машине. Когда я использую команду psql из командной строки, мне удалось войти в систему без каких-либо проблем. Мне нужно подключиться к PostgreSql через JDBC, но я не знаю, что именно следует передать как url параметр DriverManager.getConnection().Подключение к локальному экземпляру PostgreSql с JDBC

Следует начинать с jdbc:postgresql:, но что будет дальше?

Системная группа сообщила, что база данных была создана как имя пользователя. например если мой пользователь jutky БД с именем jutky был создан, но когда я пытаюсь открыть соединение с jdbc:postgresql:jutky я получаю сообщение об ошибке

org.postgresql.util.PSQLException: FATAL: password authentication failed for user "jutky" :(

Дополнительная информация

Когда я Войти с помощью psql Мне не предложено ввести пароль, поэтому, когда я пытаюсь войти в систему через JDBC, я передаю пустую строку в качестве пароля - это правильно, или я должен пройти null или что-то в этом роде

Когда я типа psql --help в оболочке я вижу среди остальных эту строку:

Connection options: 
    -h, --host=HOSTNAME  database server host or socket directory (default: "/var/run/postgresql") 

Так что я понимаю, что я подключаюсь к PostgreSql через socket directory, делает это имеет значение то, в строку URL в JDBC?


EDIT

Первого спасибо за ответы.

Во-вторых: это не первый раз. Я использую JDBC и, в частности, не в первый раз, когда я подключаюсь к PostgreSql от JDBC, поэтому я знаю общие правила, и я прочитал документацию. Однако в описанном случае я не уверен, как именно я должен построить строку соединения, если экземпляр работает через socket directory и какой пароль я должен предоставить. Потому что, когда я вхожу в систему через psql, я не запрашиваю пароль вообще.

Заранее спасибо.

ответ

23

В дополнении к другим ответам отметить, что по умолчанию Postgres настроен на прием подключений через Unix сокеты с аутентификацией на основе вашей учетной записи операционной системы, поэтому psql работает отлично и не требует пароля.

Соединения JDBC осуществляются через TCP/IP с аутентификацией пароля, поэтому вам необходимо соответствующим образом изменить pg_hba.conf. Например, эта линия позволяет TCP/IP соединения с одной и той же машины для всех баз данных для всех пользователей с парольной аутентификацией:

host all   all   127.0.0.1/32   md5 

После добавления этой строки jdbc:postgresql:databasename должен работать.

EDIT: Вы не можете создать соединение JDBC через сокет Unix, поскольку драйвер PostgreSQL JDBC может работать только через TCP/IP. Пароль, который вы используете при создании соединения JDBC, - это пароль, назначенный вашему пользователю. Если у вас его нет, вы можете назначить его, например, с помощью команды ALTER USER. См. 19.3. Authentication methods.

Смотрите также:

+0

Я попросил системную группу проверить эту проблему. Спасибо за совет. – jutky

+1

Также убедитесь, что в postgresql.conf включен параметр listen_address = '*'. В противном случае соединение TCP/IP вообще невозможно (что и используется JDBC, даже при локальном подключении) –

+0

@jutky: Обновлено. – axtavt

8

Все объяснено в official documentation.

Это соответствующая часть:

String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true"; 
Connection conn = DriverManager.getConnection(url); 
+0

см редактирования вопроса. – jutky

Смежные вопросы