|
Spring Framework example source code file (SQLStateSQLExceptionTranslator.java)
The Spring Framework SQLStateSQLExceptionTranslator.java source code/* * Copyright 2002-2008 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.jdbc.support; import java.sql.SQLException; import java.util.HashSet; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.dao.ConcurrencyFailureException; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.util.Assert; /** * {@link SQLExceptionTranslator} implementation that analyzes the SQL state * in the {@link SQLException}. * * <p>Not able to diagnose all problems, but is portable between databases and * does not require special initialization (no database vendor detection, etc.). * For more precise translation, consider {@link SQLErrorCodeSQLExceptionTranslator}. * * @author Rod Johnson * @author Juergen Hoeller * @see java.sql.SQLException#getSQLState() * @see SQLErrorCodeSQLExceptionTranslator */ public class SQLStateSQLExceptionTranslator implements SQLExceptionTranslator { /** * Set of well-known String 2-digit codes that indicate bad SQL. */ private static final Set BAD_SQL_CODES = new HashSet(8); /** * Set of well-known String 2-digit codes that indicate RDBMS integrity violation. */ private static final Set INTEGRITY_VIOLATION_CODES = new HashSet(8); /** * Set of String 2-digit codes that indicate communication errors. */ private static final Set RESOURCE_FAILURE_CODES = new HashSet(4); /** * Set of String 2-digit codes that indicate concurrency errors. */ private static final Set CONCURRENCY_CODES = new HashSet(4); // Populate reference data. static { BAD_SQL_CODES.add("07"); // Dynamic SQL error BAD_SQL_CODES.add("21"); // Cardinality violation BAD_SQL_CODES.add("2A"); // Syntax error direct SQL BAD_SQL_CODES.add("37"); // Syntax error dynamic SQL BAD_SQL_CODES.add("42"); // Syntax error BAD_SQL_CODES.add("65"); // Oracle throws this on unknown identifier BAD_SQL_CODES.add("S0"); // MySQL uses this - from ODBC error codes? INTEGRITY_VIOLATION_CODES.add("01"); // Data truncation INTEGRITY_VIOLATION_CODES.add("22"); // Integrity constraint violation INTEGRITY_VIOLATION_CODES.add("23"); // Integrity constraint violation INTEGRITY_VIOLATION_CODES.add("27"); // Triggered data change violation INTEGRITY_VIOLATION_CODES.add("44"); // With check violation RESOURCE_FAILURE_CODES.add("08"); // Connection exception RESOURCE_FAILURE_CODES.add("53"); // PostgreSQL uses this - insufficient resources (e.g. disk full) RESOURCE_FAILURE_CODES.add("54"); // PostgreSQL uses this - program limit exceeded (e.g. statement too complex) CONCURRENCY_CODES.add("40"); // Transaction rollback CONCURRENCY_CODES.add("61"); // Deadlock } /** Logger available to subclasses */ protected final Log logger = LogFactory.getLog(getClass()); public DataAccessException translate(String task, String sql, SQLException ex) { Assert.notNull(ex, "Cannot translate a null SQLException"); if (task == null) { task = ""; } if (sql == null) { sql = ""; } String sqlState = getSqlState(ex); if (sqlState != null && sqlState.length() >= 2) { String classCode = sqlState.substring(0, 2); if (BAD_SQL_CODES.contains(classCode)) { return new BadSqlGrammarException(task, sql, ex); } else if (INTEGRITY_VIOLATION_CODES.contains(classCode)) { return new DataIntegrityViolationException(buildMessage(task, sql, ex), ex); } else if (RESOURCE_FAILURE_CODES.contains(classCode)) { return new DataAccessResourceFailureException(buildMessage(task, sql, ex), ex); } else if (CONCURRENCY_CODES.contains(classCode)) { return new ConcurrencyFailureException(buildMessage(task, sql, ex), ex); } } // We couldn't identify it more precisely. return new UncategorizedSQLException(task, sql, ex); } /** * Build a message <code>String for the given {@link SQLException}. * <p>Called when creating an instance of a generic * {@link DataAccessException} class. * @param task readable text describing the task being attempted * @param sql the SQL statement that caused the problem. May be <code>null. * @param ex the offending <code>SQLException * @return the message <code>String to use */ protected String buildMessage(String task, String sql, SQLException ex) { return task + "; SQL [" + sql + "]; " + ex.getMessage(); } /** * Gets the SQL state code from the supplied {@link SQLException exception}. * <p>Some JDBC drivers nest the actual exception from a batched update, so we * might need to dig down into the nested exception. * @param ex the exception from which the {@link SQLException#getSQLState() SQL state} * is to be extracted * @return the SQL state code */ private String getSqlState(SQLException ex) { String sqlState = ex.getSQLState(); if (sqlState == null) { SQLException nestedEx = ex.getNextException(); if (nestedEx != null) { sqlState = nestedEx.getSQLState(); } } return sqlState; } } Other Spring Framework examples (source code examples)Here is a short list of links related to this Spring Framework SQLStateSQLExceptionTranslator.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.