[RESOLVIDO] Não consigo conectar JDBC e PostgreSQL

Olá a todos,

Sou novo no JDBC e no PostgreSQL, e não estou conseguindo fazer a conexão com um banco de dados PostgreSQL.
Estou usando o NetBeans 5.5, JDK 1.6 e PostgreSQL 7.4.

Primeiro eu crio um usuário ‘emacao’, com senha ‘emacao’, e crio tambem um banco de dados para ele, ‘perfilemacao’.
Depois eu crio uma tabela dentro do banco de dados ‘perfilemacao’. O banco está na mesma máquina de onde estou tentando me conectar.
Mostro aqui o que fiz:

[code]william@apolo:~$ sudo su postgres
Password:
postgres@apolo:/home/william$ psql template1
Bem-vindo ao psql 7.4.19, o terminal iterativo do PostgreSQL.

Digite: \copyright para mostrar termos de distribuição
\h para ajuda com comandos SQL
? para ajuda com comandos internos
\g ou terminar com ponto-e-vírgula para executar a consulta
\q para sair

template1=# \l
Lista dos bancos de dados
Nome | Dono | Codificação
-----------±---------±------------
template0 | postgres | UNICODE
template1 | postgres | UNICODE
(2 registros)

template1=# CREATE USER emacao CREATEDB PASSWORD ‘emacao’;
CREATE USER
template1=# CREATE DATABASE perfilemacao OWNER emacao;
CREATE DATABASE
template1=# GRANT ALL PRIVILEGES ON DATABASE perfilemacao TO emacao;
GRANT
template1=# \l
Lista dos bancos de dados
Nome | Dono | Codificação
--------------±---------±------------
perfilemacao | emacao | UNICODE
template0 | postgres | UNICODE
template1 | postgres | UNICODE
(3 registros)

template1=# \q
postgres@apolo:/home/william/workspace$ cd EmAcao
postgres@apolo:/home/william/workspace/EmAcao$ psql perfilemacao
Bem-vindo ao psql 7.4.19, o terminal iterativo do PostgreSQL.

Digite: \copyright para mostrar termos de distribuição
\h para ajuda com comandos SQL
? para ajuda com comandos internos
\g ou terminar com ponto-e-vírgula para executar a consulta
\q para sair

perfilemacao=# \i create_db_emacao.sql
psql:create_db_emacao.sql:43: NOTA: CREATE TABLE / UNIQUE criará índice implícito “dadospessoais_cpf_key” para tabela “dadospessoais”
CREATE TABLE
perfilemacao=# GRANT ALL PRIVILEGES ON TABLE dadospessoais TO emacao;
GRANT
perfilemacao=# ALTER TABLE dadospessoais OWNER TO emacao;
ALTER TABLE
perfilemacao=# \d
Lista de relações
Esquema | Nome | Tipo | Dono
---------±--------------±-------±-------
public | dadospessoais | tabela | emacao
(1 registro)

perfilemacao=# \q[/code]

E esse é o conteúdo do arquivo ‘create_db_emacao.sql’, que uso para criar a tabela:

[code]–Criando tabela que contém dados pessoais de cada novo cadastro.
CREATE TABLE dadospessoais (

ano		CHAR(4)		NOT NULL,
numinscricao	CHAR(10)	NOT NULL,
nome		CHAR(50) 	NOT NULL,
cpf		CHAR(11) 	UNIQUE NOT NULL, --UNIQUE garante que este dado é unico em toda a tabela
rg		CHAR(9)		NOT NULL,
datanasc	CHAR(10)	NOT NULL,
endereco	CHAR(70)	NOT NULL,	
bairro		CHAR(30)	NOT NULL,
cidade		CHAR(30)	NOT NULL,			
uf		CHAR(2)		NOT NULL,
telres		CHAR(14)	DEFAULT '000000',--VALOR DEFAULT CASO ESTA DADO NÃO EXISTA, SO VALE PARA UM TIPO PADRAO
telcel		CHAR(14)	DEFAULT '000000',
telrec		CHAR(14)	DEFAULT	'000000',	
email		CHAR(50)	DEFAULT 'NÃO CONSTA',
cep		CHAR(10)	NOT NULL,


quest01		INTEGER		NOT NULL,
q01		CHAR(20)	DEFAULT 'NÃO CONSTA',
quest02		INTEGER		NOT NULL,
quest03		INTEGER		NOT NULL,
quest04		INTEGER		NOT NULL,
quest05		INTEGER		NOT NULL,
quest06		INTEGER		NOT NULL,
q06		CHAR(20)	DEFAULT 'NÃO CONSTA',
quest07		INTEGER		NOT NULL,
q07		CHAR(20)	DEFAULT 'NÃO CONSTA',	
quest08		INTEGER		NOT NULL,
quest09		INTEGER		NOT NULL,
quest10		INTEGER		NOT NULL,
quest11		INTEGER		NOT NULL,
quest12		INTEGER		NOT NULL,
quest13		INTEGER		NOT NULL,
quest14		INTEGER		NOT NULL,
quest15		INTEGER		NOT NULL,
q15		CHAR(20)	DEFAULT 'NÃO CONSTA',
quest16		INTEGER		NOT NULL, 
quest17		INTEGER		NOT NULL,
q17		CHAR(20)	DEFAULT 'NÃO CONSTA'

);[/code]

