testei um sistema que estou desenvolvendo pela primeira vez em rede, mas qualquer busca que ele faça está muito lenta, o servidor e o cliente são máquinas potentes, quando se navega normalmente pela rede não há problemas, mas na hora de fazer uma consulta simples no banco de dados como verificar um login demora bastante, será q alguém tem alguma idéia do q possa estar acontecendo?
Java + mysql em rede lento
3 Respostas
eu consegui melhorar o desempenho mudando o statement que estava usando.
eu estava usando o java.sql.Statement
procurando no material de java achei o java.sql.PreparedStatement
onde está indicando que é mais eficiente para estar sendo utilizando
com o PreparedStatement realmente melhorou bastante o acesso ao servidor pela rede.
se alguém estiver com o mesmo problema e tiver alguma duvida…
é isso…
bom dia, gostaria de saber como faço para mudar minha conexao para PreparedStatement......
segue abaixo como está agora
package db;
import java.sql.*;
import javax.swing.*;
import java.io.*;
public class ConexaoDB_Principal{
//pega a unidade instalada
File pasta = new File(System.getProperty("user.home"));
String[] disco = pasta.toString().split(":");
String ip;
//conexao com FIREBIRD LOCAL
String driver = "org.firebirdsql.jdbc.FBDriver";
//String url = "jdbc:firebirdsql:"+ip+":c:\\gerenciador_extratos\\DB.GDB";
String usuario = "SYSDBA";
String senha = "masterkey"; /**/
private Connection conexao;
public Statement statement;
public ResultSet resultset;
public boolean conecta()
{
try {
// Gravando no arquivo
byte[] buffer = new byte[1000];
InputStream in;
try {
in = new FileInputStream(disco[0]+":\\GesObras\\ConfigIP.txt");
in.read(buffer);
String temp = new String(buffer).trim().toString();
ip = temp;
in.close();
} catch (FileNotFoundException e) {
System.out.println(e);
}
catch (IOException e) {
System.out.println(e);
}
}
catch (Exception ee) {
System.out.print(ee);
}
boolean result = true;
try
{
Class.forName(driver);
conexao = DriverManager.getConnection("jdbc:firebirdsql:"+ip+":"+disco[0]+":\\GesObras\\db\\log\\DB_LOG.FDB",usuario,senha);
}
catch(ClassNotFoundException Driver)
{
JOptionPane.showMessageDialog(null, "Driver nao localizado: "+Driver);
result = false;
System.exit(0);
}
catch(SQLException Fonte)
{
JOptionPane.showMessageDialog(null, "Ocorreu um erro ao conectar ao banco de dados, \n confira se o ip e a porta estao configurados corretamente!");
}
return result;
}
public void desconecta()
{
boolean result = true;
try
{
conexao.close();
JOptionPane.showConfirmDialog(null, "banco fechado");
}
catch(SQLException fecha)
{
JOptionPane.showMessageDialog(null, "Nao foi possivel "+
"fechar o banco de dados: "+fecha);
result = false;
}
}
public void executeSQL(String sql)
{
try
{
statement = conexao.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
resultset = statement.executeQuery(sql);
//JOptionPane.showMessageDialog(null, "deu certo a pesquisa");
}
catch(SQLException sqlex)
{
JOptionPane.showMessageDialog(null, "nao foi possivel " +
"executar o comando sql,"+sqlex+", o sql passado foi "+sql);
}
}
}
seria só mudar onde tem Statement para PreparedStatement?
valeu
Mudei para:
package db;
import java.sql.*;
import javax.swing.*;
import java.io.*;
public class ConexaoDB_Principal{
//pega a unidade instalada
File pasta = new File(System.getProperty("user.home"));
String[] disco = pasta.toString().split(":");
String ip;
//conexao com FIREBIRD LOCAL
String driver = "org.firebirdsql.jdbc.FBDriver";
//String url = "jdbc:firebirdsql:"+ip+":c:\\gerenciador_extratos\\DB.GDB";
String usuario = "SYSDBA";
String senha = "masterkey"; /**/
private Connection conexao;
public PreparedStatement statement; // mudei aki para PreparedStatement
public ResultSet resultset;
public boolean conecta()
{
try {
// Gravando no arquivo
byte[] buffer = new byte[1000];
InputStream in;
try {
in = new FileInputStream(disco[0]+":\\GesObras\\ConfigIP.txt");
in.read(buffer);
String temp = new String(buffer).trim().toString();
ip = temp;
in.close();
} catch (FileNotFoundException e) {
System.out.println(e);
}
catch (IOException e) {
System.out.println(e);
}
}
catch (Exception ee) {
System.out.print(ee);
}
boolean result = true;
try
{
Class.forName(driver);
conexao = DriverManager.getConnection("jdbc:firebirdsql:"+ip+":"+disco[0]+":\\GesObras\\db\\log\\DB_LOG.FDB",usuario,senha);
}
catch(ClassNotFoundException Driver)
{
JOptionPane.showMessageDialog(null, "Driver nao localizado: "+Driver);
result = false;
System.exit(0);
}
catch(SQLException Fonte)
{
JOptionPane.showMessageDialog(null, "Ocorreu um erro ao conectar ao banco de dados, \n confira se o ip e a porta estao configurados corretamente!");
}
return result;
}
public void desconecta()
{
boolean result = true;
try
{
conexao.close();
JOptionPane.showConfirmDialog(null, "banco fechado");
}
catch(SQLException fecha)
{
JOptionPane.showMessageDialog(null, "Nao foi possivel "+
"fechar o banco de dados: "+fecha);
result = false;
}
}
public void executeSQL(String sql)
{
try
{
statement = (PreparedStatement) conexao.createStatement( // mudei para PreparedStatement
ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
resultset = statement.executeQuery(sql);
//JOptionPane.showMessageDialog(null, "deu certo a pesquisa");
}
catch(SQLException sqlex)
{
JOptionPane.showMessageDialog(null, "nao foi possivel " +
"executar o comando sql,"+sqlex+", o sql passado foi "+sql);
}
}
}
tá dando esse erro:
Exception in thread "main" java.lang.ClassCastException: org.firebirdsql.jdbc.FBStatement cannot be cast to java.sql.PreparedStatement
at db.ConexaoDB.executeSQL(ConexaoDB.java:87)
at grafica.Splash.Autent(Splash.java:91)
at grafica.Splash.<init>(Splash.java:38)
at grafica.Splash.main(Splash.java:87)
Java Result: 1