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&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&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&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 |