001: /*
002: * Copyright (c) JForum Team
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms,
006: * with or without modification, are permitted provided
007: * that the following conditions are met:
008: *
009: * 1) Redistributions of source code must retain the above
010: * copyright notice, this list of conditions and the
011: * following disclaimer.
012: * 2) Redistributions in binary form must reproduce the
013: * above copyright notice, this list of conditions and
014: * the following disclaimer in the documentation and/or
015: * other materials provided with the distribution.
016: * 3) Neither the name of "Rafael Steil" nor
017: * the names of its contributors may be used to endorse
018: * or promote products derived from this software without
019: * specific prior written permission.
020: *
021: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
022: * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
023: * EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
024: * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
025: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR
026: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
027: * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
028: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
029: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES
030: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
031: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
032: * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
033: * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
034: * IN CONTRACT, STRICT LIABILITY, OR TORT
035: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
036: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
037: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
038: *
039: * This file creation date: 25/08/2004 23:03:14
040: * The JForum Project
041: * http://www.jforum.net
042: */
043: package net.jforum;
044:
045: import java.sql.Connection;
046:
047: import net.jforum.util.preferences.ConfigKeys;
048: import net.jforum.util.preferences.SystemGlobals;
049:
050: import org.apache.log4j.Logger;
051:
052: /**
053: * Base class for all database connection implementations that
054: * may be used with JForum.
055: * Default implementations are <code>PooledConnection</code>, which
056: * is the defeault connection pool implementation, and <code>SimpleConnection</code>,
057: * which opens a new connection on every request.
058: *
059: * @author Rafael Steil
060: * @version $Id: DBConnection.java,v 1.14 2006/08/23 02:24:06 rafaelsteil Exp $
061: */
062: public abstract class DBConnection {
063: private static final Logger logger = Logger
064: .getLogger(DBConnection.class);
065: protected boolean isDatabaseUp;
066:
067: private static DBConnection instance;
068:
069: /**
070: * Creates an instance of some <code>DBConnection </code>implementation.
071: *
072: * @return <code>true</code> if the instance was successfully created,
073: * or <code>false</code> if some exception was thrown.
074: */
075: public static boolean createInstance() {
076: try {
077: instance = (DBConnection) Class
078: .forName(
079: SystemGlobals
080: .getValue(ConfigKeys.DATABASE_CONNECTION_IMPLEMENTATION))
081: .newInstance();
082: } catch (Exception e) {
083: logger
084: .warn("Error creating the database connection implementation instance. "
085: + e);
086: e.printStackTrace();
087: return false;
088: }
089:
090: return true;
091: }
092:
093: /**
094: * Gets the current <code>DBConnection</code> implementation's instance
095: *
096: * @return DBConnection
097: */
098: public static DBConnection getImplementation() {
099: return instance;
100: }
101:
102: /**
103: * Checks if database connection is up.
104: *
105: * @return <code>true</code> if a connection to the database
106: * was successfully created, or <code>false</code> if not.
107: */
108: public boolean isDatabaseUp() {
109: return this .isDatabaseUp;
110: }
111:
112: /**
113: * Inits the implementation.
114: * Connection pools may use this method to init the connections from the
115: * database, while non-pooled implementation can provide an empty method
116: * block if no other initialization is necessary.
117: * <br>
118: * Please note that this method will be called just once, at system startup.
119: *
120: * @throws Exception
121: */
122: public abstract void init() throws Exception;
123:
124: /**
125: * Gets a connection.
126: * Connection pools' normal behaviour will be to once connection
127: * from the pool, while non-pooled implementations will want to
128: * go to the database and get the connection in time the method
129: * is called.
130: *
131: * @return Connection
132: */
133: public abstract Connection getConnection();
134:
135: /**
136: * Releases a connection.
137: * Connection pools will want to put the connection back to the pool list,
138: * while non-pooled implementations should call <code>close()</code> directly
139: * in the connection object.
140: *
141: * @param conn The connection to release
142: */
143: public abstract void releaseConnection(Connection conn);
144:
145: /**
146: * Close all open connections.
147: *
148: * @throws Exception
149: */
150: public abstract void realReleaseAllConnections() throws Exception;
151: }
|