added javadoc comments to some database classes

This commit is contained in:
Eric J. Bowersox 2001-11-15 08:30:13 +00:00
parent ef629c8e48
commit 33eecf87fc
2 changed files with 173 additions and 29 deletions

View File

@ -7,7 +7,7 @@
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
* language governing rights and limitations under the License. * language governing rights and limitations under the License.
* *
* The Original Code is the Venice Web Community System. * The Original Code is the Venice Web Communities System.
* *
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>, * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
@ -24,6 +24,16 @@ import org.w3c.dom.*;
import com.silverwrist.util.DOMElementHelper; import com.silverwrist.util.DOMElementHelper;
import com.silverwrist.venice.core.ConfigException; import com.silverwrist.venice.core.ConfigException;
/**
* A simple pooling system for JDBC connections, which allows connections to be kept in a pool until
* they're needed, avoiding the overhead of opening and closing connections for each transaction, or
* keeping one database connection open for each user.<P>
* Based on some code from Marty Hall's <EM>Core Servlets and Java Server Pages</EM> (Prentice Hall/
* Sun Microsystems, 2000).
*
* @author Eric J. Bowersox &lt;erbo@silcom.com&gt;
* @version X
*/
public class DataPool implements Runnable public class DataPool implements Runnable
{ {
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
@ -31,7 +41,7 @@ public class DataPool implements Runnable
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
private static Category logger = Category.getInstance(DataPool.class.getName()); private static Category logger = Category.getInstance(DataPool.class);
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Attributes * Attributes
@ -53,6 +63,13 @@ public class DataPool implements Runnable
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
/**
* Creates and configures a new database pool, based on a section from the Venice configuration file.
*
* @param cfg The &lt;database/&gt; section of the configuration file.
* @exception com.silverwrist.venice.core.ConfigException The configuration is not correct in some way.
* @exception java.sql.SQLException If the initial connections could not be created.
*/
public DataPool(Element cfg) throws ConfigException, SQLException public DataPool(Element cfg) throws ConfigException, SQLException
{ {
// Make sure they passed the <database/> section to us. // Make sure they passed the <database/> section to us.
@ -194,16 +211,14 @@ public class DataPool implements Runnable
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
/**
* Called by the garbage collector on an object when garbage collection determines that there are no
* more references to the object.
*/
protected void finalize() protected void finalize()
{ {
closeConnections(avail_connections); closeConnections(avail_connections);
avail_connections = null;
closeConnections(busy_connections); closeConnections(busy_connections);
busy_connections = null;
driver = null;
url = null;
username = null;
password = null;
} // end finalize } // end finalize
@ -212,6 +227,12 @@ public class DataPool implements Runnable
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
/**
* Creates and returns a new database connection.
*
* @return The new database connection object.
* @exception java.sql.SQLException An error prevented the creation of the connection.
*/
private Connection makeNewConnection() throws SQLException private Connection makeNewConnection() throws SQLException
{ {
try try
@ -242,6 +263,11 @@ public class DataPool implements Runnable
} // end makeNewConnection } // end makeNewConnection
/**
* Spins off a background thread to create a new database connection.
*
* @see #run()
*/
private void makeBackgroundConnection() private void makeBackgroundConnection()
{ {
pending = true; pending = true;
@ -260,7 +286,12 @@ public class DataPool implements Runnable
} // end makeBackgroundConnection } // end makeBackgroundConnection
private void closeConnections(Vector vconn) /**
* Closes all database connections in the specified vector.
*
* @param vconn Vector of connections to be closed.
*/
private static void closeConnections(Vector vconn)
{ {
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger.debug("closeConnections(" + String.valueOf(vconn.size()) + " to be closed)"); logger.debug("closeConnections(" + String.valueOf(vconn.size()) + " to be closed)");
@ -289,6 +320,14 @@ public class DataPool implements Runnable
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
/**
* The thread function which creates a new connection and adds it to the list of available
* connections "in the background." It then notifies all threads which are waiting for a
* new connection.
*
* @see #makeBackgroundConnection()
* @see #makeNewConnection()
*/
public void run() public void run()
{ {
try try
@ -319,6 +358,11 @@ public class DataPool implements Runnable
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
/**
* Returns the number of connections currently managed by this pool.
*
* @return The number of connections currently managed by this pool.
*/
public synchronized int numConnections() public synchronized int numConnections()
{ {
int rc = avail_connections.size() + busy_connections.size(); int rc = avail_connections.size() + busy_connections.size();
@ -328,6 +372,14 @@ public class DataPool implements Runnable
} // end numConnections } // end numConnections
/**
* Attempts to get a database connection from the pool, waiting for one if the "wait-if-busy" flag was set
* in the data pool's configuration.
*
* @return A new database connection.
* @exception java.sql.SQLException The connection limit was reached, or an error prevented the creation
* of another connection.
*/
public synchronized Connection getConnection() throws SQLException public synchronized Connection getConnection() throws SQLException
{ {
for (;;) for (;;)
@ -387,14 +439,28 @@ public class DataPool implements Runnable
} // end getConnection } // end getConnection
/**
* Returns a database connection to the pool.
*
* @param c The connection to be returned to the pool.
*/
public synchronized void releaseConnection(Connection c) public synchronized void releaseConnection(Connection c)
{ {
busy_connections.removeElement(c); // move from one vector to another if (c!=null)
avail_connections.addElement(c); { // move from one vector to another
notifyAll(); // wake up! Got a new connection for you! busy_connections.removeElement(c);
avail_connections.addElement(c);
notifyAll(); // wake up! Got a new connection for you!
} // end if
} // end releaseConnection } // end releaseConnection
/**
* Closes all connections managed by this data pool.
*
* @see #closeConnections(java.util.Vector)
*/
public synchronized void closeAllConnections() public synchronized void closeAllConnections()
{ {
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
@ -406,6 +472,11 @@ public class DataPool implements Runnable
} // end closeAllConnections } // end closeAllConnections
/**
* Returns a string reflecting the current state of the data pool, commonly used for debugging.
*
* @return The debugging string for this pool.
*/
public synchronized String toString() public synchronized String toString()
{ {
StringBuffer info = new StringBuffer(); StringBuffer info = new StringBuffer();

View File

@ -19,8 +19,16 @@ package com.silverwrist.venice.db;
import java.sql.*; import java.sql.*;
import java.util.*; import java.util.*;
import com.silverwrist.util.AnyCharMatcher;
import com.silverwrist.util.StringUtil; import com.silverwrist.util.StringUtil;
/**
* Utility functions commonly used for passing string values to SQL commands, and interpreting the results.
*
* @author Eric J. Bowersox &lt;erbo@silcom.com&gt;
* @version X
* @see com.silverwrist.util.StringUtil
*/
public class SQLUtil public class SQLUtil
{ {
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
@ -28,6 +36,9 @@ public class SQLUtil
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
private static final String SQL_WILDCARD_CHARS = "%_'";
// used to convert dates and times to UTC for sending to SQL
private static SimpleTimeZone utc = new SimpleTimeZone(0,"UTC"); private static SimpleTimeZone utc = new SimpleTimeZone(0,"UTC");
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
@ -35,6 +46,13 @@ public class SQLUtil
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
/**
* Converts a date-and-time string (an SQL DATETIME value) to a standard Java date.
*
* @param dstr The date-and-time string to convert, presumed to be in UTC.
* @return The converted date and time.
* @exception java.sql.SQLException The date and time string was in an invalid format.
*/
private static java.util.Date convertDateTimeString(String dstr) throws SQLException private static java.util.Date convertDateTimeString(String dstr) throws SQLException
{ {
if (dstr==null) if (dstr==null)
@ -65,12 +83,31 @@ public class SQLUtil
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
*/ */
/**
* Performs SQL encoding of an arbitrary string. When a string is SQL-encoded, all single-quote
* characters are doubled, and all other characters are left untouched.
*
* @param str The string to be SQL-encoded. May be <CODE>null</CODE>.
* @return The SQL-encoded equivalent of <CODE>str</CODE>. If <CODE>str</CODE> is
* <CODE>null</CODE>, returns <CODE>null</CODE>.
* @see com.silverwrist.util.StringUtil#encodeStringSQL(java.lang.String)
*/
public static String encodeString(String str) public static String encodeString(String str)
{ {
return StringUtil.encodeStringSQL(str); return StringUtil.encodeStringSQL(str);
} // end encodeString } // end encodeString
/**
* Performs SQL encoding of an arbitrary string, enclosing it in quotes, so that it may be passed as an
* argument in an SQL statement. When a string is SQL-encoded, all single-quote characters are doubled,
* and all other characters are left untouched.
*
* @param str The string to be SQL-encoded. May be <CODE>null</CODE>.
* @return The SQL-encoded equivalent of <CODE>str</CODE>, in quotes. If <CODE>str</CODE> is
* <CODE>null</CODE>, returns "NULL".
* @see com.silverwrist.util.StringUtil#encodeStringSQL(java.lang.String)
*/
public static String encodeStringArg(String str) public static String encodeStringArg(String str)
{ {
if (str==null) if (str==null)
@ -81,41 +118,62 @@ public class SQLUtil
} // end encodeStringArg } // end encodeStringArg
/**
* Performs SQL-encoding of a string which may contain the SQL wildcard characters, '%' and '_'. The
* wildcard characters are escaped with '\', and the single-quote characters are doubled, but all other
* characters are left untouched.
*
* @param str The string to be SQL-encoded. May be <CODE>null</CODE>.
* @return The SQL-encoded equivalent of <CODE>str</CODE>. If <CODE>str</CODE> is
* <CODE>null</CODE>, returns <CODE>null</CODE>.
*/
public static String encodeStringWildcards(String str) public static String encodeStringWildcards(String str)
{ {
if ((str.indexOf('_')<0) && (str.indexOf('%')<0)) if (str==null)
return StringUtil.encodeStringSQL(str); return null; // safety feature
AnyCharMatcher nhc = new AnyCharMatcher(SQL_WILDCARD_CHARS);
int ndx = nhc.get(str);
if (ndx<0)
return str; // trivial short-circuit case
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
for (int i=0; i<str.length(); i++) while (ndx>=0)
{ // loop through the string encoding its characters { // append the matched "head" and then the encoded character
char c = str.charAt(i); if (ndx>0)
switch (c) buf.append(str.substring(0,ndx));
switch (str.charAt(ndx++))
{ {
case '\'': case '%':
buf.append("\'\'"); buf.append("\\%");
break; break;
case '_': case '_':
buf.append("\\_"); buf.append("\\_");
break; break;
case '%': case '\'':
buf.append("\\%"); buf.append("\'\'");
break;
default:
buf.append(c);
break; break;
} // end switch } // end switch
} // end for if (ndx==str.length())
return buf.toString(); // munched the entire string - all done!
str = str.substring(ndx);
ndx = nhc.get(str);
} // end while
buf.append(str); // append the unmatched tail
return buf.toString(); return buf.toString();
} // end encodeStringWildcards } // end encodeStringWildcards
/**
* Encodes a date as an SQL date/time string, expressed in UTC.
*
* @param d The date to be encoded.
* @return The string equivalent of that date.
*/
public static String encodeDate(java.util.Date d) public static String encodeDate(java.util.Date d)
{ {
// Break down the date as a UTC value. // Break down the date as a UTC value.
@ -167,12 +225,28 @@ public class SQLUtil
} // end encodeDate } // end encodeDate
/**
* Returns the value of a DATETIME column in the current row of an SQL result set, formatted as a date.
*
* @param rs The result set to look in.
* @param column The name of the column to be returned.
* @return The value of the specified column, expressed as a date.
* @exception java.sql.SQLException If the column could not be retrieved or converted.
*/
public static java.util.Date getFullDateTime(ResultSet rs, String column) throws SQLException public static java.util.Date getFullDateTime(ResultSet rs, String column) throws SQLException
{ {
return convertDateTimeString(rs.getString(column)); return convertDateTimeString(rs.getString(column));
} // end getFullDateTime } // end getFullDateTime
/**
* Returns the value of a DATETIME column in the current row of an SQL result set, formatted as a date.
*
* @param rs The result set to look in.
* @param column The 1-based index of the column to be returned.
* @return The value of the specified column, expressed as a date.
* @exception java.sql.SQLException If the column could not be retrieved or converted.
*/
public static java.util.Date getFullDateTime(ResultSet rs, int column) throws SQLException public static java.util.Date getFullDateTime(ResultSet rs, int column) throws SQLException
{ {
return convertDateTimeString(rs.getString(column)); return convertDateTimeString(rs.getString(column));
@ -180,4 +254,3 @@ public class SQLUtil
} // end getFullDateTime } // end getFullDateTime
} // end class SQLUtil } // end class SQLUtil