DataSourceを使ったMySQLのWeb出力
|
今回は、DataSourceの機能を使ったデータベースへのアクセスを行うことで運用に耐えられるシステムを考えていきたいと思います。 |
前回データベースの内容をWeb出力したときは、Javaのソースコードの中でデータベースへの接続を行って出力したのですが、この方法にはいくつかの問題があります。
ますデータベースに関する情報をJavaのソースに記述しているため、データベースの変更などを行うと、コンパイルし直す必要があるので移植性が悪いし、データベースに接続するのは処理に時間がかかるため、接続数が増えると運用に支障をきたす場合があります。
DataSourceを利用すると、コネクションプールを利用し接続にかかる負荷を軽減することが出来るようになります。コネクションプールはあらかじめデータベースと接続をしておき、必要なときに接続されている、コネクションを利用すると言う機能で、大幅にレスポンスの向上が望めるようです。
TomcatにはDataSourceの機能があり、あらかじめ設定をしておくことで利用できるようになっています。
データベースとの接続に必要な情報はあらかじめTomcatに登録しておくことで、Javaでのコーディングを少なくし、データベースの変更などがあってもコンパイルしなくても済むので移植性も高くなります。
|
実際にTomcatにDataSourceの設定を追加していきたいと思います。
まず、Tomcatを起動し、Administration Toolを起動します。
Tomcatの画面の「Tomcat Administration」をクリックすると、管理画面へのログイン画面が表示されるので、ログインします。 |
管理画面がでたら、プロジェクトのDataSourceに設定を追加します。
今回は、testプロジェクトに追加します。
「Tomcat Server」−「Service」−「Host」−「Context (test)」−「Resource」−「DataSource」が今回登録する場所になります。
登録する内容は以下のとおりです。
プロパティ |
値 |
JNDI名 |
jdbc/MySQL
|
データソースURL |
jdbc:mysql://localhost/ltss?
useUnicode=true&characterEncoding=SJIS |
JDBCドライバクラス |
com.mysql.jdbc.Driver |
ユーザー名 |
mysql |
パスワード |
mysql |
ここで登録しておくことで、Javaでのコーディングが必要なくなります。 |
|
DataSourceの設定が出来たら、実際にDataSourceを使ってWebに出力してみたいと思います。
前回作ったデータベース「ltss」の「teacher_table」に私のデータを1件登録しておいたので、今回はこのデータを呼び出してみたいと思います。
package te;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import javax.naming.*;
import java.sql.*;
import javax.sql.*;
public class HelloWorldDSServlet extends HttpServlet {
DataSource ds;
// 初期化処理
public void init() throws ServletException {
try {
// 初期コンテキストを取得
InitialContext ic = new InitialContext();
// ルックアップしてデータソースを取得
ds = (DataSource)ic.lookup("java:comp/env/jdbc/MySQL");
} catch (Exception e) {
e.printStackTrace();
}
}
//HTTP GET リクエスト処理
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
Connection con = null;
Statement stmt = null;
try {
// データソースからConnectionを取得
con = ds.getConnection();
// Statementを取得
stmt = con.createStatement();
// 検索するSQL文を作成
String sql = "SELECT * FROM teacher_table";
// クエリーを実行して結果セットを取得
ResultSet rs = stmt.executeQuery(sql);
// 表示
response.setContentType("text/html; charset=Shift_JIS");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>データソースでDB接続</title>");
out.println("</head>");
out.println("<body>");
out.println("<table border=\"1\">");
out.println("<tr>");
out.println("<th>NO</th>");
out.println("<th>ID</th>");
out.println("<th>氏名</th>");
out.println("</tr>");
// 検索された行数分ループ
while(rs.next()){
out.println("<tr>");
out.println("<td>" + rs.getInt("id") + "</td>");
out.println("<td>" + rs.getString("user_id") + "</td>");
out.println("<td>" + rs.getString("name") + "</td>");
out.println("</tr>");
}
out.println("</table>");
out.println("</body>");
out.println("</html>");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt!=null) {
stmt.close();
}
if (con!=null) {
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
|
|
上記のソースを実行したのがこちらです。
特に実行結果に違いはありませんが、規模が大きなシステムでは必須の機能で、Javaのコーディングも楽になり、DataSourceを使うことが推奨されているそうなので、Webシステムを作る場合には、覚えておいた方が良いようです。 |
データベースの登録 UP ログイン処理その1 |
  |