버그 다루기

사용 가능

눈물과 고통

Java 프로그램을 실행하는 동안 오류가 발생할 수 있습니다. 데이터베이스로 작업할 때 오류가 발생 합니다 . 적절한 솔루션을 예측하고 제공할 수 있는 것이 무엇인지에 관한 것입니다.

다음 줄을 실행할 때 첫 번째 큰 오류 그룹이 기다리고 있습니다.

Connection connection  = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",  "root", "secret");

여기서 무엇을 기대할 수 있습니까?

오류 1. 드라이버를 찾을 수 없습니다 .

"...에 적합한 드라이버를 찾을 수 없습니다." 오류가 발생하면 DriverManager가 URL 뒤에 어떤 유형의 DBMS가 있는지 이해할 수 없음을 의미합니다. 예를 들어 jdbc:mysql 대신 jdbc_mysql:을 작성했습니다.

오류 2. 연결 오류 .

호스트 이름을 잘못 입력하면 "No such host is known" 또는 "Communications link failure"와 같은 메시지가 표시될 가능성이 큽니다.

오류 3. 데이터베이스 이름이 올바르지 않습니다 .

데이터베이스 이름의 철자를 잘못 입력했거나 존재하지 않는 다른 서버에 연결하면 “알 수 없는 데이터베이스 'supershop3'” 과 같은 메시지가 표시됩니다 .

오류 4. 잘못된 로그인 또는 비밀번호 .

데이터베이스 암호를 잊었거나 잘못 입력한 경우 "Access Denied for user 'root'@'localhost' (using password: YES)"와 같은 메시지를 받게 됩니다 .

SQL 예외

그럼에도 불구하고 기지와의 연결이 설정되면 더욱 흥미로울 것입니다. 데이터베이스 작업 시 오류가 발생하는 경우 JDBC에는 특별한 예외인 java.sql.SQLException 이 있습니다 . 뿐만 아니라 여러 종류가 있습니다.

이 예외에는 SQL 서버가 반환한 상태 코드(문자열)를 반환하는 getSQLState() 메서드라는 하나의 추가 메서드(Exception 클래스와 비교하여)만 있습니다. 오류 처리는 다음과 같습니다.

Connection connection  = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",  "root", "secret");
try {
   int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
  // If table doesn't exist
   if (ex.getSQLState().compareTo("X0Y32") != 0) {
  	throw ex;
  }
 } finally {
  connection.close();
 }

수백 개의 오류 코드가 있습니다. 여기에서 전체 목록을 볼 수 있습니다 .

그러나 때때로 오류 코드는 JDBC가 오류를 더 잘 이해하는 데 도움이 되며 SQLException뿐만 아니라 특수 SQLException을 발생시킵니다.

일괄 업데이트 예외 그룹 요청 중 오류
DataTruncation 긴 데이터를 자를 때 자주 발생
SQLClientInfo예외 클라이언트가 연결에서 설정할 수 없는 매개변수를 전달했습니다. 연결
SQLDataException 데이터 오류, 세부 사항은 DBMS 유형에 따라 다름
SQL예외 데이터베이스 액세스 오류 또는 기타 일반 오류
SQLFeatureNotSupportedException DBMS는 이 기능을 지원하지 않습니다.
SQLIntegrityConstraintViolationException SQLState ==22에 대한 모든 오류
SQLInvalidAuthorizationSpecException 액세스 및/또는 인증 오류
SQLNonTransientConnectionException SQLState ==08에 대한 모든 오류
SQL 복구 가능 예외 오류가 있지만 응용 프로그램의 개입으로 수정할 수 있습니다.
SQLSyntaxErrorException 쿼리 구문 오류
SQLTimeoutException 요청이 너무 오래 걸림
SQLTransactionRollbackException 트랜잭션 롤백 중 오류
SQL경고 DBMS에서 발행한 경고

오류 예

서버 응용 프로그램 단계에서 오류가 발생하면 일반적으로 기록만 가능하고 자세한 처리가 가능합니다. 그러나 응용 프로그램이 프로그래머의 컴퓨터에서 실행되는 동안 발생했다면 그 이유를 면밀히 조사해야 합니다.

데이터베이스로 작업할 때 가장 큰 두 종류의 오류가 있습니다.

  • 요청 텍스트 오류
  • ResultSet 작업 중 오류

요청 텍스트의 오류는 매우 자주 발생할 수 있습니다. 쿼리는 매우 길 수 있으며 여러 테이블(JOIN을 통해 조인됨) 및 하위 쿼리(SUBSELECT)를 포함할 수 있습니다. 이러한 요청에서 오류를 찾는 것은 쉽지 않습니다. 또한 요청은 종종 부품에서 함께 붙어 데이터가 추가됩니다.

알아야 할 첫 번째 오류는 SQLSyntaxErrorException 입니다 . 이러한 오류는 일반적으로 요청 본문에 오타가 있음을 의미합니다.

가장 좋아하는 예를 들어 보겠습니다.

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
    int count = results.getInt(1);

그리고 "실수로" 요청 본문에서 별표를 삭제합니다.

ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
    int count = results.getInt(1);

그러면 예외가 발생합니다.

Exception in thread "main" java.sql.SQLSyntaxErrorException:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1

           	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)

SQL 서버는 FROM 이전에 구문 오류가 있었다고 알려줍니다.

우리는 신중하게 요청을 보고 생각합니다. 아무것도 떠오르지 않고 이런 일이 매우 자주 발생하면 누군가에게 무엇이 잘못되었는지 확인하도록 요청해야 합니다.

또 다른 일반적인 실수는 요청의 결과인 ResultSet을 잘못 사용하는 것 입니다. 데이터를 읽기 전에 ResultSet 개체의 "현재 행"이 첫 번째 행 앞에 오는 것을 잊었다고 가정하면 다음 코드가 표시됩니다.

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
//    results.next();
    int count = results.getInt(1);

다음 오류가 발생합니다.


2012 12:55:48 AM jButton5ActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)

오류를 주의 깊게 살펴보고 생각합니다. 그런 다음 Google에서 몇 가지 예를 찾아 솔루션을 이해하려고 합니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다