2012年2月9日木曜日

SQLServer2008へのJDBC接続が応答しない

久しぶりにハマったので、書き留めておきます。

プロジェクトでSQL Server2008にJDBCで接続する必要があったのだが、リリース環境で全く応答しなくなるという症状がでた。
ローカル環境での接続やテストは全てうまくいっており、単純にFWの設定かと思いながら対策を始めたのが、事の始まり。
FWをあけても症状が変わらず。tcpdumpやiptablesを使いながらいろいろ試すが解決しない。試しにと思い、PHP+dblibによるテストを行うと正常に接続できる。

うーん。これはドライバまたは接続プロパティだなと思い、あらゆる組み合わせで試してみるがいっこうに解決できない。海外のコミュニティ等もあさるが情報がみつからない。

時間だけがすぎ、途方に暮れていたころ、ようやく以下の記事を発見。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7105007

Java1.6.0_29のSSLの実装にバグがあり、JDBCドライバーにうまく接続できずにハングするとのこと。

解決策として使用するJVMを一つ前のバージョン、1.6.0_27にダウングレードする。


あっさり「解決」




「JVMのバグかよ!」

って、おもわず叫んでた。


2012年1月14日土曜日

JBOSS AS7

JBoss AS7を使う機会があった。
しばらくJBossは使っていなかったのだが、新しいバージョンのJBoosはその売り文句通り驚く程、「軽い」。Javaは構造上、速度的に不利と言われた時代も今は昔。ハードウェアの処理能力の向上とJVMの進化で劇的に進化を遂げた。

JBossのインストールはファイルを展開するだけなので簡単だが、その性質上デーモンとして稼働させることが殆どだろう。
CentOSで稼働させたのだが、含まれるファイルやネットを探してもどこにも起動スクリプトが無い。ネットで要約1つ古いものを見つけたので、それを修正して使った。

以下スクリプト


#!/bin/sh
#
# JBoss standalone control script
#
# chkconfig: - 80 20
# description: JBoss AS Standalone
# processname: standalone
# pidfile: /var/run/jboss-as/jboss-as-standalone.pid
# config: /etc/jboss-as/jboss-as.conf

# Source function library.
. /etc/init.d/functions

# Load Java configuration.
[ -r /etc/java/java.conf ] && . /etc/java/java.conf
export JAVA_HOME

if [ -z "$JBOSS_HOME" ]; then
  JBOSS_HOME=/home/jboss/7.0
fi
export JBOSS_HOME

# Load JBoss AS init.d configuration.
if [ -z "$JBOSS_CONF" ]; then
  JBOSS_CONF="/etc/jboss-as/jboss-as.conf"
fi
[ -r "$JBOSS_CONF" ] && . "${JBOSS_CONF}"

# Set defaults.

if [ -z "$JBOSS_PIDFILE" ]; then
  JBOSS_PIDFILE=/home/jboss/run/standalone.pid
fi
export JBOSS_PIDFILE

if [ -z "$JBOSS_CONSOLE_LOG" ]; then
  JBOSS_CONSOLE_LOG=$JBOSS_HOME/standalone/log/console.log
fi
export JBOSS_CONSOLE_LOG

if [ -z "$JBOSS_USER" ]; then
  JBOSS_USER=jboss
fi

if [ -z "$STARTUP_WAIT" ]; then
  STARTUP_WAIT=30
fi

if [ -z "$SHUTDOWN_WAIT" ]; then
  SHUTDOWN_WAIT=30
fi

if [ -z "$JBOSS_CONFIG" ]; then
  JBOSS_CONFIG=standalone.xml
fi

JBOSS_SCRIPT=$JBOSS_HOME/bin/standalone.sh

prog='jboss-as'

CMD_PREFIX=''

if [ ! -z "$JBOSS_USER" ]; then
  if [ -x /etc/rc.d/init.d/functions ]; then
    CMD_PREFIX="daemon --user $JBOSS_USER"
  else
    CMD_PREFIX="su - $JBOSS_USER -c"
  fi
fi

start() {
  echo -n "Starting $prog: "
  if [ -f $JBOSS_PIDFILE ]; then
    read ppid < $JBOSS_PIDFILE
    if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' ]; then
      echo -n "$prog is already running"
      failure
      echo
      return 1
    else
      rm -f $JBOSS_PIDFILE
    fi
  fi
  mkdir -p $(dirname $JBOSS_CONSOLE_LOG)
  cat /dev/null > $JBOSS_CONSOLE_LOG

  mkdir -p $(dirname $JBOSS_PIDFILE)
  chown $JBOSS_USER $(dirname $JBOSS_PIDFILE) || true
  #$CMD_PREFIX JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT 2>&1 > $JBOSS_CONSOLE_LOG &
  #$CMD_PREFIX JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT &

  if [ ! -z "$JBOSS_USER" ]; then
    if [ -x /etc/rc.d/init.d/functions ]; then
      daemon --user $JBOSS_USER LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT --server-config=$JBOSS_CONFIG 2>&1 > $JBOSS_CONSOLE_LOG &
    else
      su - $JBOSS_USER -c "LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE=$JBOSS_PIDFILE $JBOSS_SCRIPT --server-config=$JBOSS_CONFIG" 2>&1 > $JBOSS_CONSOLE_LOG &
    fi
  fi

  count=0
  launched=false

  until [ $count -gt $STARTUP_WAIT ]
  do
    grep 'JBoss AS.*started in' $JBOSS_CONSOLE_LOG > /dev/null
    if [ $? -eq 0 ] ; then
      launched=true
      break
    fi
    sleep 1
    let count=$count+1;
  done

  success
  echo
  return 0
}

stop() {
  echo -n $"Stopping $prog: "
  count=0;

  if [ -f $JBOSS_PIDFILE ]; then
    read kpid < $JBOSS_PIDFILE
    let kwait=$SHUTDOWN_WAIT

    # Try issuing SIGTERM

    kill -15 $kpid
    until [ `ps --pid $kpid 2> /dev/null | grep -c $kpid 2> /dev/null` -eq '0' ] || [ $count -gt $kwait ]
    do
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      kill -9 $kpid
    fi
  fi
  rm -f $JBOSS_PIDFILE
  success
  echo
}

status() {
  if [ -f $JBOSS_PIDFILE ]; then
    read ppid < $JBOSS_PIDFILE
    if [ `ps --pid $ppid 2> /dev/null | grep -c $ppid 2> /dev/null` -eq '1' ]; then
      echo "$prog is running (pid $ppid)"
      return 0
    fi
  fi
  echo "$prog is not running"
}

case "$1" in
  start)
      start
      ;;
  stop)
      stop
      ;;
  restart)
      $0 stop
      $0 start
      ;;
  status)
      status
      ;;
  *)
      ## If no parameters are given, print which are avaiable.
      echo "Usage: $0 {start|stop|status|restart|reload}"
      exit 1
      ;;
esac