JDBC 6章 DataSourceからConnectionを取得する
- 6.1. server.xmlへの設定
- 6.2. web.xmlへの設定
- 6.3. DataSourceの利用
6.3. DataSourceの利用
DataSourceを利用するには、JNDIというAPIを使用します。JNDIはNaming ServiceやDirectory Serviceなど、ツリー構造の情報に統一的にアクセスするためのAPIです。DataSourceを利用する上において、詳細な知識は不要ですので詳しい説明は省略します。以下はDataSourceを使用し、Connectionを取得しているサーブレットの例です。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.PrintWriter;
import java.io.IOException;
public class DataSourceServlet extends HttpServlet{
private DataSource dataSource=null;
public void init() throws ServletException{
try{
Context context=new InitialContext();
dataSource=(DataSource)context.lookup("java:comp/env/jdbc/datasource");
}catch(NamingException e){
throw new ServletException(e);
}
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html; charset=SJIS");
PrintWriter writer=response.getWriter();
writer.println("<html><body><ul>");
Connection conn=null;
try{
conn=dataSource.getConnection();
PreparedStatement statement
=conn.prepareStatement("select name from meibo");
ResultSet result=statement.executeQuery();
while(result.next()){
writer.println("<li>"+result.getString(1)+"</li>");
}
}catch(SQLException e){
e.printStackTrace(writer);
}finally{
try{
if(conn!=null) conn.close();
}catch(SQLException e){}
}
writer.println("</ul></body></html>");
}
}
まずDataSourceをTomcatから検索します。例ではサーブレットの初期化時(initメソッド内)で行っています。これはJNDIを使用して、javax.naming.Contextを作成してlookupメソッドを呼ぶことで可能です。lookupメソッドの定義は以下の通りです。
Object lookup(String name) throws javax.naming.NamingException
引数にはDataSourceが登録されている名前を指定します。その際の名前は、
java:comp/env/(server.xmlで指定した名前)
にして下さい。ここでは「jdbc/datasource」という名前で登録しましたので、「java:comp/env/jdbc/datasource」という名前を指定します。lookupメソッドの返り値はDataSourceですので、キャストして使用します。
DataSourceからはgetConnectionメソッドでjava.sql.Connectionを取得できます。DriverManagerと異なり、引数に値を指定する必要はありません。必要な情報はserver.xmlで指定しているためです。
(実習課題1)
サンプルのサーブレットを実行させなさい。また「product」テーブルにデータを追加する機能を、Webアプリケーションに追加しなさい。

