seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

postgreSQLのプログラミングI/F (JAVA篇)

jdbcドライバはapt-get install postgresql-jdbcでインストールできた。

$ rpm -q -l postgresql-jdbc
/usr/share/java/pg74.1jdbc1.jar
/usr/share/java/pg74.1jdbc2.jar
/usr/share/java/pg74.1jdbc2ee.jar
/usr/share/java/pg74.1jdbc3.jar

ということから、ここのjdbc2にクラスパスをとおせばよい。
ドライバクラスは「org.postgresql.Driver」とする。
接続urlは「jdbc:postgresql:<>」とする。

import java.util.*;
import java.sql.*;
 
public class TestJava {
 
    public static void main( final String[] argv ) throws Exception {
        Class.forName( "org.postgresql.Driver" );
         
        final Properties prop = new Properties();
        prop.setProperty( "user", "seraphy" );
        prop.setProperty( "password", "********" );
         
        final String url = "jdbc:postgresql:<<DBNAME>>";
        final Connection con = DriverManager.getConnection( url, prop );
        try{
            ....
        }
        finally {
            con.close();
        }
    }
}

で、コンパイルと実行。
ソース上にはorg.postgresql.Driverクラスへの参照はないのでコンパイル時にJDBCクラスパスをとおす必要は無いが、実行時にはクラスパス上にみつからないとClassNotFoundExceptionになる。

javac *.java
java -cp .:/usr/share/java/pg74.1jdbc2.jar TestJava

しかし、これだけではだめだった。
postgresqlの設定をかえないと動作しない。
既定ではtcpipによる接続を許可しないので、jdbcからアクセスできない。
Exception in thread "main" org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
などというエラーとなる。
tcpipで接続できるようにするには、/var/lib/pgsql/data/postgresql.conf を編集し、tcpip_socket=true にする。

これだけではtcpipによるアクセスはできるようになるが、接続許可リストにないので拒否される。
Exception in thread "main" org.postgresql.util.PSQLException: A connection error has occurred: org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "seraphy", database "postgres1", SSL off
接続許可をあたえるには、/var/lib/pgsql/data/pg_hba.conf を編集し、接続許可を追記する。

host all all 127.0.0.1 255.255.255.255 trust

これでローカルホストからのTCP/IP接続が許可される。
あとはpostgresqlを再起動すればjdbcpostgreSQLのデーターベースにアクセスできるようになる。

/etc/rc.d/init.d/postgresql restart