[RESOLVIDO] Lentidão com Hibernate + Java + Swing + MySQL remoto

Anos atrás eu cheguei a desenvolver um projeto usando o Java + Swing (desktop) e o MySQL remoto, que usa uma hospedagem. No caso acabei escolhendo o Hibernate, mas uma coisa esquisita que eu vejo e que, quando eu executava o projeto pelo Eclipse, ele ia rápido, mas na versão compilada (em .jar) ele ficava muito lento pra conectar no banco de dados e pra fazer download de dados, ainda mais por conta do Hibernate gerar muitas linhas por conta das referências entre as tabelas.

Alguém já passou por isso? Eu conseguiria ter alguma solução pra isso? Pq que no Eclipse acaba indo mais rápido, é questão de multi-thread? Eu to cogitando re-desenvolver tudo do zero em web com javascript, mas eu não to tendo mais tempo disponível e acabei saindo da área de desenvolvimento de software, aí não sei bem qual rumo devo tomar.

É uma situação muito complicada para se analisar sem maiores dados.
Conexões remotas, em geral, podem ter comportamentos inesperados.
A questão é: você roda essa aplicação local ou é uma aplicação distribuída?
Além disso, quais testes você realizou, para definir que o problema está com o hibernate e a geração de muitas linhas de código?
No meu ponto de vista: o fato do hibernate cuspir logs (está com a propriedade para expor as queries setada como true) não vai interferir nisso, salvo se o volume de dados a ser processado for muito grande.
Segundo ponto: crie um benchmark, defina logs com horários e identifique o comportamento no teu ambiente de dev (eclipse) e o que usa efetivamente (prod).

No caso é um executável jar que roda local, mas apenas acessando uma base de dados remota,que está em um servidor cloud. Ele demora em torno de 3 segundos pra conectar dentro do Eclipse (em ambiente de desenvolvimento) e 1 minuto no software compilado.

Segue abaixo as minhas configurações do Hibernate:

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="preferredTestQuery">SELECT 1</property>    
<property name="temp.use_jdbc_metadata_defaults">false</property>		
<property name="hibernate.show_sql">true</property>	

A classe de conexão:

public class HibernateConexao {
	private static SessionFactory sessionFactory;
	private static ServiceRegistry serviceRegistry;

	static {
		try {
			// Configuration configuration = new Configuration();
			Configuration conf = new Configuration().configure();
			
			String userBanco = Principal.userConexaoBanco;
			String senhaBanco = Principal.senhaConexaoBanco;
			
			conf.configure("/conexaoMySQL/hibernate.cfg.xml")
			.setProperty(
					"hibernate.connection.url",
					"jdbc:mysql://"
							+ Principal.hostConexao + ":3306/" + Principal.nomeBancoAcesso)
			.setProperty("hibernate.connection.username", userBanco)
			.setProperty("hibernate.connection.password", senhaBanco)
			.setProperty("hibernate.hbm2ddl.auto", Funcoes.tipoAtualizacao);
			//.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");

			serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
					conf.getProperties()).build();
			sessionFactory = conf.buildSessionFactory(serviceRegistry);

		} catch (HibernateException he) {
			Funcoes.exibeCaixa("Erro", "Erro ao iniciar o sistema",
					Funcoes.logThrowable(he), JanelaMSG.MSG_ERROR_MESSAGE, 700,
					600);
			throw new ExceptionInInitializerError(he);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

A versão do Hibernate é a 5.0. Cheguei a tentar uma vez trocar pra 6.0, mas comecei a ter muitos problemas de conexão e acabei abortando essa tentativa de trocas.

Acho que achei o problema (o que ainda me assombra pq eu nunca tinha pensado nisso até achar uma solução num fórum hoje, depois de muito tempo tretado). Eu reempacotei o jar com as libs (commons, o driver de conexão, o hibernate e etc) todas separadas em uma pasta individual, e antes eu juntava tudo num único jar para fins de atualização automática. E consegui ganhar velocidade de conexão.

No lugar de “Package required libraries into generated JAR” eu escolhi “Copy required libraries into a sub-folder next to the generated JAR”, na hora de exportar no Eclipse. Vou botar como resolvido por hora!