[Resolvido] Apache derby (JavaDB) modo servidor

Desenvolvi uma aplicação que usa o Apache Derby (JavaDB)

Eu inicio o servidor do banco de dados pelo seguinte código:

try { //Seta a variável DERBY_HOME para o local que está o banco System.setProperty("derby.system.home", Dao.getProp().getProperty("caminhoDatabase")); //cria o objeto de controle do servidor NetworkServerControlImpl networkServer = new NetworkServerControlImpl(); //inicia o servidor networkServer.start(new PrintWriter(System.out)); //cria o EntityManagerFactory emf = Persistence.createEntityManagerFactory("AgendaPU"); } catch (Exception ex) { Alerta.mostra(ex.toString()); }

Quando uso comandos para pegar o host e a porta usada pelo banco ele retorna: localhost e 1527, e meu aplicativo abre normalmente, entretanto, eu só consigo abrir o programa em 1 computador por vez, ou seja, tenho que fechar o programa aberto em outro computador para poder abrir no atual.

Não sei se ajuda muito mas o parâmetros de conexão na aplicação são:

url: jdbc:derby://localhost:1527/agenda
driver: org.apache.derby.jdbc.ClientDriver

Como faço para abrir minha aplicação em 2 computadores ao mesmo tempo?

Estou supondo que é uma aplicação desktop (não web).

Quando você usa localhost, o jdbc tenta conectar na máquina local (a máquina onde está a aplicação). Na outra máquina (a que não tem o banco), você precisa colocar o ip da máquina que tem o banco no lugar de localhost. Exemplo:

Máquina que tem o banco: jdbc:derby://localhost:1527/agenda
Máquina que tem o banco: jdbc:derby://192.168.0.33:1527/agenda

O IP acima (192.168.0.33) é de exemplo. Você precisa usar o ip da máquina que tem o banco. E pode ser necessário configurar essa máquina para permitir o acesso (exemplo: liberar a pora 1527 no firewall).

Abraço.

Exatamente @TerraSkilll é uma aplicação Desktop.

Eu imaginei também que podia ser o localhost, então eu iniciei minha aplicação em na máquina 192.168.0.10, assim iniciando o servidor via código a partir dela. Depois iniciei o netbeans na máquina 192.168.0.20 e tentei criar a seguinte conexão:

jdbc:derby://192.168.0.10:1527/agenda

E também não deu certo… Teoricamente deveria dar certo… E ambas as máquinas conectam normalmente se iniciadas separadamente, nunca as duas ao mesmo tempo

Deu alguma mensagem de erro? Ou você está suprimindo as mensagens de erro? Verificou se a porta está liberada no firewall? O servidor de banco de dados (MySQL, Oracle, …) está configurado para aceitar conexões de fora?

Abraço.

As mensagens de erro se referem ao fxml (JavaFX) da minha classe principal mas essa mensagem só aparece quando tento iniciar as duas aplicações ao mesmo tempo, o erro é FXMLLoadException… Eu já rodei muito o google e não achei nada muito importante.

Eu gostaria de achar uma forma de saber se o servidor está rodando, eu tentei o comando getHost() do servidor e retorna localhost, e o comando getPort() retorna 1527, ou seja, parece estar funcionando do lado servidor, minha dificuldade é o lado cliente… Que mesmo tentando criar a conexão com o numero de ip e porta não aceita

Quanto ao banco de dados, ele é o Derby (JavaDB) que vem junto com o netbeans e até onde eu sei ao usar o driver “Embedded” ele cria uma conexão embarcada, e ao usar o driver “ClientDriver” ele aceita múltiplas conexões, e eu estou usando o ClientDriver e até agora nada =(

Depois de muito googlar achei a solução pro meu problema.

1º - Eu realmente estava iniciando o servidor corretamente com o código:

try {
//Seta a variável DERBY_HOME para o local que está o banco
System.setProperty(“derby.system.home”, Dao.getProp().getProperty(“caminhoDatabase”));
//cria o objeto de controle do servidor
NetworkServerControlImpl networkServer = new NetworkServerControlImpl();
//inicia o servidor
networkServer.start(new PrintWriter(System.out));
//cria o EntityManagerFactory
emf = Persistence.createEntityManagerFactory(“AgendaPU”);
} catch (Exception ex) {
Alerta.mostra(ex.toString());
}

Entretanto, o servidor do apache derby por motivos de segurança aceita somente requisições do localhost, então a linha acima só permitia conexões do computador que tinha o servidor, e para liberar para outras interfaces (computadores), ele deve ser iniciado via linha de comando com o parametro -h apontando para 0.0.0.0, para isso vá até a pasta bin de onde o derby foi instalado (ou extraido) - quem usa o do netbeans mesmo fica em c:/arquivos de programas/glassfish/javadb/bin, segura shift e clica com o botão direito do mouse e pede para abrir uma janela de comando ali… e escreve a linha abaixo:

startNetworkServer -h 0.0.0.0

Pronto! ele agora aceitará conexões de outros computadores na rede.

Eu gostaria muito de descobrir como fazer isso via código usando a API NetworkServer se alguém souber seria de grande ajuda.

2 curtidas