Bom dia eu tenho o seguinte método que efetua conexões pra mim e todos os meus sistemas:
[code]public class ConexaoSQL implements ConexaoDao {
@Override
public Connection getConexao() {
Connection conn = null;
try {
// Carrega o driver JDBC especfico para o banco de dados MySQL
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
// Estabelece a conexao com o banco de dados
String url = "jdbc:mysql://192.168.0.2?zeroDateTimeBehavior=convertToNull&user=root&password=powerful";
conn = DriverManager.getConnection(url);
// Se chegou porque a conexo foi feita com successo
System.out.println("Conexao estabelecida com sucesso");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}[/code]
E outra classe onde eu tenho métodos prontos que efetuam Querys para mim: ( onde neste método eu crio e fecho a conexão (teóricamente));
[code]public class CommandSQL {
static ConexaoDao conector = new ConexaoSQL();
private static Connection conn;
public static int executeSqlLine(String sql) throws SQLException {
conn = conector.getConexao();
PreparedStatement ps = conn.prepareStatement(sql);
Arquivo.gravaLog("Executando linha " + sql);
ps.execute();
}
public static ResultSet executeSqlQuery(String sql) throws SQLException {
conn = conector.getConexao();
PreparedStatement ps = conn.prepareStatement(sql);
System.out.println(sql);
Arquivo.gravaLog("Executando linha " + sql);
return ps.executeQuery();
}
public static void closeSqlConnection() {
try {
conn.close();
} catch (SQLException e) {
Arquivo.gravaLog(e.getMessage() + " Close SQL Connection - CommandSQL");
}
}
[/code]
Eu utilizo estes métodos assim:
public void selectColaboradores(){
try{
ResultSet rs = CommandSQL.executeSqlQuery("SELECT * FROM colaboradores");
} catch (SQLException sql){
System.out.println(sql.getMessage());
} finally {
CommandSQL.closeSqlConnection();
}
Gostaria de saber se esta forma como estou programando está abrindo e fechando a conexão com o banco de dados corretamente e que tipo de problemas este tipo de conexão pode
me causar e porquê.
Tenho diversos projetos e todos eles utilizam esta classe pra efetuar consultas sql.
Estava analisando as conexões com o banco de dados pela ferramenta MySQL Administrator
E percebi na aba User Connections que raramente o número de conexões é menor que 30 (média de 40 a 70), sendo que na minha empresa temos apenas 27 usuários
O problema é que os usuários não utilizam o sistema com frequência, e a unica coisa que fica rodando Querys é o Chat interno que atualiza o status de cada usuário a cada 30 segundos, cada usuário envia uma resposta de status (Online, Ausente, Ocupado) pra um servidor e o mesmo atualiza o status deste usuário no banco de dados. Quando um usuário
deixa de estar conectado por mais de 1 minuto e meio o status deste usuário é setado no banco de dados como Offline. Esta é a unica Thread envolvendo banco de dados que fica rodando em background em todas as máquinas.
Este volume de conexões que eu vi no MySQL Administrator está correto? Percebi que na coluna “Command” o tipo da maioria das conexões é Sleep, isso significa que a conexão esta ativa ou não? meu método está fechando as conexões corretamente?
Uma coisa que também tem me incomodado um pouco é que alguns sistemas que estou desenvolvendo está sendo necessário à utilização de consultas sql em Threads simultaneas utilizando a mesma classe estática CommandSQL, em alguns momentos (raros) acontece o erro de Comunications Link Failure the last packet send a 2 miliseconds ago, acredito que isso aconteça porque a Thread esta tentando acessar a conexão estática da classe CommandSQL ao mesmo tempo que outra Thread, pensando nisso fiz com que estas Threads utilizassem o synchronized
@Override
public synchronized void run() {}
Mesmo utilizando o synchronized isso acontece, porquê?
Lembrando que todas essas perguntas vão servir para aprimorar meu conhecimento, não estou criando este tópico para resolver problemas na empresa e sim para compreender melhor algumas coisas.
Agradeço toda a ajuda.