GroupSession
package jp.groupsession.v2.cmn;import java.io.File;import java.io.IOException;import java.net.ServerSocket;import java.sql.Connection;import java.sql.SQLException;import java.util.Enumeration;import java.util.ResourceBundle;import javax.servlet.ServletException;import jp.co.sjts.util.StringUtil;import jp.co.sjts.util.jdbc.DataSourceModel;import jp.groupsession.v2.cmn.jdbc.GsDataSourceFactory;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.h2.tools.Server;/** * H2DatabaseのServer起動用. * WEB-INF/conf/gsdata.confの[SERVER_ARGS]で起動オプション指定可能. * 注意:初回起動時はEmbedded Modeで行ってから[Gs2Resources.properties]で切替えて下さい. * @author dummy */public class GSH2TcpServer implements IDbUtil {/** ロギングクラス */private static final Log log__ = LogFactory.getLog(GSH2TcpServer.class);/** tcp port */private static final int TCP_PORT__ = 9092;/** db name */private static final String DB_NAME__ = "gs2db";/** 接続文字列オプション */private static String jdbcUrlOption__ = null;/** h2db server 起動インスタンス */private static Server SERVER__ = null;/** h2db 接続文字列 */private static final String dbUrl__ = "jdbc:h2:tcp://localhost:9092/";/** h2db 起動デフォルトパラメーター */private static final String defParam__ = "-tcpAllowOthers -tcp";/** h2db 起動パラメーターキー */private static final String confKey__ = "SERVER_ARGS";static {//H2Database 接続オプションを取得するtry {ResourceBundle rb = ResourceBundle.getBundle("connectOption");Enumeration<String> keys = rb.getKeys();StringBuilder sb = new StringBuilder("");while (keys.hasMoreElements()) {String key = keys.nextElement();String value = rb.getString(key);if (!StringUtil.isNullZeroString(value)) {sb.append(";").append(key).append("=").append(value);}}jdbcUrlOption__ = sb.toString();} catch (Exception e) {log__.info("H2 Database 接続オプションなし.", e);}}
/** * DBサーバ起動. * @param rootPath * @throws Exception */@Overridepublic void startDbServer(String rootPath) throws Exception {try {if (!__isPortUse(TCP_PORT__)) {SERVER__ = new Server();String param = __confValue(confKey__, defParam__).trim() + " -baseDir " + GsDataSourceFactory.getDbDir(rootPath).trim();String[] args = param.trim().split(" ");SERVER__.runTool(args);log__.info("H2 DataBase 起動.");} else {log__.warn("port[9092] is used. H2 DataBase other Thread running ?");}} catch (SQLException e) {log__.debug("H2 DataBase 起動失敗.", e);throw new ServletException("H2 DataBase 起動失敗.", e);}}/** * ポートの使用確認. * @param port * @return */private boolean __isPortUse(int port) {ServerSocket socket = null;boolean result = false;try {socket = new ServerSocket(port);log__.info("port[" + port + "]未使用.");} catch (java.net.BindException e) {log__.info("port[" + port + "]使用中.");result = true;} catch (java.io.IOException e) {log__.error("port使用確認中にエラー発生.", e);} finally {if (socket != null) {try {socket.close();} catch (IOException e) {log__.error("ServerSocket closing error", e);}}}return result;}/** * 設定ファイルから値を取得. * @param key 設定ファイルで指定したキー * @param def 値が無かった場合のデフォルト値 * @return */private String __confValue(String key, String def) {String result = ConfigBundle.getValue(key);if (StringUtil.isNullZeroStringSpace(result)) {return def;} else {return result;}}/** * DBサーバ停止. * @param rootPath * @param con * @throws Exception */@Overridepublic void shutdownDbServer(String rootPath, Connection con)throws Exception {if (SERVER__ != null) {SERVER__.shutdown();} else {log__.warn("H2 DataBase other Thread running ?");}}
/** * DBサーバ再起動. * @param rootPath * @throws SQLException * @throws Exception */@Overridepublic void restartDbServer(String rootPath) throws SQLException, Exception {this.shutdownDbServer(null, null);__sleep(2000);this.startDbServer(rootPath);}/** * DBサーバの初期設定.(Embedded Mode でしている前提.) * @param rootPath * @throws ServletException */@Overridepublic void init(String rootPath) throws ServletException {log__.info("no init");}/** * DB接続文字列 * @param rootPath * @param dsModel * @return */@Overridepublic String createUrl(String rootPath, DataSourceModel dsModel) {return dbUrl__ + GsDataSourceFactory.getDbDir(rootPath) + DB_NAME__ + File.separator + DB_NAME__ + jdbcUrlOption__;}/** * デフォルトエスケープ文字. * @return */@Overridepublic String defaultEscape() {return "\\";}/** * DBの種類. * @return DBの種類(0:H2 Database) */@Overridepublic int getDbType() {return GSConst.DBTYPE_H2DB;}/** * 指定ミリ秒待機. * @param milisec */private static void __sleep(long milisec) {try {Thread.sleep(milisec);} catch (InterruptedException e) {log__.error(milisec + "ミリ秒待機失敗.", e);}}}
数年ぶりに Group session 触ることになってH2DatabaseのServer起動方法探してたら自分のやっつけ処理に辿り着いた…仕方ないので少し真面目に起動用クラスを作ってみたのでメモがわりに記載させてもらいます。上記3つを合わせてGSH2TcpServer.javaとして保存。初回起動時はEmbedded Modeで行ってから[Gs2Resources.properties]で切替えODBC接続は試していないがgsdata.confにSERVER_ARGS=-tcp -tcpAllowOthers -web -webAllowOthers -pg -pgAllowOthersを追記でいけるはず。
接続関連で基本情報と嵌りそうな部分の追記(試してたら嵌った…)portweb接続 8082tcp接続 9092odbc接続 5435database name はフルパスか起動時の base dir からの対象パスlinux だと/usr/local/gsession4.2.3/WEB-INF/db/gs2db/gs2dbwindows だとD:\gsession4.2.3\WEB-INF\db\gs2db\gs2db自動起動だと/WEB-INF/db/ が base dir なので対象パスだとgs2db/gs2dbjdbc:h2:tcp://[server ip]:9092/[database name]netbeans や eclipse 使うなら上記の jdbc 接続。データ操作だけなら odbc 接続で A5M2 を使うのが手っ取り早い。
TOP