Я новичок в вопросах работы с БД с внешней стороны. Написал код на Java, с помощью которого пытаюсь установить соединение с базой на хостинге (в сервлете).
public class Database {
private static String url = "jdbc:postgresql:tdb";
private static Properties props = new Properties();
private static Connection conn;
static {
props.setProperty("user", "postgres");
props.setProperty("password", "123");
props.setProperty("charSet ", "UTF8");
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
initConn();
}
public static boolean initConn() {
try {
if (conn == null || conn.isClosed()) {
conn = DriverManager.getConnection(url, props);
}
} catch (SQLException e) {
return false;
}
return true;
}
public static Connection getConn() throws SQLException {
if (conn == null || conn.isClosed()) //перестраховка
initConn();
return conn;
}
...
//Далее ошибка при вызове:
getConn().createStatement();
...
На моей локальной машине (Windows) такой способ коннекта работает, но на хостинге нет. Там я получаю ошибку:
13-Aug-2018 17:01:11.418 SEVERE [http-nio-80-exec-6] org.postgresql.Driver.connect Connection error:
org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "tdb", SSL off
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:438)
at
....
13-Aug-2018 17:14:26.094 SEVERE [http-nio-80-exec-1] org.postgresql.Driver.connect Connection error:
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgres"
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:438)
at
....
База на хостинге совершенно точно существует, и доступна, но через Putty я подключаюсь к ней иначе, чем на винде:
[root@lfwg ~]# sudo -i -u postgres
-bash-4.2$ psql
postgres=# \c tdb
You are now connected to database "tdb" as user "postgres".
tdb=# select * from responds;
id | resp_ref | username | user_id | battle_count | win_rate | own_rate | cr_date
----+----------+----------+---------+--------------+----------+----------+---------
(0 rows)
Может ли быть проблема в способе подключения?
Получается, что я не указываю пароль для подключения на хосте, а тот пароль что прописан в коде подходит только в базе на локальной машине.
Пароль я сменить побоялся в связи с недостаточным знакомством с Unix, и возможным последствиям в виде проблем работы Postgres.
Пожалуйста, подскажите как можно прописать универсальный способ подключения, чтобы код, разрабатываемый на Windows был работоспособен коду на хосте? Все-таки Java.
==========================================================================
UPD: да, пробовал править pg_hba.conf
в данный момент тут всего 4 строки, и как я понял, доступ к базе максимально открыт на хосте:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
#host all all 127.0.0.1/32 md5
host all all 0.0.0.0/32 md5
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::1/128 md5
========================================================================== UPD#2: Добавил строку в конфиг:
host tdb username 127.0.0.1/32 password
Создал пользователя tester с паролем test
login as: tester
tester@<IP_ADDRES>'s password:
Last login: Tue Aug 14 13:27:29 2018 from ppp91-78-97-34.pppoe.mtu-net.ru
[tester@lfwg ~]$ psql
psql (9.2.23)
Type "help" for help.
tester=# \c tdb
You are now connected to database "tdb" as user "tester".
tdb=#
В java коде изменил строку подключения на следующий вид:
DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/tdb","tester", "test");
В сервер-логе ошибка подключения:
14-Aug-2018 18:11:54.657 SEVERE [http-nio-80-exec-1] org.postgresql.Driver.connect Connection error:
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "tester"
at
org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:438)...
Может еще кто-нибудь что-то подсказать?
Во-первых, не стоит работать с базой из под пользователя postgres. Он для системных нужд и у него слишком много прав. Создайте отдельного пользователя и выдайте ему права на БД. Во-вторых, судя по
no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "tdb"
надо в pg_hba.conf добавить
host tdb username 127.0.0.1/32 password
Для локального подключения у вас в pg_hba.conf - peer, то есть существующие пользователи в системе могут подключаться. Так что хост задавать обязательно при подключении, чтобы попасть на правило:
host all all 0.0.0.0/32 md5
например
psql -U postgres -d tdb -h 127.0.0.1
p.s. Хотя, может быть проще заменить в "pg_hba.conf" параметр "peer" на "md5".
Виртуальный выделенный сервер (VDS) становится отличным выбором
Почему нужно указывать объект? Ведь мы можем вообще не использовать этот объект в блоке
Смотрел JVM, наткнулся на аннотацию @HotSpotIntrinsicCandidate, довольно часто ее стал встречатьЧто она значит? Раньше ее не было
Java документация гласит, что джинерики работают с помощью механизма "стирания", те