Estou executando um programa Java composto por um projeto Java Eclipse (Mars.2) que requer a inserção de dados em um banco de dados baseado no MySQL. Quando eu o executo em uma máquina virtual de 32 bits rodando o Ubuntu 14.04 LTS que tem o mysql 5.5.55 instalado, ele roda sem nenhum problema.
No entanto, quando tento portar o projeto para um host (não uma máquina virtual) de 64 bits, tem o Eclipse Oxygen.1 e executa a mesma distribuição do Ubuntu e o mysql 5.5.58 instalado (eu tinha 5.5.57 instalado anteriormente, mas o problema permanece o mesmo) Eu recebo a seguinte exceção:
Exception in thread "Thread-2" java.lang.StackOverflowError
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
Meu palpite é que a exceção StackOverflow é devido a tentar estabelecer conexões com o banco de dados por muitas vezes, então acredito que isso está acontecendo porque há alguma falha na conectividade com o banco de dados.
O arquivo de configuração my.cnf
é exatamente o mesmo em ambas as máquinas (não preciso alterar nenhum IP porque estou usando a interface de loopback em ambos os casos), portanto, presumo que isso não esteja relacionado a isso. Além disso, o código que estou usando é exatamente o mesmo em ambos os casos. Alguém tem uma ideia do que poderia estar acontecendo?
ATUALIZAÇÃO: Tomei várias ações para resolver esse problema, mas nenhuma delas funcionou. Entre eles, executei com sucesso o exemplo descrito no link em ambas as máquinas, o que me faz pensar que esse problema não é por causa do conector JDBC (ambos funcionaram bem, apesar de serem versões diferentes; eles são adicionados ao caminho de construção no Eclipse), as diferenças do sistema operacional, o próprio banco de dados (verifiquei o conteúdo de vários colunas no exemplo e aquele que eu estou usando e eles são os mesmos) ou a versão do servidor MySQL (uma máquina tem 5.5.55 e 64 bits quando o problema acontece é 5.5.58, mas ambos funcionam bem) .
No entanto, notei que, se eu excluir completamente o banco de dados (executando DROP DATABASE mydatabase) em ambas as máquinas, obtenho resultados diferentes. Naquele em que funciona, obtenho uma exceção dizendo que o banco de dados ao qual estou tentando me conectar é desconhecido (faz sentido), enquanto a outra máquina fornece exatamente a mesma exceção, como se o banco de dados nunca tivesse existido. Isso também acontece se eu alterar o nome do banco de dados para um que não existe de propósito (a máquina em funcionamento diz que é desconhecido, a máquina que não trabalha lança a mesma exceção). Poderia ser um problema relacionado às permissões que o Eclipse tem em uma das máquinas?