Base de Dados Acessível através da Internet

8 respostas
rolipam

Olá Pessoal,

Estou desenvolvendo uma aplicação em que o cliente me solicitou que a base de dados ficasse acessível através da intenet para que ele pudesse instalar a aplicação em 2 notebooks, um deles funcionando como servidor (em que a aplicação continuaria acessando a base de dados localhost) e o outro (se ambos estiverem conectados à internet) pudesse acessar a mesma base de dados, evitando assim redundância. Qual a melhor solução para essa implementação? Socket seria viável? Um colega meu, que lida com manutenção e redes sugeriu que eu instalasse o Hamachi em ambas as máquinas e criasse uma rede local “virtual” entre as máquinas. Dessa forma o IP de ambas ficaria Estático (independente do IP da conexão com a internet) e então eu poderia fazer o 2º note acessar o 1º através do IP dele na rede “virtual”. O que Vocês, que com certeza possuem muito mais experiência que eu, sugerem para o meu Problema? Valeu Galera do GUJ!

8 Respostas

jks1903

Cara, se entendi bem uma VPN resolveria teus problemas. Se em uma rede local você já consegue acessar a aplicação das duas máquinas, então nesse caso não seria necessário fazer uma alteração na aplicação, o teu problema seria apenas quanto a configuração da VPN. Existem alguns softwares e até mesmo recursos do próprio SO que permitem a configuração dessa forma, no Windows por exemplo até não é tão complicado de fazer. Dessa forma você acessaria a base de dados como se estivesse numa mesma rede local que o servidor da aplicação.

De repente tenta buscar algo em um forum de redes que eu acho que o pessoal lá pode te esclarecer melhor.

Flw.

rolipam

jks1903, Valeu pela Dica!!! Vou pesquisar mais sobre esses aplicativos e recursos do SO para configuração de VPN. Então, essa idéia de Socket foi realmente um “devaneio” da minha mente ou teria alguma aplicabilidade no meu caso?

jks1903

Depende. Se ambas as máquians estiverem em uma mesma rede, de forma que uma “enxergue” a outra, você consegue rodar a tua aplicação em ambas as máquinas? Caso sim, a única coisa a ser feita é configurar a VPN. Já caso não, aí tem que ver, se for apenas o banco de dados que deve ser acessível, aí sim, você deve liberar a porta que o banco utiliza em questão. Mas nesse caso, quando precisei fazer algo do tipo (pq atualmente trabalho mais com Web que é um pouco diferente em relação a isso) eu utilizei regras de firewall para controlar os acessos, visto que firewalls possuem basicamente essa utilidade.

Abs.

rolipam

Olá galera do GUJ tive uma idéia meio maluca para resolver meu problema. Transformei minha classe ConexaoBD em um formulário para o usuário digitar o IP do Servidor de banco de dados ao qual quer se conectar (achei interessante, pois se o cliente tiver várias filiais com seu próprio banco de dados cada, ele pode consultar cada base individualmente), e tornei-a a minha classe principal. Após o usuário digitar o IP do Servidor, até aparece a mensagem de “Conectado ao Banco de Dados!”, mas quando o método chama a tela principal, ocorre erro de conexão. Segue meu código.

import java.sql.*;
import javax.swing.JOptionPane;

/**
 *
 * @author RamiroPamponet
 */
public class ConexaoBD extends javax.swing.JFrame {
    
    Principal pri;

    final private String driver = "org.postgresql.Driver";
    private String url = "jdbc:postgresql://localhost:5432/fisio";;
  
    final private String usuario = "postgres";
    final private String senha = "123";
    Statement stm;
    ResultSet rs;
    private Connection con;

    /**
     * Creates new form Conexao
     */
    public ConexaoBD() {
        initComponents();
    }

    private void btConectarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        String IP = tfIP1.getText()+"."+tfIP2.getText()+"."+tfIP3.getText()+"."+tfIP4.getText();
        url = "jdbc:postgresql://" + IP + ":5432/fisio"; 
        // Salvar essa url em um arquivo externo. A cada nova Conexão Altera o Arquivo já salvo
        //JOptionPane.showMessageDialog(null, url);
        conecta();
        pri = new Principal();
        pri.setVisible(true);
        this.hide();
    }                                          

    public Connection conecta() {
        String IP = tfIP1.getText()+"."+tfIP2.getText()+"."+tfIP3.getText()+"."+tfIP4.getText();
        url = "jdbc:postgresql://" + IP + ":5432/fisio";
        try {
            Class.forName(driver);
            // Recuperar a url do Arquivo Salvo
            con = DriverManager.getConnection(url, usuario, senha);
            JOptionPane.showMessageDialog(null, "Conectado ao Banco de Dados!");

        } catch (ClassNotFoundException Driver) {
            JOptionPane.showMessageDialog(null, "Falha na Conexão com o Banco de Dados!");
        } catch (SQLException Fonte) {
            JOptionPane.showMessageDialog(null, "Erro de Conexão!");
        }
        return con;
    }

    public void desonecta() {
        boolean result = true;

        try {
            con.close();
            //JOptionPane.showMessageDialog(null, "Conexão Fechada!");
        } catch (SQLException erroSQL) {
            JOptionPane.showMessageDialog(null, "Não Foi Possíve Fechar o Banco de Dados!");
            result = false;
        }

    }

    public void executeSQL(String sql) {
        try {
            stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = stm.executeQuery(sql);


        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Executar o Comando!");
            ex.printStackTrace();
        }
    }

Tive até uma idéia e cheguei a comentar no código, sobre salvar a url, com o IP digitado pelo usuário, em um arquivo externo e depois recuperá-lo, mas não sei lidar bem com I/O (o que parece até estranho, já que não tive problemas em aprender jdbc, mas acho I/O mais complexo). Ou até mesmo, se tiver alguma forma de armazenar as variáveis IP e url de forma a ficarem disponíveis para toda a aplicação, mesmo depois da tela de Conexão ser fechada. Aguardo qualquer sugestão! Mais uma vez, Obrigado a todos!

rolipam

Olá Galera! Tive mais uma idéia “insana” e criei um ConexaoBean. Quando conecto à base de dados, passo o valor do IP para o Bean

ConexaoBean cb = new ConexaoBean();
cb.setIP(IP);

e quando a tela principal faz a chamada ao método conecta(), passo o valor conforme o código abaixo

ConexaoBean cb = new ConexaoBean();
url = "jdbc://postgresql/" + cb.getIP() + ":5432/fisio";

só que cb.getIP() me retorna null. Estou sentindo que estou chegando cada vez mais perto, mas não estou conseguindo enxergar meu erro! Alguém por favor me dá uma LUZ!

justhyno

Melhor seria se Colasses o código da classe ConexaoBean().

rolipam

A classe ConexaoBean é um JavaBean com os métodos públicos getIp e setIp, onde ip é declarado como uma String private.

rolipam

Problema Resolvido, em parte! Consigo acessar a minha base de dados a partir de qualquer computador conectado à internet.

Gostaria de saber agora, como fazer o backup local de uma base de dados remota. É possível? Atualmente meu backup é realizado por um arquivo de lotes, externo ao programa principal, mas como vou precisar passar pro comando de backup o ip onde o banco de dados está instalado, vou ter que passar o código do backup para dentro do sistema. Estou aceitando ajuda e sugestões.

Criado 21 de agosto de 2012
Ultima resposta 28 de ago. de 2012
Respostas 8
Participantes 3