JNDI(Java Naming and Directory Interface)
디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API
외부에 있는 객체를 가져오기 위한 기술
DBCP(Database Connection Pool)
데이터베이스와 연결된 커넥션을 미리 만들어서 저장해두고 있다가 필요할 때 저장된 공간(pool)에서 가져다 쓰고 반환(소멸후생성)하는 기법
데이터베이스 연결과 해제 직접 관리
DBCP(컨넥션 풀) 구성
DBCP( 컨넥션 풀 ) 구성
풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다.
커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않다.
커넥션 풀을 사용하면 커넥션을 생성하고 닫는 시간이 소모되지 않기 때문에 그만큼 어플리케이션의 실행 속도가 빨라지며, 또한 한 번에 생성될 수 있는 커넥션 수를 제어하기 때문에 동시 접속자 수가 몰려도 웹 어플리케이션이 쉽게 다운되지 않는다.
DBCP(컨넥션 풀) 환경설정
DBCP 라이브러리 추가
- Tomcat 6.x 이전 버전 commons-dbcp-1.4jar, commons-pool-1.6.jar, commons-collections-3.2.1-bin.zip 3개의 라이브러리 필요
- Tomcat 6.x 이후 버전 tomcat-dbcp.jar (commons-*.jar 통합) (tomcat > lib 의 tomcat-dbcp.jar 존재)
DB Driver 라이브러리 추가
- DB 버전 확인하고 이에 맞는 라이브러리 추가
Context 내에 Resource 추가 방법
- Server.xml 이나 context.xml 의 context 내에 resource 추가
- 프로젝트내의 META-INF에 context.xml 생성 후 context 내에 resource 추가
- Web.xml 에 resource-ref 추가 (tomcat 버전 별 차이 있음)
context.xml
> Context 내에 Resource 추가
<?xml version="1.0" encoding="UTF-8"?>
<context>
<!--
Resource를 등록하여 웹에서 JNDI로 호출할 이름과 정보를 설정.
각 db의 Driver jar 필요
mariadb : org.mariadb.jdbc.Driver // jdbc:mariadb
mysql : org.gjt.mm.mysql.Driver // jdbc:mysql
-->
<Resource
name="jdbc/myCon"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ksmart35db?autoReconnect=true&characterEncoding=utf-8"
username="root"
password="java0000"
maxActive="100"
maxIdle="30"
maxWait="10000"
removeAbandoned="true"
removeAbandonedTimeout="60"/>
<!--
1. name : JNDI로 호출될 이름을 설정
2. auth : DBCP를 관리할 관리자 (Container or Application) -
3. type : 해당 resource의 return type -
4. factory : dbcp를 유용하는 관리 클래스 -
5. driverClassName : JDBC를 이용하기 위한 드라이버 클래스
6. url : DB의 접속 URL
7. username : DB의 계정 명
8. password : 계정에 대한 비밀번호
9. maxActive : 최대 접속 허용 개수
10. maxIdle : DB Pool에 여분으로 남겨질 최대 Connection 개수
11. maxWait : DB 연결이 반환되는 Timeout의 최대 시간 (-1은 무한 대기)
12. removeAbandoned : Connection이 잘못 관리되어 버려진 연결을 찾아 재활용할 것인지의 여부 설정
13. removeAbandonedTimeout : 버려진 연결로 인식할 기본 시간 설정
(초 단위로 해당 시간이 지나면 버려진 연결로 인식한다.)
-->
</context>
MyConnection.java
>db 연결
package kr.or.ksmart.dbConnection;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class MyConnection {
public static Connection getConnection() {
Connection con = null;
try{
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/myCon");
con = ds.getConnection();
}catch(SQLException e){
e.printStackTrace();
}catch(NamingException e){
e.printStackTrace();
}
return con;
}
}
ConnectionTest.java
>connection test
package kr.or.ksmart;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletConfig;
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 javax.sql.DataSource;
import kr.or.ksmart.dbConnection.MyConnection;
/**
* Servlet implementation class ConnectionTest
*/
@WebServlet("/ConnectionTest")
public class ConnectionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ConnectionTest() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection con = MyConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = con.prepareStatement("SELECT u.u_name FROM user AS u WHERE u.u_id = 'id001'");
rs = ps.executeQuery();
if(rs.next()) {
System.out.println(rs.getString("u_name"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try{
if(con!=null) {con.close();}
if(ps!=null) {ps.close();}
if(rs!=null) {rs.close();}
}catch (SQLException e) {
e.printStackTrace();
}
}
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
ConnectionTest.java 실행
화면
console log
...
정보: Server startup in 3883 ms
홍01
'JAVA' 카테고리의 다른 글
[JAVA Basic] Exception (0) | 2020.05.20 |
---|---|
DBCP 실습 (0) | 2020.05.14 |
[JavaBasic] 인터페이스 (0) | 2020.04.29 |
[JavaBasic] hashCode / equals / instanceof (0) | 2020.04.29 |