ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示
ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示

2011年9月8日木曜日

JBoss+PostgreSQLでコネクションプーリング

JBossとPostgreSQLでコネクションプーリングしてみました。
Javaです。

まずは、JBossのほうに設定。deployディレクトリに設定ファイルであるpostgres-ds.xmlを入れます。
このdsファイルは、docファイルに各種データベース用のサンプルがあるので、例えばMySQLとつなぎたいとかOracleとつなぎたいという場合でも簡単にできます。

postgres-ds.xml

<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql://localhost:5454/test</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>postgres</user-name>
    <password>postgres</password>
    <metadata>
         <type-mapping>PostgreSQL 7.2</type-mapping>
      </metadata>
  </local-tx-datasource>
</datasources>


ではではJavaで実装。
ちょっとクラス分けしてみました。
まずはコネクションを取得するためのクラス。

ConnectionManager.java

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectionManager {
 /**
  * コネクションを取得するメソッド
  * @return Connection
  * @throws SQLException
  * @throws NamingException
  */
 public Connection getConnection() throws SQLException, NamingException {
  InitialContext icx = new InitialContext();
  //postgres-ds.xmlに書いたJNDI名を書く。
  //JBossを起動したときにコンソールに表示されるので、それを書くと尚確実。
  DataSource ds = (DataSource) icx.lookup("java:PostgresDS");
  Connection conn = ds.getConnection();
  return conn;
 }

}


こちらはちゃんと実行できるかどうかのテスト用Servlet。

