19.05.2013 Views

Migrando do InterBase para o Firebird 1.5 no - Guj

Migrando do InterBase para o Firebird 1.5 no - Guj

Migrando do InterBase para o Firebird 1.5 no - Guj

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

sistemas lega<strong>do</strong>s e banco de da<strong>do</strong>s e também <strong>no</strong> padrão JDBC. O padrão JCA especifica uma arquitetura<br />

onde um servi<strong>do</strong>r de aplicação pode cooperar com um driver de tal forma que este gerencie transações,<br />

segurança, pool de conexões e outros recursos e o driver provê apenas a funcionalidade de conexão.<br />

O <strong>no</strong>vo JayBird <strong>1.5</strong> traz algumas melhorias e i<strong>no</strong>vações:<br />

• Além da implementação <strong>do</strong> tipo JDBC 4, este driver implementa também o tipo 2 e uma versão<br />

embedded server, a qual permite criar aplicações com to<strong>do</strong>s os requisitos <strong>para</strong> conexão a um<br />

servi<strong>do</strong>r embutida na própria aplicação.<br />

• Suporte <strong>para</strong> IN e OUT stored procedures. O JayBird 1.0 provia suporte apenas a parâmetros IN<br />

enquanto esta <strong>no</strong>va versão implementa to<strong>do</strong>s os requisitos também a parâmetros OUT.<br />

• Nova infraestrutura <strong>para</strong> pool de conexões e prepared statements.<br />

O tipo JDBC 4 é uma implementação totalmente em Java que converte chamadas JDBC diretamente <strong>para</strong><br />

o protocolo utiliza<strong>do</strong> pelo banco de da<strong>do</strong>s. Esta difere da implementação de tipo 3, que converte uma<br />

chamada <strong>para</strong> um protocolo independente que depois é convertida, por um servi<strong>do</strong>r intermediário, <strong>para</strong> o<br />

protocolo específico <strong>do</strong> banco em questão. Enquanto o tipo 4 é preferi<strong>do</strong> <strong>para</strong> configurações onde o<br />

cliente localiza-se numa máquina diferente da <strong>do</strong> servi<strong>do</strong>r, sua performance é prejudicada quan<strong>do</strong> as<br />

conexões são feitas ao servi<strong>do</strong>r <strong>Firebird</strong> a partir da mesma máquina onde este se encontra. Isto deve-se<br />

ao fato que o tipo JDBC 4 utiliza sockets <strong>para</strong> realizar conexões, introduzin<strong>do</strong> um overhead adicional.<br />

Quan<strong>do</strong> a comunicação com o servi<strong>do</strong>r de banco de da<strong>do</strong>s será efetuada a partir da mesma máquina<br />

onde este está instala<strong>do</strong>, como pode ser o caso de aplicações web em Java onde o container web roda na<br />

mesma máquina <strong>do</strong> banco de da<strong>do</strong>s, é preferível utilizar o tipo JDBC 2. Este, utiliza uma biblioteca nativa<br />

JNI <strong>para</strong> efetuar as conexões, possibilitan<strong>do</strong> uma performance superior pois acessa o banco de da<strong>do</strong>s<br />

diretamente.<br />

Um pool de conexões provê um meio de gerenciar e manipular conexões a bancos de da<strong>do</strong>s. Sua<br />

principal utilidade é minimizar o tempo necessário <strong>para</strong> uma aplicação obter uma conexão a um banco,<br />

ten<strong>do</strong> em vista que, em geral, esta é uma operação que consome considerável tempo. Além disso, outras<br />

vantagens são:<br />

• Gerenciamento <strong>do</strong> número limite de conexões. Uma aplicação não pode abrir mais conexões <strong>do</strong><br />

que o permiti<strong>do</strong> pelo pool.<br />

• Centralização <strong>do</strong> lugar onde conexões a bancos de da<strong>do</strong>s serão obtidas.<br />

• Possibilidade também de fazer pool de prepared statements.<br />

Um prepared statement é uma instrução SQL compilada e otimizada apenas uma vez <strong>para</strong> ser utilizada<br />

várias vezes por uma aplicação, reduzin<strong>do</strong> assim o tempo de execução quan<strong>do</strong> esta se encontra, por<br />

exemplo, num loop. Porém, o que acontece quan<strong>do</strong> precisamos utilizá-la durante o ciclo de vida de um<br />

objeto? Devemos criar uma conexão dedicada ao objeto, já que um prepared statement é<br />

intrinsecamente relaciona<strong>do</strong> à conexão que o criou, ou pre<strong>para</strong>r um cada vez que for necessário utilizálo?<br />

As duas opções são insatisfatórias, a primeira por ser inviável <strong>no</strong> senti<strong>do</strong> de consumir uma conexão<br />

<strong>para</strong> cada objeto instancia<strong>do</strong> que faz uso de prepared statement e a segunda por perder a principal<br />

vantagem que é a possibilidade de reutilização de consultas já compiladas e otimizadas.<br />

Um pool de prepared statements resolve estes problemas. Veja o exemplo abaixo:<br />

Connection connection = dataSource.getConnection(); 1<br />

try { 2<br />

PreparedStatement ps = connection.prepareStatement( 3<br />

“SELECT * FROM test_table WHERE id = ?”); 4<br />

try { 5<br />

ps.setInt(1, id); 6<br />

ResultSet rs = ps.executeQuery(); 7<br />

while (rs.next()) { 8<br />

// faz alguma coisa 9<br />

} 10<br />

} finally { 11<br />

ps.close(); 12<br />

} 13<br />

} finally { 14<br />

connection.close(); 15<br />

} 16<br />

As linhas 1 a 16 apresentam um código típico quan<strong>do</strong> um pool de prepared statements está sen<strong>do</strong><br />

utiliza<strong>do</strong>. A aplicação obtém uma conexão através de um javax.sql.DataSource, pre<strong>para</strong> uma consulta<br />

Grupo de Usuários Java – http://www.guj.com.br – Página 4

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!