Connection Pool
25494 ワード
これまで、クライアント(ユーザ)は要求し、要求に応じてサーバ上でデータベースから情報を提供してきた.ただし、サーバとクライアントは一対一の構造ではなく、一対多の構造です.したがって、多くのユーザが同時に要求を発行すると、サーバは過負荷しやすくなります.
これを防ぐために、接続プール(Connection Pool)を作成します.必要に応じてコネクタを作成するのではなく、サーバが空いているときにコネクタを事前に作成します.
接続プールは、ユーザー要求時に予め接続プールで作成された接続をユーザーに渡し、応答を受信したときに返すように構成されます.
このコネクタプールは、ネットワークコンテナの「トム」カードに作成できます.そのためWeb.xmlファイルを変更すると、接続プールを作成できます.
dbの情報(driver、url、id、pw)をxmlに予め設定すると、接続がより速くなります. type:接続プールにはオブジェクトの接続も必要です.
この場合、typeとして指定した値が関連オブジェクトになります. maxActive="4":合計接続数を表します.4つの接続がすべてレンタルされている場合は、追加の接続を作成してレンタルすることができます.
ただし、設定したmax Wait時間内に待機していてもコネクタを返却できない場合は、もう1つ生成して貸してあげます.
1)コンテキストオブジェクトを使用してxmlファイルをインポートし、dbドライバをロードします.
2)dbドライバとservletは、データソースオブジェクトを介して接続できます.
現在の業界ではよく使われており、コード実装の面では非常に簡単なので、知っておくといいでしょう.
以前のコンテンツDAOとDTOのコードを実装接続プールに変換します.
前の説明で見た写真以外は、修正されていない部分があります.
StudentServlet.java
これを防ぐために、接続プール(Connection Pool)を作成します.必要に応じてコネクタを作成するのではなく、サーバが空いているときにコネクタを事前に作成します.
接続プールは、ユーザー要求時に予め接続プールで作成された接続をユーザーに渡し、応答を受信したときに返すように構成されます.
接続プールの設定
このコネクタプールは、ネットワークコンテナの「トム」カードに作成できます.そのためWeb.xmlファイルを変更すると、接続プールを作成できます.
この場合、typeとして指定した値が関連オブジェクトになります.
ただし、設定したmax Wait時間内に待機していてもコネクタを返却できない場合は、もう1つ生成して貸してあげます.
接続プールの実装
1)コンテキストオブジェクトを使用してxmlファイルをインポートし、dbドライバをロードします.
2)dbドライバとservletは、データソースオブジェクトを介して接続できます.
現在の業界ではよく使われており、コード実装の面では非常に簡単なので、知っておくといいでしょう.
コード実装
以前のコンテンツDAOとDTOのコードを実装接続プールに変換します.
前の説明で見た写真以外は、修正されていない部分があります.
StudentServlet.java
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.servlet.dao.StudentDAO;
import com.servlet.dto.StudentDTO;
@WebServlet("/StudentServlet")
public class StudentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
StudentDAO studentDAO = new StudentDAO();
ArrayList<StudentDTO> list= studentDAO.select();
for (int i = 0; i<list.size(); i++) {
StudentDTO dto = list.get(i);
int id = dto.getId();
String name = dto.getName();
String email = dto.getEmail();
out.print("id:" + id + "<br>");
out.print("name:" + name + "<br>");
out.print("email: " + email + "<br>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
StudentDAO.javapackage com.servlet.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import com.servlet.dto.StudentDTO;
public class StudentDAO {
//고친 부분
DataSource dataSource;
public StudentDAO() {
try {
// 고친 부분 : 1. 드라이버 로딩
Context context = new InitialContext();
dataSource = (DataSource)context.lookup("java:comp/env/jdbc/Oracle19c");
} catch(Exception e) {
e.printStackTrace();
}
}
public ArrayList<StudentDTO> select(){
ArrayList<StudentDTO> list = new ArrayList<StudentDTO>();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet res = null;
try {
//고친 부분 : 2. DB - Servlet 연결
con = dataSource.getConnection();
String sql = "SELECT * FROM students";
pstmt = con.prepareStatement(sql);
res = pstmt.executeQuery();
while(res.next()) {
int s_id = res.getInt("ID");
String s_name = res.getString("NAME");
String s_email = res.getString("EMAIL");
StudentDTO studentDTO = new StudentDTO(s_id,s_name,s_email);
list.add(studentDTO);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if(res != null) res.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return list;
}
}
StudentDTO.javapackage com.servlet.dto;
public class StudentDTO {
int id;
String name;
String email;
public StudentDTO(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
Reference
この問題について(Connection Pool), 我々は、より多くの情報をここで見つけました https://velog.io/@turtle601/Connection-Poolテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol