//Google AdSense

context.xml
<?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/Jo3Con" 
  	auth="Container" 
  	type="javax.sql.DataSource"
	factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
	driverClassName="com.mysql.jdbc.Driver"
	url="jdbc:mysql://129.128.123.105:3306/3jo?autoReconnect=true&amp;characterEncoding=utf8"
	username="3joid" 
	password="3333" 
	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>

DBConnection.java
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 DBConnection {
	public static Connection getDBConnection () {
		Connection conn = null;
			try {
				Context context = new InitialContext();
				DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/Jo3Con");
				conn = ds.getConnection();
			
			} catch (SQLException e) {
				e.printStackTrace();	
			} catch (NamingException e) {
				e.printStackTrace();
			}
		return conn;
	} 
}
Connection3JoTest.java
package kr.or.ksmart.test;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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 kr.or.ksmart.dbConnection.DBConnection;

@WebServlet("/Connection3JoTest")
public class Connection3JoTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Connection3JoTest() {
        super();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		Connection conn = DBConnection.getDBConnection();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		System.out.println("doget");
		
		try {
			pstmt = conn.prepareStatement("select * from 3jotest where u_id = 'id001'");
			rs = pstmt.executeQuery();
			System.out.println(rs);
			
			if(rs.next()) {
				System.out.println("아이디 : "+rs.getString(1));
				System.out.println("패스워드 : "+rs.getString(2));
				System.out.println("이름 : "+rs.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try{
				if(conn!=null) {conn.close();}
				if(pstmt!=null) {pstmt.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 {
		doGet(request, response);
	}

}

 

 

Connection3JoTest.java 를 run 했을 경우 db 서버에는 연결이 제대로 되지만, 웹 로딩이 하루종일 걸리고 기다리면 결국에는 아래와 같은 에러가 발생했다..

에러로그
java.sql.SQLException: Cannot create PoolableConnectionFactory (Could not create connection to database server. Attempted reconnect 3 times. Giving up.)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Caused by: java.net.ConnectException: Connection timed out: connect
java.lang.NullPointerException at kr.or.ksmart.test.Connection3JoTest.doGet(Connection3JoTest.java:33)

 


context.xml
<?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/Jo3Con" 
  	auth="Container" 
  	type="javax.sql.DataSource"
	factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
	driverClassName="com.mysql.jdbc.Driver"
	url="jdbc:mysql://localhost:3306/3jo?autoReconnect=true&amp;characterEncoding=utf8"
	username="3joid" 
	password="3333" 
	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>

 

url="jdbc:mysql://localhost:3306/3jo?autoReconnect=true&amp;characterEncoding=utf8"

url에 내 ip를 적었던 부분을 localhost로 변경했더니 해결되었다!

 


 

Connection3JoTest.java를 실행한 화면

출력된 로그
정보: Server startup in 4024 ms
603724841, URL=jdbc:mysql://localhost:3306/3jo?autoReconnect=true&characterEncoding=utf8, UserName=3joid@localhost, MySQL Connector Java
doget
org.apache.tomcat.dbcp.dbcp2.DelegatingResultSet@4dbe09d9
아이디 : id001
패스워드 : pw001
이름 : 홍

'JAVA' 카테고리의 다른 글

[JAVA Basic] Exception  (0) 2020.05.20
컨트롤러, 서비스, dao 및 트렌젝션  (0) 2020.05.14
DBCP  (0) 2020.05.14
[JavaBasic] 인터페이스  (0) 2020.04.29

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-INFcontext.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&amp;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' 카테고리의 다른 글

컨트롤러, 서비스, dao 및 트렌젝션  (0) 2020.05.14
DBCP 실습  (0) 2020.05.14
[JavaBasic] 인터페이스  (0) 2020.04.29
[JavaBasic] hashCode / equals / instanceof  (0) 2020.04.29

URL (Uniform Resource Locator)

네트워크상 실제 파일을 호출하는 경로(직접 파일을 호출)

URL은 웹 사이트 주소뿐만 아니라 컴퓨터 네트워크상의 자원을 모두 나타낼 수 있다.

ex) http://localhost/resource/main.jsp

URI (Uniform Resource Identifier) :: 통합 자원 식별자

네트워크상 웹페이지를 호출하기 위한 경로 ( 프로그램상 구분자로 정해진 경로 호출 : 해당 경로의 실제 파일이 없음)

인터넷에 있는 자원을 나타내는 유일한 주소이다.

URI의 하위개념으로 URL, URN 이 있다. 즉 파일을 호출하여 웹페이지 표현도 가능하며 구분자로 지정하여 프로그램으로 만들어진 웹페이지를 호출 가능하다.

ex) http://localhost/memver/view.do

 

'REPORT' 카테고리의 다른 글

깨물이  (0) 2020.02.26
JAVA data type (primitive & reference)  (0) 2020.02.24
절대경로와 상대경로  (0) 2020.02.24

+ Recent posts