에러 모음

TransientDataAccessResourceException, SQLException

junani0v0 2024. 4. 27. 22:42

< 에러 메시지 >

4월 27, 2024 10:27:04 오후 org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: 경로 [/05]의 컨텍스트 내의 서블릿 [pf]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [INSERT INTO forum.`member` (member_id, passwd, member_nm, email, auth_yn, pwd_chng_dtm, join_dtm) VALUES('?', '?', '', '?', '', '', DATE_FORMAT(NOW() ,'%Y%m%d%H%i%s')) ]; Parameter index out of range (1 > number of parameters, which is 0).; nested exception is java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).]을(를) 발생시켰습니다.

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

 

TransientDataAccessResourceException

  일시적인 문제가 예상되는 데이터 리소스에 맥세스하는 과정에서 발생하는 에러

  • 데이터베이스 연결 문제
  • 데이터베이스 트랜잭션 시간 초과
  • 데드락 (여러 데이터베이스 트랜잭션이 서로의 잠금 해제를 기다리는 상황)
  • 리소스 고갈

 

 

< 원인 >

public int join(HashMap<String, String> params) {
    String sql = "INSERT INTO forum.`member` "
            + "(member_id, passwd, member_nm, email, auth_yn, pwd_chng_dtm, join_dtm) "
            + "VALUES('?', '?', '', '?', '', '', DATE_FORMAT(NOW()  ,'%Y%m%d%H%i%s')) ";

    Object[] args = {params.get("memberId"), params.get("passwd"), params.get("email")};

    return update(sql, args);

Dao에서 SQL 쿼리에서 '?'를 사용하여 변수를 바인딩하려하는데

변수를 문자열에 직접 삽입하여 에러 발생

 

<해결>

public int join(HashMap<String, String> params) {
    String sql = "INSERT INTO forum.`member` "
            + "(member_id, passwd, member_nm, email, auth_yn, pwd_chng_dtm, join_dtm) "
            + "VALUES( ?, ?, '', ?, '', '', DATE_FORMAT(NOW()  ,'%Y%m%d%H%i%s')) ";

    Object[] args = {params.get("memberId"), params.get("passwd"), params.get("email")};

    return update(sql, args);

'?'를 ?로 ' '를 제거하여 쉽게 해결