julioviegas:
Qualquer objeto q for acessado por mais de uma thread precisa ser ThreadSafe, ou seja:
- Ele NAO pode guardar estado(ie atributos);
ou
- Se possivel, utilize as bibliotecas de acesso concorrente do java.util.concurrent, q garantem integridade e performance no multiplo acesso a recursos compartilhados com uso de memoria razoavel;
ou
- Guardando estado, os valores de seus atributos precisam ser acessados de forma sincrona. Existem diversos patterns descritos no livro effective java q vc pode aplicar nessa situacao.
Prefira 1, senao 2, e se nao houver jeito 3. Tudo depende de seus requisitos de performance e desenho da solucao.
Beleza Júlio, entendi. Agora e no caso desta classe ser um Pool de Conexões JDBC, isto é, uma classe que implementa a interface javax.sql.DataSource? Não é pra ela controlar a concorrência automaticamente?
Eu uso banco de dados Firebird, cujo driver JDBC é o JayBird e uso Glassfish. Conforme já expliquei em outra mensagem aqui do GUJ, não consegui configurar um Connection Pool no próprio Glassfish porque o Glassfish usa a propriedade DatabaseName para o nome do banco e o JayBird só tem a propriedade Database. Resumindo, o Glassfish não conecta no meu banco. Se isto tivesse funcionado, eu faria conforme o tutorial J2EE da Sun recomenda, que é injetar o ConnectionPool diretamente no Bean e obter uma conexão, como neste exemplo do próprio tutorial:
<a class="mention" href="/u/resource">@Resource</a> javax.sql.DataSource catalogDS;
public getProductsByCategory() {
// get a connection and execute the query
Connection conn = catalogDS.getConnection();
…
}
Porém, como não funcionou, tive que fazer isso na mão, da seguinte maneira (dei uma resumida):
InitialContext context = new InitialContext();
try
{
dataSource = (DataSource) context.lookup(“jdbc/MeuBanco”);
}
catch (NamingException erro)
{
dataSource = null;
}
if (dataSource == null)
{
FBWrappingDataSource dataSource = new FBWrappingDataSource();
context.bind(“jdbc/MeuBanco”, dataSource);
}
Connection connection = dataSource.getConnection();
Fazendo isso é o mesmo do que com injeção de recursos ou vou precisar fazer um controle manual de concorrência conforme você explicou?