Vc determina um número máximo de conexões e um número mínimo de conexões que ficam em “idle”. Assim vc garante um número mínimo de conexões criadas e disponíveis.
quando algum recurso do programa solicita ao pool uma conexão ele vê a primeira disponível já criada e devolve para o recurso. Após o uso o programa faz o release da conexão, mas isso não significa que ela será fechada, somente devolvida ao pool para ser futuramente reutilizada. Não existe (ou diminui-se) o custo de criar a conexão sempre que a mesma for utilizada.
Utilizei somente o C3PO e o DBCP, mas pelo menos nestes sei que dá pra vc configurar o que deve ser feito caso o número máximo de conexões tenha sido excedido, dá pra colocar como “wait”, “deny”, etc…
Dá uma olhada na documentação do pool que você irá utilizar que com certeza tem info sobre isso.
É o seguinte… eu esqueci de citar que estou fazendo isso em JavaScript. É que atualmente, no meu tempo livre, tenho estado criando alguns objetos em JavaScript, com o intuito de tornar aplicações em JavaScript mais fáceis de se criar e, como principal objetivo, OOP.
Estou fazendo a parte da conexão ao banco de dados (totalmente via JS + ADO), e me surgiu a dúvida de um pooling. O resultado ficou da seguinte forma:
var ConnectionFactory = new _ConnectionFactory();
function _ConnectionFactory()
{
this.minConn = 3;
this.maxConn = 5;
this.pool = [];
this.db = "access:phonebook.mdb";
this.user = new String();
this.pass = new String();
this.newConnection = _ConnectionFactory_newConnection;
this.getConnection = _ConnectionFactory_getConnection;
for (conn = 0; conn < this.minConn; conn++)
{
var newConn = this.newConnection();
newConn.release();
this.pool.push(newConn);
}
}
function _ConnectionFactory_newConnection()
{ return DriverManager.getConnection(this.db, this.user, this.pass); }
function _ConnectionFactory_getConnection()
{
var pool = this.pool;
for (conn in pool)
{
if (pool[conn].released())
{
pool[conn].unrelease();
return pool[conn];
}
}
if (pool.length < this.maxConn)
{
pool[pool.length] = this.newConnection();
pool[pool.length - 1].release();
return this.getConnection();
}
else
{ throw new Error("Full connection pool."); }
}
A solução foi eu criar um visualizador de status nos objetos conexão. Usando métodos de release() e unrelease() eu posso setar o estado da conexão e verificar através de um released() se a conexão está sendo usada por algum código ou não; com base nisso, o ConnectionFactory retorna uma conexão do pooling, cria uma nova, ou lança uma excessão (Error). As conexões são criadas através de um outro objeto que criei chamado DriverManager. Sim, eu estou usando nomes de classes do Java para criar os objetos em JavaScript. Estou agora fazendo a classe Statement e a ResultSet pra trabalhar sobre o Connection.
De acordo com o script que postei acima, o usuário pode usar o método ConnectionFactorygetConnection() para recuperar uma conexão do pooling ou então usar o ConnectionFactorynewConnection() caso ele queira NECESSARIAMENTE uma nova conexão.
Nada demais. Apenas o intuito de criar uma aplicação que rode 100% client-side de preferência sem a necessidade de HTTP ou similares. Uma aplicação totalmente independente de recursos externos, necessitando apenas do apoio da M$.