import java.sql.*;import java.io.*;importjava.util.StringTokenizer;importjava.util.Properties;importjava.util.Random;/*** Class DBWrapper contains
* wrapper routines for using JDBC
* to access the database.
*
*@authorluwei
*@version1.0*/
public classDBWrapper
{private static int CONNECTION_RETRIES = 10;private static int QUERY_RETRIES = 10;privateString dbUrl;privateString username;privateString password;privateString jdbcClassName;privateConnection dbCon;private boolean hasError = false;private String errorString = null;private static DBWrapper myInstance = null;/*** DBWrapper constructor*/
publicDBWrapper() {}/*** DBWrapper conscrutor
*@paraminUrl String url of database
*@paraminJdbcClassName String containing name of jdbc driver
*@paraminUserName String containing database username
*@paraminPassWord String containing database password*/
publicDBWrapper( String inUrl, String inJdbcClassName, String inUserName, String inPassWord )throwsException {
dbUrl=inUrl;
jdbcClassName=inJdbcClassName;
username=inUserName;
password=inPassWord;
connect();
}/*** connectAsDefaultCteLibrary()
* Create a connection to the CTE library using the default connection parameters.
*@returnvoid*/
public voidconnectAsDefaultDatabase()throwsException {
myInstance.connect("jdbc:postgresql://localhost:5432/postgres","org.postgresql.Driver", "postgres", "741613551");
}/*** closeConnections closes any currently open connections
*@returnvoid*/
private voidcloseConnections()throwsException {if (dbCon!=null) {
dbCon.close();
}
}/*** DBWrapper Instance()
* Get a singleton instance of the DBWrapper object.
*@returnDBWrapper*/
public staticDBWrapper Instance()throwsException {if (myInstance == null) {
myInstance= newDBWrapper();
myInstance.connectAsDefaultDatabase();
}returnmyInstance;
}/*** boolean connect()
* Connect to a database using the parameters supplied in the constructor.
*@returnboolean*/
private booleanconnect()throwsException {boolean opened = false;
DriverManager.registerDriver(neworg.postgresql.Driver());//Try to open a connection the database.
int retry = 0;while(retry++
Class.forName(jdbcClassName);
dbCon=DriverManager.getConnection(dbUrl,username,password);break;
}if(retry < CONNECTION_RETRIES)opened=true;returnopened;
}/*** boolean connect()
* Connect to a JDBC datasource without using the parameters supplied in the constructor.
*@paraminUrl String url of database
*@paraminJdbcClassName String containing name of jdbc driver
*@paraminUserName String containing database username
*@paraminPassWord String containing database password
*@returnboolean*/
public booleanconnect( String inUrl, String inJdbcClassName, String inUserName, String inPassWord )throwsException {
dbUrl=inUrl;
jdbcClassName=inJdbcClassName;
username=inUserName;
password=inPassWord;
closeConnections();returnconnect();
}/*** ResultSet runQuery()
* Executes a query and returns a resultset.
*
*@paramString containing a SQL statement
*@returnResultSet*/
publicResultSet runQuery( String sqlQuery )throwsException {
Statement statement=dbCon.createStatement();
ResultSet resultSet=statement.executeQuery(sqlQuery);returnresultSet;
}/*** boolean runUpdate()
* Executes an update and returns true of successfully executed.
*
*@paramString containing a SQL statement
*@returnboolean*/
public booleanrunUpdate( String sqlQuery )throwsException {
Statement ps=dbCon.createStatement();boolean wasExecuted = false;int retry = 0;while(retry++
ps.executeUpdate(sqlQuery);break;
}if(retry < CONNECTION_RETRIES)wasExecuted=true;returnwasExecuted;
}/*** ResultSet runChainedQuery()
* Executes a chained mode transaction query.
*
*@paramString containing a SQL statement
*@paramString containing the isolation level to run the transaction.
*@returnResultSet*/
publicResultSet runChainedQuery( String sqlQuery, String isolationLevel )throwsException {int retry = 0;//Create the resultset and statement object.
ResultSet resultSet = null;
Statement dbStatement= null;//Connect to the database.
dbStatement =dbCon.createStatement();//Retry the query until complete or timeout.
while (retry++
dbStatement.executeUpdate( "Begin Transaction");//Set the isolation level.
dbStatement.executeUpdate( new String( "Set Transaction Isolation level " +isolationLevel ) );//Execute the query.
resultSet =dbStatement.executeQuery( sqlQuery );//Commit the transaction.
dbStatement.executeUpdate( "commit");//Close the connection.
dbStatement.close();break;
}returnresultSet;
}/*** boolean runChainedUpdate()
* Executes a chained mode transaction query.
*
*@paramString[] containing a series of SQL statments
*@paramString containing the isolation level to run the transaction.
*@returnboolean*/
public booleanrunChainedUpdate( String [] sqlQuery, String isolationLevel )throwsException {int retry = 0;//Create the statement object.
Statement dbStatement = null;boolean wasExecuted = false;//Connect to the database.
dbStatement =dbCon.createStatement();while (retry++
try{
dbStatement.executeUpdate("Begin Transaction");//Set the isolation level.
dbStatement.executeUpdate( new String( "Set Transaction Isolation level " +isolationLevel ) );//For each sql statement, perform the update.
for( int i=0; i
dbStatement.executeUpdate( sqlQuery[i] );
}//Commit the transaction and close.
dbStatement.executeUpdate( "commit");
dbStatement.close();
wasExecuted= true;
}catch(Exception e) {
errorString= new String( "Error executing: " + sqlQuery + "\nCause: " +e.toString() );
hasError= true;//Rollback if an error has occured.
dbStatement.executeUpdate( "rollback");
dbStatement.close();
}
}returnwasExecuted;
}
}