Dúvida entre driver DataSource e driver jdbc comum

Olá pessoal,
bem resumidamente, o que sei é o seguinte: podemos utilizar um driver java DataSource (pool de conexões) para permitir que várias conexões acessem uma fonte de dados, ao mesmo tempo; e utilizamos um driver jdbc comum (não DataSource) para possibilitar que somente uma conexão seja feita de cada ves, ou seja, as conexões de vários clientes serão feitas em fila e seqüência.

Minha dúvida é a seguinte: eu deveria usar um data source somente aplicações web, juntamente com um container? Ou, poderia utilizar também em aplicações desktop? Ou seria melhor separar as coisas e utilizar um DS para app web, e um driver jdbc simples para as apps desktop?

Me ajudem com isso, por favor!

Obrigado.
Kallás.

Na realidade não é bem isso, o driver permite que sejam feitas quantas conexões forem necessarias, o problema é o seguinte:

Em uma aplicação servidora você tem basicamente 2 opções para conexões, você pode abrir uma conexão para cada solicitação, e fecha-la quando a solicitação terminar, o problema é que abrir uma conexão com o banco é um processo muito custoso, que depende de trafego de rede, autenticação, etc, e isso pode ficar muito lento caso o numero de conexões seja grande…

A opção pra resolver o problema de abrir uma conexão para cada requisição é abrir uma conexão só, e mante-la aberta, e todas as requisições são enviadas para essa conexão. O problema nesse caso é que só é possível executar uma transação por vez na conexão, os clientes terão que enfileirar-se para acessar o banco.

Então, como diria o pessoal do interior, “você sai do espeto e cai na brasa”. Ahh não ser que você use um “Pool de conexões” que resolve os 2 problemas, mantendo uma serie de conexões abertas e distribuindo elas para os clientes à medida que eles solicitam e mantendo elas abertas apos os clientes usa-las para que possam ser usadas novamente. Assim você não precisa abrir uma conexão toda hora, mas não precisa ter uma só e enfileirar os clientes.

Existem vários gerenciadores de Pool como C3P0, DBCP, etc… a unica coisa que fazem é abrir uma conexão normal, e mantê-la aberta, gerenciado todo seu ciclo de vida…

Eles podem ser usados por qualquer tipo de aplicação, mas os servidores de aplicação geralmente tem um gerenciador interno próprio ou algum desses aí embutido…

Caso sua aplicação desktop seja uma aplicação stand alone, não justifica usar um Pool de conexões, pois haverá sempre uma unica conexão, porem se houver um servidor ao qual essa aplicação se conecte, como EJB, RMI, etc, e esse servidor for responsável pelas transações com o banco, aí sim é altamente recomendável que seja usado um Pool.

Ou seja, o pool não se restringe a uma aplicação web, e sim a qualquer aplicação servidora, geralmente toda aplicação web usa pois ela sempre é uma aplicação servidora.

:wink:

http://jakarta.apache.org/commons/dbcp/

Olá jairelton, valeu cara.

Com a sua explicação, consegui esclarecer alguns pontos nos quais eu estava me confundindo. Mas, então, vou puxar o “fio da meada” do seu tópico para fazer outra pergunta: - A partir do que comentou acima, a respeito de minha aplicação se conectar a um componente servidor, imagine que eu não esteja usando um servidor de aplicações para disponibilizar esse trabalho de gerenciamento de pool…
Como eu poderia me conectar a uma base de dados, utilizando os mesmos conceitos de data source, porém, fazendo isso a partir de uma aplicação que não estivesse em servidores app web? Ou seja, é uma aplicação stand alone, mas, que funcionaria como uma app servidora, e todas as máquinas que quisessem acessar o banco de dados o fariam através dessa app stand alone servidora.
Quer dizer, bastaria utilizar o mesmo processo de conexão de um driver comum, porém, utilizando um data source?

Obrigado!
Kallas.

Basta você baixar um desses gerenciadores de pool aí e implementar a utilização deles, no site dos projetos você consegue exemplos.

Veja um exemplo básico com DBCP:

[code]public class ConnectionFactory{
private DataSource ds;

private static ConnectionFactory instance = new ConnectionFactory();

public ConnectionFactory(){
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUsername("root");
bds.setPassword("1234");
bds.setUrl("jdbc:mysql://localhost/meu_banco");
ds = bds;
}

public static ConnectionFactory getInstance(){
return instance;
}

public Connection getConnection(){
return ds.getConnection();
}
}[/code]

[code]public class MinhaApp{
public static void main(String[] args){
Connection con = ConnectionFactory.getInstance().getConnection();
PreparedStatement stmt = con.prepareStatement("SELECT * FROM tabela");
ResultSet res = stmt.executeQuery();

  //restante

}
}[/code]

Se você olhar a documentação vai ver que há outras opções mais avançadas que essa e com muitas outras opções de configuração, basta ver o que melhor se adapta ao que você quer.

Dae galera… achei esse tópico e resolvi reabrí-lo…

O JairElton mostrou esse código ai… como eu poderia muda-lo para suportar varias bases de dados??
Tipo… eu estou fazendo um sistema em que dependendo do usuário(login, senha), ele se conecta a uma base diferente… como eu poderia mudar essa classe pra suportar isso?? Ou o próprio dbcp tem alguma classe pra isso!!
Abraço!!

Se o DBCP tem algo pra isso eu não sei, mas acho que não.

O que você poderia fazer com esse codigo, é implementar o design pattern “Abstract Factory”, assim você poderia trocar o factory de acordo com o usuario.

Foi a ideia que tive agora, mas não sei se é a melhor, dá uma estudada aí.

Cara… achei esse exemplo no guj…
http://www.guj.com.br/java.tutorial.artigo.137.1.guj
e pelo que entedi vou ter que ter uma classe para cada usuário?? Bah… isso não seria bem estranho… porque no meu caso vao ter mais ou menos uns 30 a 40 usuarios diferentes… cada um com a sua base de dados…isso é para cada setor da empresa… dae eu teria que ter essa quantia toda de classes… já estou quase desistindo do pool e fazer a forma que todos vao me chingar… abrir uma conexão por sessão… sei lá… estou pesquisando pra ver a melhor forma… mas se alguém tiver mais alguma ideia … ou se essa for a unica dae fazer o que…!!
Abraço e valeu pela resposta!

Realmente não funciona.

Só por curiosidade, se cada usuario conecta-se em um banco diferente, pra que você precisa de um Pool?

Você pode criar um filtro ou algo assim pra pegar o data source, se quiser posso passar um exemplo depois, só pense nessa pergunta aí primeiro.

A não ser que um mesmo login possa ser usado por varios usuarios ao mesmo tempo, assim teriam varios usuarios conectados ao mesmo banco.

Quando falei que cada usuário teria umabase diferente fui um pouco incoerente… vou dar um exemplo… para a base de dados x vai ser configurado sei lá… algo em torno de 10,15 usuários… dae para cada base de dados teria um número x de usuários… quando o cara for conectar… dar vai ser procurado qual base aquele usuário é associado e assim conectar-se á ela!!
ah… se vc puder me passar aquele exemplo seria de grande ajuda…!!
Valeu cara!!
Abraço!!

Sua aplicação vai rodar em um servidor de aplicações ou container web?

Cara… fiquei um tempo fora e agora voltei… vou ter que usar um pool de conexões mesmo…
ah… Estou usando o Tomcat 5.5… Se vc(JairElton) puder me passar o exemplo que citasse eu agradeceria!!
Abraço!!