| package org.apache.ddlutils.util; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| */ |
| |
| import java.sql.Connection; |
| import java.sql.SQLException; |
| import java.sql.Statement; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| |
| import javax.sql.DataSource; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.ddlutils.DatabaseOperationException; |
| |
| /** |
| * JdbcSupport is an abstract base class for objects which need to |
| * perform JDBC operations. It contains a number of useful methods |
| * for implementation inheritence.. |
| * |
| * @version $Revision$ |
| */ |
| public abstract class JdbcSupport |
| { |
| /** The Log to which logging calls will be made. */ |
| private final Log _log = LogFactory.getLog(JdbcSupport.class); |
| /** The data source. */ |
| private DataSource _dataSource; |
| /** The username for accessing the database. */ |
| private String _username; |
| /** The password for accessing the database. */ |
| private String _password; |
| /** The names of the currently borrowed connections (for debugging). */ |
| private HashSet _openConnectionNames = new HashSet(); |
| |
| // Properties |
| //------------------------------------------------------------------------- |
| |
| /** |
| * Returns the data source used for communicating with the database. |
| * |
| * @return The data source |
| */ |
| public DataSource getDataSource() |
| { |
| return _dataSource; |
| } |
| |
| /** |
| * Sets the DataSource used for communicating with the database. |
| * |
| * @param dataSource The data source |
| */ |
| public void setDataSource(DataSource dataSource) |
| { |
| _dataSource = dataSource; |
| } |
| |
| |
| /** |
| * Returns the username used to access the database. |
| * |
| * @return The username |
| */ |
| public String getUsername() |
| { |
| return _username; |
| } |
| |
| /** |
| * Sets the username to be used to access the database. |
| * |
| * @param username The username |
| */ |
| public void setUsername(String username) |
| { |
| _username = username; |
| } |
| |
| /** |
| * Returns the password used to access the database. |
| * |
| * @return The password |
| */ |
| public String getPassword() |
| { |
| return _password; |
| } |
| |
| /** |
| * Sets the password to be used to access the database. |
| * |
| * @param password The password |
| */ |
| public void setPassword(String password) |
| { |
| _password = password; |
| } |
| |
| // Implementation methods |
| //------------------------------------------------------------------------- |
| |
| /** |
| * Returns a (new) JDBC connection from the data source. |
| * |
| * @return The connection |
| */ |
| public Connection borrowConnection() throws DatabaseOperationException |
| { |
| try |
| { |
| Connection connection = null; |
| |
| if (_username == null) |
| { |
| connection = getDataSource().getConnection(); |
| } |
| else |
| { |
| connection = getDataSource().getConnection(_username, _password); |
| } |
| if (_log.isDebugEnabled()) |
| { |
| String connName = connection.toString(); |
| |
| _log.debug("Borrowed connection "+connName+" from data source"); |
| _openConnectionNames.add(connName); |
| } |
| return connection; |
| } |
| catch (SQLException ex) |
| { |
| throw new DatabaseOperationException("Could not get a connection from the datasource", ex); |
| } |
| } |
| |
| /** |
| * Closes the given JDBC connection (returns it back to the pool if the datasource is poolable). |
| * |
| * @param connection The connection |
| */ |
| public void returnConnection(Connection connection) |
| { |
| try |
| { |
| if ((connection != null) && !connection.isClosed()) |
| { |
| if (_log.isDebugEnabled()) |
| { |
| String connName = connection.toString(); |
| |
| _openConnectionNames.remove(connName); |
| |
| StringBuffer logMsg = new StringBuffer(); |
| |
| logMsg.append("Returning connection "); |
| logMsg.append(connName); |
| logMsg.append(" to data source.\nRemaining connections:"); |
| if (_openConnectionNames.isEmpty()) |
| { |
| logMsg.append(" None"); |
| } |
| else |
| { |
| for (Iterator it = _openConnectionNames.iterator(); it.hasNext();) |
| { |
| logMsg.append("\n "); |
| logMsg.append(it.next().toString()); |
| } |
| } |
| _log.debug(logMsg.toString()); |
| } |
| connection.close(); |
| } |
| } |
| catch (Exception e) |
| { |
| _log.warn("Caught exception while returning connection to pool", e); |
| } |
| } |
| |
| /** |
| * Closes the given statement (which also closes all result sets for this statement) and the |
| * connection it belongs to. |
| * |
| * @param statement The statement |
| */ |
| public void closeStatement(Statement statement) |
| { |
| if (statement != null) |
| { |
| try |
| { |
| statement.close(); |
| } |
| catch (Exception e) |
| { |
| _log.debug("Ignoring exception that occurred while closing statement", e); |
| } |
| } |
| } |
| } |