Connection Pool para JDBC

Fiz um pool SIMPLERRIMO, e os dois metodos principais sao o getConnection e o releaseConnection.

Fiz testes concorrentes, com 3 threads de 800 queries cada. Mas voce sabe como eh, teste de concorrencia pode passar batido, e um dia da pau. Alguem me ajuda a achar algo?

Pra deixar claro, releaseSignal eh apenas um mutexiznho. connections guarda as conexoes do pool atual, e allConections guarda todas, as usadas e nao usadas.

    /**
     * Gets a connection to the database.<p> 
     * So you need to release it, after use. If you are using a <code>Query</code>,
     * its finalize method will release it. It will not be a huge problem if you do not
     * release it, but this way you will get a better performance.<p>
     * Thread safe.
     */
    public synchronized Connection getConnection() throws DAOException {
        Connection conn = null;

        // if there is enought Connections
        if (connections.size() != 0) {
            conn = (Connection) connections.removeFirst();
            return conn;
        }
        // Otherwise, create a new one if the Pool is now full
        else {
            if (allConnections.size() < this.maxConnections) {
                try {
                    conn = DriverManager.getConnection(connectionString);
                }
                catch (SQLException e) {
                    throw new DAOException("Cannot stabilish a NEW connection to the database.", e);
                }
                // registering the new connection
                allConnections.add(conn);
                return conn;
            }
        }

        /*
         * Trying to get some Connections stuck inside some Queries.
         * The Query.finalize method will release them.
         * We need to wait sometime, so the GC will get the Connections for us
         */
        System.gc();

        synchronized (releaseSignal) {
            /*
             * Not inside a while, since we are giving it a maximum timeout, 
             * and this method is already SYNC, there is no way that we will loose
             * the state if we receive a signal
             */
            if (connections.size() == 0) {
                try {
                    releaseSignal.wait(timeout);
                }
                catch (InterruptedException e) {
                    throw new DAOException("Problems while waiting for connection", e);
                }
            }

            if (connections.size() == 0) {
                // TIMED OUT!!!!
                throw new DAOException(
                    "Pool is empty, and th waiting for one timed out!"
                        + "If this is happening too much, your code is probably not releasing the Connections."
                        + "If you cant solve this, set your 'database.connection.pool.timeout' to a bigger number.");
            }
            else {
                return (Connection) connections.removeFirst();
            }
        }

    }

    /**
     * Releases a connection, making it available to the pool once more.
     */
    public void releaseConnection(Connection conn) throws DAOException {
        synchronized (releaseSignal) {
            connections.addLast(conn);
            releaseSignal.notify();
        }
    }

entao paulo, o codigo nao parece ter coisas erradas…
o seu metodo de devolver uma connection nao checa se a connection faz parte da sua pool ou nao, o q pode acontecer:
alguem fazer uma conexao de outra maneira (ou mesmo com uma outra connection pool) e devolver, por erro, para a tua connection pool, isto eh: sua conection pool vai ficar com uma conexao errada la dentro e pode devolver ela pra alguem que nao quer uma conexao errada.
Sem contar que se alguem fizer isso (por erro o umaldade pra dar o bug do teu codigo) vc podera acabar tendo uma connection pool com mais connections q o maxconnections ja que ele nao eh testado na hora de devolver.

Pra resolver isso eh manter uma pilha de connections livres e outra de connections usados. Quando um usado eh devolvido, voce verifica se ele esta na de usados, se estiver, retira e joga na de nao usados.

Outra coisa, pra fazer um teste serio, cria uma servlet q faz as 800 queries e cria um html com 2 elevado a 64 frames (facil de fazer) que abre a servlet… e faz a conta de quantos queries estarao sendo feitos…

Foi assim q testei meu codigo

Gui

É verdade.
Mas basta dar um if(allConnections.contains()) antes de adiconar na pool novamente, ou soltou uma excecao.

rs… Sei que este post é bem velhinho, mas você tem este código completo?
É exatamente o que estou precisando neste momento, um connection pool simples, sem dependencias…

Não entenidi a parte do releaseConnection()

Abraço!

Implementei a minha Connection Pool:

http://pedroabs.wordpress.com/2011/09/27/connection-pool-em-java-pool-de-conexoes/

[quote=pedroabs]Implementei a minha Connection Pool:

http://pedroabs.wordpress.com/2011/09/27/connection-pool-em-java-pool-de-conexoes/[/quote]

Ficou bom, parabéns! Vou testar quando tiver um tempo.