JAVAアプリケーションからのデータベース接続

株式会社シンメトリック新入社員の青木です。

もうこの研修も終盤に差し掛かってまいりました。進捗としては、オセロとしてはだいぶ良くなってきたものの、ゲームとして勝率によるランキングの処理・表示や過去の対戦を呼び出す機能を要求されており、ここに手を付けられていないので、これからはその部分を重点として仕上げていきます。

今週の目標

今まで複数のブラウザ上でオセロを通信対戦をするために、その場その場での処理をブラウザとサーバーそれぞれのソースに書き下してきました。

しかし、この研修課題の要件の一部である「ゲームのプロセスを記録・表示」「勝率ランキングを出す」といった機能は過去に処理されたデータを参照する必要があります。ということで参照するためには記録することが必要ですので、サーバー内にデータベースを設けてそこに記録し取り出すということになります。

今回はゲームのプロセスを記録する部分、つまり、ブラウザから送信されてきた座標をサーバーサイドのJAVAアプリケーションがデータベースに接続して追加するまでを目標とします。

行ったアプローチ

まず使用するデータベースの種類ですが、特につよい拘りがあるわけでもなく、データベースの種類を適切に選ばなければ劇的に処理速度が変わってしまうようなアプリケーションを作っているわけでもないので、CentOS7にデフォルトで入っているmariaDBを活用することにします。

ゲームのプロセスの表示機能ということで、どのような情報があれば過去の対戦を再現できるかを考え、それに沿ったテーブルをデータベース内に作ります。オセロですので、その対戦固有のID・置いた時のターン数・置いた座標の情報を、一人が石を置いてサーバーが仲介してもう一人に送るついでに毎回記録しておけば、後から対戦固有のIDですべて呼び出して再現することができそうです。

この他にデータベースに追加できうる情報として、対戦者の名前、どちらが白か黒か、どちらが勝ったのかといったものもありますが、これらに関しては別のテーブルを作りそこでそれぞれ記録して、プロセス表示する際にそれを最初に一回だけ呼び出せば十分ですので、対戦プロセスを記録する分には余分な情報だと考えました。

ということでデータベース内にこのようなテーブルを用意しました。

DBTEST

 このようなイメージで、対戦してる最中に順次追加されていくことが求められます。 この数字群はDB内でSQL文を以下のように手動で打ち追加したものです。


insert into テーブル名 value(ROOMID, TURN, X, Y);

つまり実際のプロセス記録機能とは、通信対戦のための仲介機能のついでのタイミングで動作して、対戦固有のID・置いた時のターン数・置いた座標の情報を取得したうえで、それに沿ったSQL文上記のように書き下し、JAVAアプリケーション内から実行させるという機能になります。

JAVAアプリケーションからデータベースに接続しSQL文を実行するためには、まずJDBCドライバを登録する必要がありました。今回使用のデータベースはmariaDBですので、そのドライバはここからダウンロードしました。

About MariaDB Connector/J

このjarファイルをtomcatのlibディレクトリに含めることでアプリケーション内で登録が行えます。

環境をこのようにしたうえでJAVAアプリケーションの一部を以下のように書いてみました。


String url = ~;
String user = ~;
String password = ~;
String driver = ~;
String table = ~;

@OnMessage
public void onMessage(String message) throws IOException {
/*
ブラウザから送信されたmessageからROOMID, TURN, X, Yなどの情報を得る。
*/
/*
websocket通信による仲介の処理
*/
	//JDBCドライバの登録
try {
		Class.forName(driver).newInstance();
} catch (ClassNotFoundException e) {
} catch (Exception e) {
}

Connection conn = null;
try {
		//データベースへの接続
conn = DriverManager.getConnection(url, user, password);

		//SQL文の実行
String sql = "insert into “ + table + “ value( “ + ROOMID + “ , “ + TURN + “ , “ +  X + “ , “ + Y + “)”;
		Statement stmt = conn.createStatement();
		stmt.executeUpdate(sql);
		stmt.close();
} catch (SQLException e) {
} catch (Exception e) {
} finally {
		try {
			if (conn != null) {
				conn.close();
			} else {
			}
		} catch (SQLException e) {
		}
}
}

JAVAアプリケーション内でこのように書けばデータベースのテーブルに追加していくことができるため、ソースコードをこの通りに組み替えて実際にオセロをしながら追加されていくかどうかを確認します。

作業結果

before

↓座標(0,1)に黒を置くと

after

無事入りました。

課題

今回はデータベースに情報を追加していくということをしました。ほぼ同じ手法でデータベースの中を参照することができますが、「ゲームのプロセスを記録・表示」「勝率ランキングを出す」の機能のために取得したものをどのように処理するかを考える必要があります。次回はその部分を作成するつもりです。