OCCIConnectionServlet.java Source code

Java tutorial

Introduction

Here is the source code for OCCIConnectionServlet.java

Source

/*
    
Java Programming with Oracle JDBC
by Donald Bales 
ISBN: 059600088X
Publisher: O'Reilly
    
*/

import oracle.jdbc.pool.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.Vector;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.ConnectionPoolDataSource;

public class OCCIConnectionServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Oracle Cached Connection " + "Implementation Test Servlet</title>");
        out.println("</head>");
        out.println("<body>");

        // let's turn on verbose output
        OCCIConnection.setVerbose(true);
        // now let's get a cached connection
        Connection connection = OCCIConnection.checkOut();

        Statement statement = null;
        ResultSet resultSet = null;
        String userName = null;
        try {
            // test the connection
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select initcap(user) from sys.dual");
            if (resultSet.next())
                userName = resultSet.getString(1);
        } catch (SQLException e) {
            out.println("DedicatedConnection.doGet() SQLException: " + e.getMessage() + "<p>");
        } finally {
            if (resultSet != null)
                try {
                    resultSet.close();
                } catch (SQLException ignore) {
                }
            if (statement != null)
                try {
                    statement.close();
                } catch (SQLException ignore) {
                }
        }

        // let's add a little delay so we can force
        // multiple connections in the connection cache
        for (int o = 0; o < 3; o++) {
            for (int i = 0; i < 2147483647; i++) {
            }
        }

        // let's return the conection
        OCCIConnection.checkIn(connection);

        out.println("Hello " + userName + "!<p>");
        out.println("You're using an Oracle Cached " + "Connection Implementation connection!<p>");
        out.println("</body>");
        out.println("</html>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        doGet(request, response);
    }
}

class OCCIConnection {
    private static boolean verbose = false;

    private static int numberImplementations = 0;

    private static Vector cachedImplementations = new Vector();

    public static synchronized Connection checkOut() {
        return checkOut("Database");
    }

    public static synchronized Connection checkOut(String baseName) {
        boolean found = false;
        OracleConnectionCacheImpl cached = null;
        Connection connection = null;
        if (verbose) {
            System.out
                    .println("There are " + Integer.toString(numberImplementations) + " connections in the cache");
            System.out.println("Searching for a matching implementation...");
        }
        for (int i = 0; !found && i < numberImplementations; i++) {
            if (verbose) {
                System.out.println("Vector entry " + Integer.toString(i));
            }
            cached = (OracleConnectionCacheImpl) cachedImplementations.get(i);
            if (cached.getDescription().equals(baseName)) {
                if (verbose) {
                    System.out.println("found cached entry " + Integer.toString(i) + " for " + baseName);
                }
                found = true;
            }
        }
        if (!found) {
            if (verbose) {
                System.out.println("Cached entry not found ");
                System.out.println("Allocating new entry for " + baseName);
            }
            try {
                cached = new OracleConnectionCacheImpl(getConnectionPoolDataSource(baseName));
                cached.setDescription(baseName);
                cachedImplementations.add(cached);
                numberImplementations++;
            } catch (SQLException e) {
                System.err.println(e.getMessage() + " creating a new implementation for " + baseName);
            }
        }
        if (cached != null) {
            try {
                connection = cached.getConnection();
            } catch (SQLException e) {
                System.err.println(e.getMessage() + " getting connection for " + baseName);
            }
        }
        return connection;
    }

    public static ConnectionPoolDataSource getConnectionPoolDataSource(String baseName) {
        Context context = null;
        ConnectionPoolDataSource cpds = null;
        try {
            Properties properties = new Properties();
            properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
            properties.setProperty(Context.PROVIDER_URL, "file:/JNDI/JDBC");
            context = new InitialContext(properties);
            cpds = (ConnectionPoolDataSource) context.lookup(baseName);
        } catch (NamingException e) {
            System.err.println(e.getMessage() + " creating JNDI context for " + baseName);
        }
        return cpds;
    }

    protected static synchronized void checkIn(Connection c) {
        try {
            c.close();
        } catch (SQLException e) {
            System.err.println(e.getMessage() + " closing connection");
        }
    }

    public static String[] getReport() {
        int line = 0;
        String[] lines = new String[numberImplementations * 7];
        OracleConnectionCacheImpl cached = null;

        for (int i = 0; i < numberImplementations; i++) {
            cached = (OracleConnectionCacheImpl) cachedImplementations.get(i);
            lines[line++] = cached.getDescription() + ":";
            switch (cached.getCacheScheme()) {
            case OracleConnectionCacheImpl.DYNAMIC_SCHEME:
                lines[line++] = "Cache Scheme  = DYNAMIC_SCHEME";
                break;
            case OracleConnectionCacheImpl.FIXED_RETURN_NULL_SCHEME:
                lines[line++] = "Cache Scheme  = FIXED_RETURN_NULL_SCHEME";
                break;
            case OracleConnectionCacheImpl.FIXED_WAIT_SCHEME:
                lines[line++] = "Cache Scheme  = FIXED_WAIT_SCHEME";
                break;
            }
            lines[line++] = "Minimum Limit = " + Integer.toString(cached.getMinLimit());
            lines[line++] = "Maximum Limit = " + Integer.toString(cached.getMaxLimit());
            lines[line++] = "Cache Size    = " + Integer.toString(cached.getCacheSize());
            lines[line++] = "Active Size   = " + Integer.toString(cached.getActiveSize());
            lines[line++] = " ";
        }
        return lines;
    }

    public static void setVerbose(boolean v) {
        verbose = v;
    }

}