Programa en java lento con Mysql remoto

ZHoNNe

Buenas compañeros,

He estado este ultimo mes trabajando en una aplicación java de escritorio haciendo conexiones a un servidor mysql local. Todo va de maravilla a una velocidad asombrosa. el problema es al hacer una conexión remota a un hosting mysql en internet, la aplicación se vuelve lenta hasta el punto de congelarse.

He probado hasta utilizar el multihilo para diferentes procesos pero solo he ganado velocidad en la interfaz de usuario no en las inserciones y en las consultas.

Hasta la consulta más simple ( " select * from tabla " ) tarda unos 10 segundos en mostrarse cuando solo tiene 2 registros. Me da miedo pensar cuando tenga 1000 registros.

Teneis alguna idea de a que se puede deber?.

Gracias de antemano!!

Tunnecino

Offtopic:

El título, con ser "Programa en java lento" sobra.

Ontopic:

Has probado el tiempo de respuesta con el servidor donde está la MySQL remota? Has probado el rendimiento allí?

2
sasher

Varias cosas. Para que la aplicación no se congele como dices (supongo que te refieres a la interfaz gráfica) lo ideal es que las consultas las hagas de forma asíncrona, como ya supongo que las debes estar haciendo por lo del multihilo.

Muy probablemente sea que el servidor de base de datos que tienes sea la peste y por eso te tarda tanto en devolver la respuesta. En cualquier caso hay algunas cosas más que puedes hacer para mejorar el rendimiento, como emplear memoria cache a la hora de recuperar resultados, por ejemplo.

eXtreM3

Tiene que haber algo chungo por ahí, no me creo que un servidor tarde 10 segs en retornar una consulta simple.

Perurena

¿Cuando te conectas por SSH o como sea también tarda tanto? :S

willy_chaos

Tiene que ser la conexion con el servidor MySQL o que estas usando una pagina de estas que te dan un servidor MySQL gratis y esta saturado a mas no poder, porque si tienes buena conexión con el servidor y este va bien, debería irte rápido.

Yo el año pasado para una aplicacion una practica de la universidad tuvimos que hacer conexiones con un servidor MySQL que aloje en mi casa y desde la universidad no había problemas en el tiempo de respuesta.

Ahora con PHP hemos alojado el MySQL en una maquina externa (requisito de la practica) y tenemos los Apache + PHP en local y va bastante rápido.

Como dicen los compañeros (aunque por lo que dices ya lo haces), las consultas en aplicaciones de escritorio / android casi siempre han de ir en un thread aparte para no bloquear el thread UI.

ZHoNNe

Gracias por las respuestas, Estoy usando diferentes hilos para los diferentes procesos para que no se bloquee la UI.

Es bastante extraño porque es una conexión a un dedicado. En cualquier caso el problema es del servidor ya que me he conectado con el HeidiSQL y tarda lo mismo en arrojar las consultas. Queda descartado que sea problema de la aplicación.

Probaré a hacer algunas modificaciones en el fichero de configuración de mysql del servidor. Si doy con la solución os la comento por si os sirve en un futuro.

Gracias!

ZHoNNe

He estado haciendo pruebas esta tarde y parece ser que el problema viene al instanciar la clase conectar. Hago la instancia y conecto la base de datos la relentización es en esa conexión. Os pongo el código de la clase conectar .Vosotros usais solamente una única conexión por aplicación?. Cuando esta mucho tiempo sin usarse esa conexión no se caduca?.

public class ConectarClass {
	
static String bd;
static String login;
static String password;
static String url;
Connection connection = null;

public ConectarClass() {
	/*
	bd = "basededatos";
	login = "root";
	password = "";
	url = "jdbc:mysql://localhost/" + bd;
	*/
	
	bd = "basededatos";
	login = "usuario";
	password = "contraseña";
	url = "jdbc:mysql://185.28.21.242:3306/" + bd;
	
	try {
		Class.forName("com.mysql.jdbc.Driver");
		connection = DriverManager.getConnection(url, login, password);

	} catch (SQLException e) {
		System.out.println(e);
	} catch (ClassNotFoundException e) {
		System.out.println(e);
	} catch (Exception e) {
		System.out.println(e);
	}
}

public Connection getConnection() {
	return connection;
}

public void desconectar() {
	connection = null;
}
}
1 respuesta
bLero

#8

El problema es tu dedicado. Va como el culo:

PING 185.28.21.242 (185.28.21.242): 56 data bytes
64 bytes from 185.28.21.242: icmp_seq=0 ttl=48 time=496.571 ms
64 bytes from 185.28.21.242: icmp_seq=1 ttl=48 time=413.447 ms
64 bytes from 185.28.21.242: icmp_seq=2 ttl=48 time=331.551 ms
64 bytes from 185.28.21.242: icmp_seq=3 ttl=48 time=560.812 ms
64 bytes from 185.28.21.242: icmp_seq=4 ttl=48 time=476.669 ms
64 bytes from 185.28.21.242: icmp_seq=5 ttl=48 time=232.483 ms
64 bytes from 185.28.21.242: icmp_seq=6 ttl=47 time=316.727 ms
64 bytes from 185.28.21.242: icmp_seq=7 ttl=47 time=537.776 ms
64 bytes from 185.28.21.242: icmp_seq=8 ttl=47 time=453.936 ms
64 bytes from 185.28.21.242: icmp_seq=9 ttl=48 time=374.910 ms
64 bytes from 185.28.21.242: icmp_seq=10 ttl=47 time=246.537 ms
64 bytes from 185.28.21.242: icmp_seq=11 ttl=48 time=233.747 ms
64 bytes from 185.28.21.242: icmp_seq=12 ttl=48 time=431.227 ms
64 bytes from 185.28.21.242: icmp_seq=13 ttl=48 time=357.961 ms
B

Aparte de lo que te comentan nunca realices conexiones directas a una base de datos remotamente. Móntate una pequeña api "restful" para hacer las peticiones y que la api en local sea la encargada de acceder al servidor mysql.

2 1 respuesta
MTX_Anubis

Y usa pool de conexiones, por ejemplo hikari

willy_chaos

En mi caso dependiendo de como va a ser la aplicación de grande uso una única conexión, pero como han comentado los compañeros, puedes usar un pool de conexiones.

Perurena

#10 ¿Y eso? No sabía, la verdad que siempre he usado una API por el medio porque se me hacía más fácil pero no sabía que da peor rendimiento las consultas directas.

1 respuesta
B

#13 Es más bien por tema de seguridad no por rendimiento.

1 respuesta
Perurena

#14 Ah oki, es que me extrañana. Gracias :)

ZHoNNe

Ya he solucionado la lentitud de la aplicación. La lentitud procedía de la conexión hacia el dedicado. Una vez la conexión abierta todo iba perfecto.

Para arreglarlo he usado el patron singleton que consiste en realizar una unica instancia de una clase para todo el tiempo de ejecución del programa.

Por si os interesa:
http://codejavu.blogspot.com.es/2013/07/ejemplo-patron-singleton.html

Gracias por vuestra ayuda.

Saludos!

1

Usuarios habituales