フォーラム

GroupSession

フォーラム
GroupSessionについての自由な情報交換の場としてご利用ください

GroupSessionフォーラム:投稿一覧

 
フォーラム:03_プラグイン開発フォーラム
H2DatabaseのServer起動用クラス
[ 5641 ] H2DatabaseのServer起動用クラス

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);
}
}

投稿者dummy
最新書き込み2013/10/29 12:05:34
[ 5642 ] Re: H2DatabaseのServer起動用クラス

/**
* DBサーバ起動.
* @param rootPath
* @throws Exception
*/
@Override
public 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
*/
@Override
public void shutdownDbServer(String rootPath, Connection con)
throws Exception {
if (SERVER__ != null) {
SERVER__.shutdown();
} else {
log__.warn("H2 DataBase other Thread running ?");
}
}

投稿者dummy
最新書き込み2013/10/29 12:06:10
[ 5643 ] Re: H2DatabaseのServer起動用クラス

/**
* DBサーバ再起動.
* @param rootPath
* @throws SQLException
* @throws Exception
*/
@Override
public void restartDbServer(String rootPath)
throws SQLException, Exception {
this.shutdownDbServer(null, null);
__sleep(2000);
this.startDbServer(rootPath);
}

/**
* DBサーバの初期設定.(Embedded Mode でしている前提.)
* @param rootPath
* @throws ServletException
*/
@Override
public void init(String rootPath) throws ServletException {
log__.info("no init");
}

/**
* DB接続文字列
* @param rootPath
* @param dsModel
* @return
*/
@Override
public String createUrl(String rootPath, DataSourceModel dsModel) {
return dbUrl__ + GsDataSourceFactory.getDbDir(rootPath)
+ DB_NAME__ + File.separator + DB_NAME__ + jdbcUrlOption__;
}

/**
* デフォルトエスケープ文字.
* @return
*/
@Override
public String defaultEscape() {
return "\\";
}

/**
* DBの種類.
* @return DBの種類(0:H2 Database)
*/
@Override
public 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);
}
}
}

投稿者dummy
最新書き込み2013/10/29 12:06:42
[ 5644 ] Re: H2DatabaseのServer起動用クラス

数年ぶりに Group session 触ることになって
H2DatabaseのServer起動方法探してたら自分のやっつけ処理に辿り着いた…
仕方ないので少し真面目に起動用クラスを作ってみたのでメモがわりに記載させてもらいます。

上記3つを合わせてGSH2TcpServer.javaとして保存。
初回起動時はEmbedded Modeで行ってから[Gs2Resources.properties]で切替え
ODBC接続は試していないが
gsdata.confに
SERVER_ARGS=-tcp -tcpAllowOthers -web -webAllowOthers -pg -pgAllowOthers
を追記でいけるはず。

投稿者dummy
最新書き込み2013/10/29 12:23:25
[ 5646 ] Re: H2DatabaseのServer起動用クラス

接続関連で基本情報と嵌りそうな部分の追記(試してたら嵌った…)
port
web接続 8082
tcp接続 9092
odbc接続 5435

database name はフルパスか起動時の base dir からの対象パス

linux だと/usr/local/gsession4.2.3/WEB-INF/db/gs2db/gs2db
windows だとD:\gsession4.2.3\WEB-INF\db\gs2db\gs2db

自動起動だと/WEB-INF/db/ が base dir なので対象パスだと
gs2db/gs2db

jdbc:h2:tcp://[server ip]:9092/[database name]
netbeans や eclipse 使うなら上記の jdbc 接続。
データ操作だけなら odbc 接続で A5M2 を使うのが手っ取り早い。

投稿者dummy
最新書き込み2013/10/29 17:28:47
スレッドURLhttps://groupsession.jp/wbs/bulletin/bbs080.do?bbs010forumSid=3&threadSid=1917
 


TOP