정수리
309
2019-11-21 16:13:02
2
334

db connection이 끊어지는 원인이 무엇일까요?


session을 이용한 학습을 하고 있는데


처음 웹서버를 재시작한 후 로그인을 했을 때는


정상적으로 되는데


로그아웃 이후 


다시 로그인을 하면 비밀번호를 틀렸다고 하면서 로그인이 되지 않더라구요


그래서 이클립스 콘솔에서 확인해보니


로그인이 실패했을 때

java.sql.SQLException: Connection is null.

이라는 오류가 발생하더라구요...


하지만

서버 재시작->로그인 정상->로그아웃->다시 로그인 시도->비밀번호 틀렸다라는 알림이 발생하면서

이클립스 콘솔에 java.sql.SQLException: Connection is null.


위의 순서로 오류가 발생하고 있습니다.


서버를 재시작하고 로그인을 했을때는 커넥션이 정상적으로 이루어 지는것 같은데


로그아웃이후에는 커넥션이 널값을 가지고 있어버리네요;;



dbConnection.java
package webTest.bean;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;

//DB연결 및 connection 반환
public class dbConnection {
	
	private Connection conn;
	public PreparedStatement pstmt;
	

	public Connection getConn() {
		
		try {
		
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup("java:comp/env");
			DataSource ds = (DataSource)envCtx.lookupLink("jdbc/jsptest");
			this.conn = ds.getConnection();
		}
		catch(Exception e) {
			
			e.printStackTrace();
		}
		return this.conn;
	}
	
	public void disConnection()
	{
		if(this.pstmt !=null)
		{
			try {this.pstmt.close();}catch(SQLException sqle) {}
		}
		
		if(this.conn != null) {
			try {this.conn.close();}catch(SQLException sqle) {}
		}
	}
	
}

LogonDBBean.java
//폼에서 넘어온 데이터를 가지고 검증
package webTest.bean;

import java.sql.Connection;
import java.sql.ResultSet;

import webTest.bean.dbConnection;

public class LogonDBBean {
	
	private static LogonDBBean instance = new LogonDBBean();
	dbConnection db = new dbConnection();
	Connection conn = db.getConn();
	ResultSet rs;
	public static LogonDBBean getInstance() {
			
			return instance;
	}
	
	private LogonDBBean() {}
	
	public int userCheck(String id, String passwd) {
		
		String sql = "select * from jspuser where id = ?";
		int confirmX = 0;
			
		try {
			
			db.pstmt = conn.prepareStatement(sql);
			db.pstmt.setString(1, id);
			
			rs = db.pstmt.executeQuery();
			
			if(rs.next()) {
			
				String Dbpass = rs.getString("password");
				confirmX = 1;
				
			}
			else
			{
				confirmX = 0;
			}
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			db.disConnection();
		}
		
		
		return confirmX;
	}
}

sessionLogoPro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "webTest.bean.LogonDBBean"%>
<% request.setCharacterEncoding("utf-8"); %>
<%
	LogonDBBean bean = LogonDBBean.getInstance();

	String id = request.getParameter("id");
	String pass = request.getParameter("password");
	
	int check = bean.userCheck(id, pass);
	
	if(check == 1) {
		
		session.setAttribute("id", id);
		
		response.sendRedirect("sessionLogin.jsp");
	}
	else
	{
%>
	 <script>
		alert("비밀번호가 맞지 않습니다.");
		//history.go(-1);
	</script> 
<%
	}
%>






0
  • 답변 2

  • 뱀시
    58
    2019-11-21 16:57:39 작성 2019-11-21 17:00:45 수정됨
    public class LogonDBBean {
    	
    	private static LogonDBBean instance = new LogonDBBean();
    	dbConnection db = new dbConnection();
    	Connection conn = db.getConn();
    	ResultSet rs;


    위 부분을 보시면 Connection개체를 전역변수로 선언하셨는데, 그럼 한번 close하면 계속 닫힌 채로 유지됩니다.

    처음 로그인 시도하셨을 땐 Connection이 열린 상태이니 정상적으로 작동하지만, 첫 로그인에서 Connection을 close하니 두번째부터는 실패할 수밖에 없습니다.

    지역변수로 선언하시면 정상적으로 작동할 겁니다.


  • 정수리
    309
    2019-11-21 17:16:07

    @뱀시

    답변 감사합니다.


    덕분에 잘 해결하였습니다.


    말씀하신대로 전역 변수로 되어있던


    커넥션 변수를 지역변수로


    바꾸고 테스트 해보니 잘되네요ㅎㅎㅎ


    제가 새로고침 =  서버 재시작으로 


    인식하고 있어서 저렇게 선언한것 같습니다.


  • 로그인을 하시면 답변 을 등록할 수 있습니다.