O código que uso para conectar com o banco é o seguinte:

[code]public class Banco_de_Dados {

private String driver;
private String banco;
private String user;
private String passwd;

/** Creates a new instance of Banco_de_Dados */
public Banco_de_Dados() {
    
    this.driver = new String("org.postgresql.Driver");
    this.banco = new String("jdbc:postgresql:perfilemacao");
    this.user = new String("emacao");
    this.passwd = new String("emacao");
    
}

/**
 * Estabelece uma conexao com a base de dados
 * @return conexao com base de dados
 */
public Connection getConexao() {
    
       try {
            Class.forName(this.driver); // load the JDBC driver
            Connection con = DriverManager.getConnection (this.banco, this.user,this.passwd);
             return con;
        }
        catch(ClassNotFoundException e){
                e.printStackTrace();
        }
         catch(SQLException e){
                 e.printStackTrace();
        }
        return null;

}

}[/code]

A princípio, tentei usar o driver do PostgreSQL 8.2, e JDBC 4, disponível em http://jdbc.postgresql.org/download.html, e depois tentei usar vários outros drivers, como o do PostgreSQL 7.4 para JDBC 1, JDBC 2, JDBC 2 EE e JDBC 3, disponíveis no mesmo link, mas, não importa o driver que eu use, todos eles retornam o mesmo erro, dentro do NetBeans:

init: deps-jar: compile: run: org.postgresql.util.PSQLException: Conexão negada. Verifique se o nome da máquina e a porta estão corretos e se o postmaster está aceitando conexões TCP/IP. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:122) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66) at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125) at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30) at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:18) at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24) at org.postgresql.Driver.makeConnection(Driver.java:382) at org.postgresql.Driver.connect(Driver.java:260) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at database.Banco_de_Dados.getConexao(Banco_de_Dados.java:41) at Janela.janela.<init>(janela.java:31) at emacao.Main.main(Main.java:30) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:180) at org.postgresql.core.PGStream.<init>(PGStream.java:59) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:77) ... 12 more EXECUTADO COM SUCESSO (tempo total: 4 segundos)

Percebam que, para o PostgreSQL 8.2, esse procedimento funcionou, pois fiz exatamente assim no computador de um colega que usa o PostgreSQL 8.2. Só que, ao invés de usar o comando:

CREATE USER emacao CREATEDB PASSWORD 'emacao';

para criar o usuário ‘emacao’, eu usei:

CREATE ROLE emacao NOSUPERUSER CREATEDB PASSWORD 'emacao' INHERIT LOGIN;

Acontece, porém, que o PostgreSQL 7.4 não possui esse comando ‘CREATE ROLE’. Imagino que essa opção ‘INHERIT LOGIN’ é o que permite a conexão a partir de um aplicativo cliente, mas isso é só um palpite.

Se alguém tiver uma idéia de como posso me conectar usando o PostgreSQL 7.4, ma ajudaria muito.

Vlw ai e parabéns pelo fórum!!!

Você habilitou o PostgreSQL para aceitar conexões remotas via TCP/IP?
Se não me engano, se você acabou de instalar o PostgreSQL ele só aceita conexões locais via Unix Sockets (que não é a mesma coisa que TCP/IP Sockets). Veja na sua documentação como é que se faz isso.

[quote]Você habilitou o PostgreSQL para aceitar conexões remotas via TCP/IP?
Se não me engano, se você acabou de instalar o PostgreSQL ele só aceita conexões locais via Unix Sockets (que não é a mesma coisa que TCP/IP Sockets). Veja na sua documentação como é que se faz isso. [/quote]

Caro thingol,

Não estou tentando me conectar via TCP/IP.
A conexão é local; a máquina de onde tento me conectar é a mesma onde eu criei o banco.

O driver JDBC requer conexões TCP/IP (o Java não sabe falar Unix Sockets).

Talvez sua string de conexao nao esteja correta tente algo parecido com isso

jdbc.url=jdbc:postgresql://127.0.0.1/seubanco
jdbc.driverName org.postgresql.Driver
jdbc.username=usuario administrador do banco
jdbc.password=senha usuario administrador do banco

Nossa, é verdade!! Não tem como o Java entender Unix Sockets!!! rsss.

thingol, vc tinha razão. Dei uma olhada na documentação do PostgreSQL 7.4, e tudo o que eu tinha que fazer era ir no arquivo ‘/etc/postgresql/7.4/main/postgresql.conf’, e inserir a seguinte linha:

tcpip_socket = true

Dae é só reiniciar o postmaster (o servidor do PostgreSQL), e pronto, conectou certinho, usando o driver do PostgreSQL 8.2 para JDBC 4, mesmo.

Aparentemente, o PostgreSQL 8.2 já funcionou de cara porque essa linha já está inserida no ‘postgresql.conf’ a partir do momento da instalação.

Vlw pela dica, thingol!!!

Uma vez minha esposa teve um problema semelhante (só que com Perl, não com Java). Até descobrir que tinha de habilitar isso na instalação do PostgreSQL teve de procurar um pouquinho no Google.

Só não me lembrava que era em postgresql.conf; é que não tenho um ambiente semelhante aqui para testar.