Connection Pool


これまで、クライアント(ユーザ)は要求し、要求に応じてサーバ上でデータベースから情報を提供してきた.ただし、サーバとクライアントは一対一の構造ではなく、一対多の構造です.したがって、多くのユーザが同時に要求を発行すると、サーバは過負荷しやすくなります.
これを防ぐために、接続プール(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
    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.java
    package 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.java
    package 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;
    	}
    }