Aplicação Swing acessando banco PostgreSQL pela WAN

0 respostas
erico_kl

Olá!
Na minha empresa tenho aplicações swing acessando o banco de dados que está no nosso servidor (ubuntu server 10.04, PostgreSQL 8.4) pela WAN. Gostaria de saber do pessoal mais experiente se o que a gente está fazendo é correto (pois só mudamos de localhost pro nosso ip dinâmico, mas as classes e o modo de conexão ficou o mesmo).
Nossa estrutura está organizada no padrão MVC e DAO. Vou mostrar como está nossa arquitetura:

Digamos que eu tenha um cadastro de produtos (com 3 campos, somente para demonstração), na nossa estrutura seria assim:

Classe Produto, pacote business:
package business;

public class Produto {

	private long codigo;
	private String descricao;
	private double precoVenda;
	
	public Produto() {

	}
	
	public Produto(long codigo, String descricao, double precoVenda) {
		super();
		this.codigo = codigo;
		this.descricao = descricao;
		this.precoVenda = precoVenda;
	}

	//getters e setters...
	
}
Classe ConnectionManager (que gerencia conexão através de um arquivo properties), pacote database.control:
package database.control;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class ConnectionManager {

	public static final String CONFIG = "database.properties";
	public static final String URL = ".url";
	public static final String USER = ".user";
	public static final String PASSWORD = ".password";
	public static final String DRIVER = ".driver";
	public static final String DEFAULT_DB = "default.database";
	private static Properties properties;
	
	public ConnectionManager() {
		loadProperties();
		try {
			Class.forName(getValue(DRIVER));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	private static void loadProperties() {
		if (properties==null) {
			properties = new Properties();
		}
		try {
			properties.load(ConnectionManager.class.getResourceAsStream(CONFIG));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static String getDefaultDatabase() {
		loadProperties();
		return properties.getProperty(DEFAULT_DB);
	}
	
	private static String getValue(String key) {
		return properties.getProperty(
				getDefaultDatabase()+key);
	}
	
	public Connection getConnection() {
		String url = getValue(URL);
		String user = getValue(USER);
		String password = getValue(PASSWORD);
		try {
			return DriverManager.getConnection(url, user,
					password);
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public void releaseConnection(Connection con) {
		if (con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
				con = null;
			}
		}
	}
	
}
Arquivo database.properties:
default.database = postgresql

postgresql.url = jdbc:postgresql://IP_DO_SERVIDOR_NA_WAN:5432/banco
postgresql.user = postgres
postgresql.password = postgres
postgresql.driver = org.postgresql.Driver
Classe SQLManager (que gerencia as SQLs que também estão num arquivo properties), pacote database.control:
package database.control;

import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

public class SQLManager {

	public static final String SQL = "sql.properties";
	private static Properties properties;
	private ConnectionManager connectionManager = 
		new ConnectionManager();

	public SQLManager() {
		loadProperties();
	}

	private static void loadProperties() {
		if (properties == null) {
			properties = new Properties();
		}
		try {
			properties.load(SQLManager.class.getResourceAsStream(SQL));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static String getSQL (String key) {
		return properties.getProperty(ConnectionManager
				.getDefaultDatabase()+key);
	}

	public PreparedStatement getPreparedStatement(String sql) {
		try {
			return connectionManager.getConnection().prepareStatement(
					getSQL(sql));
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

	public void releasePreparedStatement(PreparedStatement ppst) {
		if (ppst != null) {
			try {
				connectionManager.releaseConnection(
						ppst.getConnection());
				ppst.close();
			}catch (SQLException e) {
				e.printStackTrace();
				ppst = null;
			}
		}
	}

}
Arquivo sql.properties:
postgresql.add.produto = insert into produtos (idprodutos, descricao, precovenda) values ((select nextval('produtos_seq')), ?, ?)
postgresql.update.produto = update produtos set descricao = ?, precovenda = ? where idprodutos = ?
postgresql.delete.produto = delete from produtos where idprodutos = ?
postgresql.get.produto.codigo = select * from produtos where idprodutos = ?
postgresql.get.produto.descricao = select * from produtos where descricao like ? order by descricao
Interface ProdutoService, pacote service:
package service;

import java.util.List;

import business.Produto;

public interface ProdutoService {

	boolean add (Produto produto);
	boolean update (Produto produto);
	boolean delete (Produto produto);
	Produto get (long codigo);
	List<Produto> get (String descricao);
	
}
Interface ProdutoDAO, pacote database (somente herda ProdutoService):
package database;

import service.ProdutoService;

public interface ProdutoDAO extends ProdutoService {

}
Classe ProdutoDAOImpl (implementa ProdutoDAO usando as classes de conexão), pacote database:
package database;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import database.control.SQLManager;

import business.Produto;

public class ProdutoDAOImpl implements ProdutoDAO {

	public static final String ADD = ".add.produto";
	public static final String UPDATE = ".update.produto";
	public static final String DELETE = ".delete.produto";
	public static final String GET_CODIGO = ".get.produto.codigo";
	public static final String GET_DESCRICAO = ".get.produto.descricao";
	private SQLManager sqlManager = new SQLManager();
	
	public boolean add(Produto produto) {
		PreparedStatement ppst = sqlManager.getPreparedStatement(ADD);
		try {
			ppst.setString(1, produto.getDescricao());
			ppst.setDouble(2, produto.getPrecoVenda());
			return (ppst.executeUpdate() == 1)? true : false;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			sqlManager.releasePreparedStatement(ppst);
		}
	}

	public boolean update(Produto produto) {
		PreparedStatement ppst = sqlManager.getPreparedStatement(UPDATE);
		try {
			ppst.setString(1, produto.getDescricao());
			ppst.setDouble(2, produto.getPrecoVenda());
			ppst.setLong(3, produto.getCodigo());
			return (ppst.executeUpdate()==1)? true: false;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			sqlManager.releasePreparedStatement(ppst);
		}
	}

	public boolean delete(Produto produto) {
		PreparedStatement ppst = sqlManager.getPreparedStatement(DELETE);
		try {
			ppst.setLong(1, produto.getCodigo());
			return (ppst.executeUpdate()==1)? true: false;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			sqlManager.releasePreparedStatement(ppst);
		}
		
	}

	public Produto get(long codigo) {
		PreparedStatement ppst = sqlManager.getPreparedStatement(GET_CODIGO);
		Produto produto = null;
		try {
			ppst.setLong(1, codigo);
			ResultSet rs = ppst.executeQuery();
			if (rs.next()) {
				produto = new Produto(rs.getLong(1),
						rs.getString(2), rs.getDouble(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			sqlManager.releasePreparedStatement(ppst);
		}
		return produto;
	}

	public List<Produto> get(String descricao) {
		PreparedStatement ppst = sqlManager.getPreparedStatement(GET_DESCRICAO);
		List<Produto> produtos = new ArrayList<Produto>();
		try {
			ppst.setString(1, "%"+descricao+"%");
			ResultSet rs = ppst.executeQuery();
			while (rs.next()) {
				Produto produto = new Produto(rs.getLong(1),
						rs.getString(2), rs.getDouble(3));
				produtos.add(produto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			sqlManager.releasePreparedStatement(ppst);
		}
		return produtos;
	}

}
Classe ProdutoServiceImpl (implementa diretamente ProdutoService somente fazendo as chamadas para a DAOImpl), pacote service:
package service;

import java.util.List;

import database.ProdutoDAOImpl;

import business.Produto;

public class ProdutoServiceImpl implements ProdutoService {

	public boolean add(Produto produto) {
		return new ProdutoDAOImpl().add(produto);
	}

	public boolean update(Produto produto) {
		return new ProdutoDAOImpl().update(produto);
	}

	public boolean delete(Produto produto) {
		return new ProdutoDAOImpl().delete(produto);
	}

	public Produto get(long codigo) {
		return new ProdutoDAOImpl().get(codigo);
	}

	public List<Produto> get(String descricao) {
		return new ProdutoDAOImpl().get(descricao);
	}

}
E então um exemplo duma classe da view (obviamente simbólica):
package view;

//imports...

public class ProdutoView {
	private ProdutoServiceImpl psi = new ProdutoServiceImpl();

	public ProdutoView() {
		//Adicionando produto:
		Produto produto = new Produto(1, "FARINHA", 5.50);
		if (psi.add(produto)) {
			System.out.println("Produto adicionado");
		}
		//Buscando produto:
		Produto produtoDB = psi.get(1);
		...
	}
	
	public static void main(String[] args) {
		new ProdutoView();
	}

}

Gostaria de ver se isso que estamos fazendo é correto para conectar bom banco externo (via WAN)..
Desculpe pelo tamanho do post, mas estamos com problemas na empresa e precisamos ter certeza de que isso que estamos fazendo é certo, ou seja, para comprovarmos que esses problemas não acontecem por causa do sistema em si ou da forma que a conexão é feita nele..

Muito obrigado pela atenção de todos..

Criado 10 de outubro de 2010
Respostas 0
Participantes 1