com.landawn.abacus.util.DataSourceUtil Maven / Gradle / Ivy
Show all versions of abacus-common Show documentation
/*
* Copyright (C) 2023 HaiYang Li
*
* 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 com.landawn.abacus.util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.landawn.abacus.annotation.Internal;
import com.landawn.abacus.exception.UncheckedSQLException;
import com.landawn.abacus.logging.Logger;
import com.landawn.abacus.logging.LoggerFactory;
@Internal
public final class DataSourceUtil {
static final Logger logger = LoggerFactory.getLogger(DataSourceUtil.class);
private static boolean isInSpring = true;
static {
try {
isInSpring = ClassUtil.forClass("org.springframework.datasource.DataSourceUtils") != null;
} catch (Throwable e) {
isInSpring = false;
}
}
private DataSourceUtil() {
// utility class.
}
/**
*
*
* @param conn
* @param ds
*/
public static void releaseConnection(final Connection conn, final javax.sql.DataSource ds) {
if (conn == null) {
return;
}
if (isInSpring && ds != null) { //NOSONAR
try {
org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(conn, ds);
} catch (NoClassDefFoundError e) {
isInSpring = false;
closeQuietly(conn);
}
} else {
closeQuietly(conn);
}
}
/**
*
* @param rs
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void close(final ResultSet rs) throws UncheckedSQLException {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
throw new UncheckedSQLException(e);
}
}
}
/**
*
* @param rs
* @param closeStatement
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void close(final ResultSet rs, final boolean closeStatement) throws UncheckedSQLException {
close(rs, closeStatement, false);
}
/**
*
* @param rs
* @param closeStatement
* @param closeConnection
* @throws IllegalArgumentException if {@code closeStatement = false} while {@code closeConnection = true}.
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void close(final ResultSet rs, final boolean closeStatement, final boolean closeConnection)
throws IllegalArgumentException, UncheckedSQLException {
if (closeConnection && !closeStatement) {
throw new IllegalArgumentException("'closeStatement' can't be false while 'closeConnection' is true");
}
if (rs == null) {
return;
}
Connection conn = null;
Statement stmt = null;
try {
if (closeStatement) {
stmt = rs.getStatement();
}
if (closeConnection && stmt != null) {
conn = stmt.getConnection();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e);
} finally {
close(rs, stmt, conn);
}
}
/**
*
* @param stmt
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void close(final Statement stmt) throws UncheckedSQLException {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
throw new UncheckedSQLException(e);
}
}
}
/**
*
* @param conn
* @throws UncheckedSQLException the unchecked SQL exception
* @deprecated consider using {@link #releaseConnection(Connection, javax.sql.DataSource)}
*/
@Deprecated
public static void close(final Connection conn) throws UncheckedSQLException {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
throw new UncheckedSQLException(e);
}
}
}
/**
*
* @param rs
* @param stmt
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void close(final ResultSet rs, final Statement stmt) throws UncheckedSQLException {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e);
} finally {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e); //NOSONAR
}
}
}
/**
*
* @param stmt
* @param conn
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void close(final Statement stmt, final Connection conn) throws UncheckedSQLException {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e);
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e); //NOSONAR
}
}
}
/**
*
* @param rs
* @param stmt
* @param conn
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void close(final ResultSet rs, final Statement stmt, final Connection conn) throws UncheckedSQLException {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e);
} finally {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e); //NOSONAR
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new UncheckedSQLException(e); //NOSONAR
}
}
}
}
/**
* Unconditionally close an ResultSet
.
*
* Equivalent to {@link ResultSet#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param rs
*/
public static void closeQuietly(final ResultSet rs) {
closeQuietly(rs, null, null);
}
/**
*
* @param rs
* @param closeStatement
* @throws UncheckedSQLException the unchecked SQL exception
*/
public static void closeQuietly(final ResultSet rs, final boolean closeStatement) throws UncheckedSQLException {
closeQuietly(rs, closeStatement, false);
}
/**
*
* @param rs
* @param closeStatement
* @param closeConnection
* @throws IllegalArgumentException if {@code closeStatement = false} while {@code closeConnection = true}.
*/
public static void closeQuietly(final ResultSet rs, final boolean closeStatement, final boolean closeConnection) throws IllegalArgumentException {
if (closeConnection && !closeStatement) {
throw new IllegalArgumentException("'closeStatement' can't be false while 'closeConnection' is true");
}
if (rs == null) {
return;
}
Connection conn = null;
Statement stmt = null;
try {
if (closeStatement) {
stmt = rs.getStatement();
}
if (closeConnection && stmt != null) {
conn = stmt.getConnection();
}
} catch (SQLException e) {
logger.error("Failed to get Statement or Connection by ResultSet", e);
} finally {
closeQuietly(rs, stmt, conn);
}
}
/**
* Unconditionally close an Statement
.
*
* Equivalent to {@link Statement#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param stmt
*/
public static void closeQuietly(final Statement stmt) {
closeQuietly(null, stmt, null);
}
/**
* Unconditionally close an Connection
.
*
* Equivalent to {@link Connection#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param conn
* @deprecated consider using {@link #releaseConnection(Connection, javax.sql.DataSource)}
*/
@Deprecated
public static void closeQuietly(final Connection conn) {
closeQuietly(null, null, conn);
}
/**
* Unconditionally close the ResultSet, Statement
.
*
* Equivalent to {@link ResultSet#close()}, {@link Statement#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param rs
* @param stmt
*/
public static void closeQuietly(final ResultSet rs, final Statement stmt) {
closeQuietly(rs, stmt, null);
}
/**
* Unconditionally close the Statement, Connection
.
*
* Equivalent to {@link Statement#close()}, {@link Connection#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param stmt
* @param conn
*/
public static void closeQuietly(final Statement stmt, final Connection conn) {
closeQuietly(null, stmt, conn);
}
/**
* Unconditionally close the ResultSet, Statement, Connection
.
*
* Equivalent to {@link ResultSet#close()}, {@link Statement#close()}, {@link Connection#close()}, except any exceptions will be ignored.
* This is typically used in finally blocks.
*
* @param rs
* @param stmt
* @param conn
*/
public static void closeQuietly(final ResultSet rs, final Statement stmt, final Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (Exception e) {
logger.error("Failed to close ResultSet", e);
}
}
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
logger.error("Failed to close Statement", e);
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
logger.error("Failed to close Connection", e);
}
}
}
/**
*
*
* @param stmt
* @return
* @throws SQLException
*/
public static int[] executeBatch(final Statement stmt) throws SQLException {
try {
return stmt.executeBatch();
} finally {
try {
stmt.clearBatch();
} catch (SQLException e) {
logger.error("Failed to clear batch parameters after executeBatch", e);
}
}
}
}