ConnectionGetSample.java

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ConnectionGetSample extends HttpServlet {

 private static final long serialVersionUID = 1L;

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  // 準備
  ConnectionManager cm = new ConnectionManager();
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;

  // SQL文(ここではテストでpostgresユーザーを出すSQLにしてみる)
  String sql = "select * from pg_user";

  try {
   // コネクション取得。
   // ConnectionManagerクラスでthrowしてるExceptionを
   // こっちでcatchする。
   conn = cm.getConnection();

   // SQL実行
   ps = conn.prepareStatement(sql);
   rs = ps.executeQuery();

   // 結果取得→出力
   while (rs.next()) {
    System.out.println(rs.getString(1));
   }

  } catch (SQLException e) {
   e.printStackTrace();
  } catch (NamingException e) {
   e.printStackTrace();
  } finally {
   // クローズ処理
   if (rs != null) {
    try {
     rs.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   if (ps != null) {
    try {
     ps.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   if (conn != null) {
    try {
     conn.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
  }

 }

}




で、できました。

2011年8月20日土曜日

PostgreSQLでポート番号変更

PostgreSQLを起動しようとして、以下なメッセージが出た場合、ポート番号がかぶってます。


$ pg_ctl start
server starting

$ LOG:  could not bind IPv6 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? 
If not, wait a few seconds and retry.
LOG:  could not bind IPv6 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? 
If not, wait a few seconds and retry.
LOG:  could not bind IPv4 socket: Address already in use
HINT:  Is another postmaster already running on port 5432?
 If not, wait a few seconds and retry.
WARNING:  could not create listen socket for "localhost"
FATAL:  could not create any TCP/IP sockets

何回も言われてるますが、5432が使われてるとか。
PostgreSQLはデフォルトではポート番号5432を使うようになってます。かぶってたら違う番号を使うように設定します。

設定はだいたいpostgresql.confというファイルで行います。
最初、portが指定されているところは#でコメントアウトされてますので、#を外して5432以外の番号を指定してあげるだけでOKです。
ここでは5433にしてみました。


$ cd /Library/PostgreSQL/9.0/data //ディレクトリ移動
$ vi postgresql.conf //以下のように編集




では、起動やってみます。

$ pg_ctl start
server starting


できたー!

PostgreSQLのセットアップその2

先の記事で、軽くいい加減なPostgreSQLのインストールを紹介したので、もうちょっと色々設定してみます。

「ターミナルからサーバー起動&停止ができるようにする」ってことしました。

*ここではHogeユーザーがPostgreSQLの実行ユーザーとしてます。セキュリティの観点からroot権限のユーザーだとPostgreSQlは実行できないようになってるのでお気をつけ。

(1)パスを設定する
環境設定ファイルの.bash_profileファイルを開きます。

//ファイルのあるディレクトリに移動
$ cd ~

//ファイルあるか確認
$ ls -a

.
..
.DS_Store
.RData
~~中略~~
.bash_history
.bash_profile
.bashrc

//ファイルを編集
$ vi .bash_profile

//以下の行を追加して上書き
export PATH=$PATH:/Library/PostgreSQL/9.0/bin
export PG_HOME=/Library/PostgreSQL/9.0
export PGDATA=$PG_HOME/data
export PG_LIB=$PG_HOME/lib

//ファイルを再読み込みして設定を反映させる
$ source .bash_profile


PATHにサーバー起動コマンドが入っているディレクトリ(ここでは/Library/PostgreSQL/9.0/bin)を追加することで、どこからでも起動や停止ができるようしています。

また、サーバーを起動する場合には、データベースに格納するデータなどをどのディレクトリに保存するかを設定してあげる必要があります。
それがPGDATAの環境変数で指定してあげた場所です。もちろんこれも任意の場所です。



(2)PostgreSQLのディレクトリの所有者をHogeさんにしてあげる。
コマンドを実行するためには、そのコマンドが入ったディレクトリをPostgreSQLの管理ユーザーの所有物にしなければ!というわけで、しました(これしないと、Permission deniedとかいって怒られます)
この作業はroot権限のユーザーではないとできないので、一度rootになってから、コマンド実行します。


//rootになる。パスワードを求められるので入力。
$ sudo su - 

//PostgreSQLがはいったディレクトリをHogeさんの所有物にする。
# chown -R Hoge /Library/PostgreSQL/9.0 

# ls -l //確認
total 16
-rw-------   1 Hoge  daemon   230 Aug 20 01:15 .bash_history
drwx------   3 Hoge  daemon   102 Aug 20 01:09 Library
drwxr-xr-x  32 Hoge  daemon  1088 Jun  4 19:08 bin
drwxr-xr-x   7 Hoge  daemon   238 Jun  4 19:07 doc
drwxr-xr-x  29 Hoge  daemon   986 Jun  4 19:08 include
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:07 installer
drwxr-xr-x  32 Hoge  daemon  1088 Jun  4 19:08 lib
drwx------  19 Hoge  daemon   646 Aug 20 01:10 olddata
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:07 pgAdmin3.app
-rwxr-xr-x   1 Hoge  daemon   373 Jun  4 19:09 pg_env.sh
drwxr-xr-x  14 Hoge  daemon   476 Jun  4 19:09 scripts
drwxr-xr-x   5 Hoge  daemon   170 Jun  4 19:07 share
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:07 stackbuilder.app
drwxr-xr-x   3 Hoge  daemon   102 Jun  4 19:09 uninstall-postgresql.app

# exit //元にもどる
logout


厳密にやるなら、パーミッションを700(所有者以外には一切触らせない)とかにすべきなのかもですがローカルで使うだけなので特に設定はしませんでした。


(3)PGDATAフォルダ作成
もともとインストーラーでインストールする時点でこのフォルダは設定してあるのですが、改めて作成します。
私の場合は、現在あるdataフォルダのバックアップをとってから削除をしました。その後、「文字コードUTF8で日本語対応」なデータベースがつくれるような設定をdataフォルダにしてあげました。


//ディレクトリをコピー
$ cp -R /Library/PostgreSQL/9.0/data/ /Library/PostgreSQL/9.0/cdata/ 

//削除
$rm -rf /Library/PostgreSQL/9.0/data/  

$ ls //確認
Library				pgAdmin3.app
bin				pg_env.sh
doc				scripts
include				share
installer			stackbuilder.app
lib				uninstall-postgresql.app
cdata


//initdbというコマンドで、dataディレクトリを作成。
//いろいろ出てくるけど、最後にSuccessって出てくればOK

$ initdb -E UTF8 --no-locale 

creating directory /Library/PostgreSQL/9.0/data ... ok
creating subdirectories ... ok

~中略~
Success. You can now start the database server using:

postgres -D /Library/PostgreSQL/9.0/data
or
pg_ctl -D /Library/PostgreSQL/9.0/data -l logfile start


以上で設定完了です。では、やってみます。

■サーバーの稼働状態を確認します(pg_ctl status)

$ pg_ctl status
pg_ctl: no server running

■サーバー起動(pg_ctl start)

$ pg_ctl start
server starting

■サーバー停止

$ pg_ctl stop
waiting for server to shut down....
LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
done
server stopped

できたー!