2010-12-30 39 views
19

Tôi có một cá thể cục bộ đang chạy của PostgreSql trên một máy linux. Khi tôi sử dụng psql lệnh từ vỏ tôi thành công để đăng nhập mà không có bất kỳ vấn đề. Tôi cần phải kết nối với PostgreSql thông qua JDBC, nhưng tôi không biết chính xác những gì tôi nên vượt qua như tham số url để DriverManager.getConnection().Kết nối với cá thể cục bộ của PostgreSql với JDBC

Bắt đầu bằng jdbc:postgresql: nhưng điều gì sẽ xảy ra tiếp theo?

Tôi được nhóm hệ thống thông báo rằng cơ sở dữ liệu được tạo giống như tên người dùng. ví dụ. nếu người dùng của tôi là jutky một db tên jutky đã được tạo ra, nhưng khi tôi cố gắng để mở một kết nối đến jdbc:postgresql:jutky tôi nhận được một lỗi

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

thông tin bổ sung

Khi tôi đăng nhập qua psql Tôi không được nhắc nhập mật khẩu, vì vậy khi tôi cố gắng đăng nhập qua JDBC, tôi chuyển một chuỗi trống dưới dạng mật khẩu - có đúng không, hoặc tôi có nên nhập null hoặc một cái gì đó không?

Khi tôi gõ psql --help trong vỏ tôi thấy trong phần còn lại dòng này:

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

Vì vậy, tôi hiểu rằng tôi kết nối với PostgreSQL qua một socket directory, không có vấn đề gì đó để chuỗi URL trong JDBC?


EDIT

nhờ đầu tiên cho câu trả lời.

Thứ hai: lần đầu tiên tôi sử dụng JDBC và đặc biệt không phải lần đầu tiên tôi kết nối với PostgreSql từ JDBC, vì vậy tôi biết các quy tắc chung và tôi đã đọc tài liệu. Tuy nhiên trong trường hợp được mô tả tôi không chắc chắn làm thế nào chính xác tôi nên xây dựng chuỗi kết nối nếu trường hợp đang chạy qua socket directory và tôi nên cung cấp mật khẩu nào. Vì khi tôi đăng nhập qua số psql, tôi không được nhắc nhập mật khẩu.

Xin cảm ơn trước.

Trả lời

23

Ngoài câu trả lời khác lưu ý rằng theo mặc định Postgres được cấu hình để chấp nhận kết nối qua ổ cắm Unix với xác thực dựa trên tài khoản hệ điều hành của bạn, đó là lý do tại sao psql hoạt động tốt và không yêu cầu mật khẩu.

Kết nối JDBC được thực hiện qua TCP/IP với xác thực mật khẩu, vì vậy bạn cần sửa đổi pg_hba.conf tương ứng. Ví dụ, dòng này cho phép TCP/IP kết nối từ cùng một máy cho tất cả các cơ sở dữ liệu cho tất cả người dùng với xác thực mật khẩu:

host all   all   127.0.0.1/32   md5 

Sau khi thêm dòng này jdbc:postgresql:databasename nên làm việc.

EDIT: Bạn không thể tạo kết nối JDBC qua ổ cắm Unix vì trình điều khiển JDBC PostgreSQL chỉ có thể hoạt động trên TCP/IP. Mật khẩu bạn sử dụng khi tạo kết nối JDBC là mật khẩu được gán cho người dùng của bạn. Nếu bạn không có nó, bạn có thể gán nó, ví dụ, sử dụng lệnh ALTER USER. Xem 19.3. Authentication methods.

Xem thêm:

+0

Tôi đã yêu cầu nhóm hệ thống kiểm tra vấn đề đó. Cảm ơn vì lời khuyên. – jutky

+1

Ngoài ra hãy chắc chắn rằng listen_address = '*' được kích hoạt trong postgresql.conf. Nếu không, kết nối TCP/IP sẽ không thể thực hiện được (đó là những gì JDBC đang sử dụng, ngay cả với kết nối cục bộ) –

+0

@jutky: Đã cập nhật. – axtavt

8

Tất cả được giải thích trong official documentation.

Đây là phần có liên quan:

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

thấy chỉnh sửa của câu hỏi. – jutky

Các vấn đề liên quan