Caro colegas,
Estou com uma dúvida que parece simples, aonde fechar a conexão com o banco de dados, mas não estou sabendo aonde fazer para ter uma "execução mais otimizada". Condições:
-
JDBC puro sem JPA, ou qualquer framework ORM;
-
sem pool de conexões;
-
aplicação desktop, mas com divisão de camadas;
Tenho um fabrica de conexões que pode criar uma conexão com dois schemas distintos no MySQL e cada DAO sabe que conexão precisa (schemas). Usando esses DAOs tenho um Service que executa a leitura de um arquivo TXT, podendo ter de 1 a milhares de linhas, e as salva no MySQL. Não estou sabendo aonde fechar a conexão para caso for inserir uma linha ele feche após essa linha inserida, mas se for inserir 1000 linhas ele somente feche a conexão após as 1000 linhas inseridas (não fechando a cada linha inserida).
Abaixo segue o código:
Principal
import service.LancamentoPatronalService;
public class Principal
{
public static void main(String args[])
{
LancamentoPatronalService lancamentoPatronalService = new LancamentoPatronalService();
lancamentoPatronalService.importarArquivoPatronal("C:/Users/marcelo.magalhaes/OneDrive/Desenvolvimento/workspace/Rateio/src/patronal.csv");
}
}
Service
package service;
/*
* Classe de serviços para os lançamentos patronais
* @author Marcelo Magalhães
* @version 0.1
*/
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import dao.LancamentoCustoDAO;
import model.LancamentoCusto;
import model.LancamentoPatronal;
public class LancamentoPatronalService
{
LancamentoCustoDAO lancamentoCustoDAO;
public LancamentoPatronalService()
{
lancamentoCustoDAO = new LancamentoCustoDAO();
}
public void importarArquivoPatronal(String filePath)
{
FileInputStream file = null;
BufferedReader reader = null;
LancamentoCusto umLancamentoCusto = null;
Integer contador = 0;
try
{
file = new FileInputStream(filePath);
reader = new BufferedReader(new InputStreamReader(file));
umLancamentoCusto = new LancamentoPatronal();
String line = reader.readLine();
while (line != null)
{
String[] linhaCusto = line.split(";");
umLancamentoCusto.setCentroCusto(linhaCusto[0]); //centro de custo
umLancamentoCusto.setMatricula(linhaCusto[1]); //matricula
umLancamentoCusto.setCompetencia(linhaCusto[2]); //competencia
umLancamentoCusto.setCodigoEvento(linhaCusto[3]); //codigo do evento
umLancamentoCusto.setNomeEvento(linhaCusto[4]); //nome do evento
umLancamentoCusto.setValor(Double.parseDouble(linhaCusto[5].replace(',', '.'))); //valor
contador = contador + 1;
System.out.println("INSERINDO: " + umLancamentoCusto.toString());
lancamentoCustoDAO.inserir(umLancamentoCusto);
line = reader.readLine();
}
System.out.println("SYSTEM INFO: " + contador + " lançamento(s) de custo incluído(s) com sucesso");
}
catch (FileNotFoundException e)
{
System.err.println("SYSTEM ERROR: Arquivo não encontrado");
e.printStackTrace();
}
catch (IOException e)
{
System.err.println("SYSTEM ERROR: Erro na leitura do arquivo");
e.printStackTrace();
}
finally
{
try
{
reader.close();
file.close();
}
catch (IOException e)
{
System.err.println("SYSTEM ERROR: Falha no fechamento do arquivo");
e.printStackTrace();
}
}
}
}
DAO
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import dao.JDBCConnectionFactory.DATABASE;
import model.LancamentoCusto;
public class LancamentoCustoDAO
{
private String INSERT_QUERY = "INSERT INTO rateio.custo (tipo, centroCusto, matricula, competencia, codigoEvento, nomeEvento, valor) values (?, ?, ?, ?, ?, ?, ?)";
private Connection connection = null;
private PreparedStatement preparedStatement = null;
public LancamentoCustoDAO()
{
connection = JDBCConnectionFactory.getConnection(DATABASE.RATEIO);
}
public void inserir(LancamentoCusto umLancamentoCusto)
{
try
{
preparedStatement = connection.prepareStatement(INSERT_QUERY);
preparedStatement.setString(1, umLancamentoCusto.getTipo().name()); //tipo
preparedStatement.setString(2, umLancamentoCusto.getCentroCusto()); //centro de custo
preparedStatement.setString(3, umLancamentoCusto.getMatricula()); //matricula
preparedStatement.setString(4, umLancamentoCusto.getCompetencia()); //competencia
preparedStatement.setString(5, umLancamentoCusto.getCodigoEvento()); //codigo do evento
preparedStatement.setString(6, umLancamentoCusto.getNomeEvento()); //nome do evento
preparedStatement.setDouble(7, umLancamentoCusto.getValor()); //valor
preparedStatement.execute();
}
catch (SQLException e)
{
System.err.println("SYSTEM ERROR: Falha na inserção de lançamento");
e.printStackTrace();
}
}
}
Fábrica
package dao;
/*
* @desc Classe para conexão com o banco de dado MySQL
* @author Marcelo Magalhães
* @version 0.1
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCConnectionFactory
{
public enum DATABASE
{
RATEIO, AHT
};
private static String driverName;
private static String serverName;
private static String url;
private static String databaseRateio;
private static String usernameRateio;
private static String passwordRateio;
private static String databaseAHT;
private static String usernameAHT;
private static String passwordAHT;
private static Connection connection = null;
static
{
Properties props = new Properties();
System.out.println("SYSTEM INFO: Obtendo as propriedades de conexão com o banco de dados");
try
{
FileInputStream fileInputStream = new FileInputStream("src/dao/db.properties");
props.load(fileInputStream);
fileInputStream.close();
System.out.println("SYSTEM INFO: Propriedades de conexão com o banco de dados obtidas");
}
catch (FileNotFoundException e)
{
System.err.println("SYSTEM ERROR: Arquivo de propriedades de conexão com o bando de dados não encontrado");
e.printStackTrace();
}
catch (IOException e)
{
System.err.println("SYSTEM ERROR: Erro na leitura do arquivo de propriedades de conexão com o bando de dados");
e.printStackTrace();
}
// DB common configurations for MySQL
driverName = props.getProperty("jdbc.driverName");
serverName = props.getProperty("jdbc.serverName");
url = props.getProperty("jdbc.url");
// RATEIO database configurations
databaseRateio = props.getProperty("jdbc.database.rateio");
usernameRateio = props.getProperty("jdbc.username.rateio");
passwordRateio = props.getProperty("jdbc.password.rateio");
// AHT database configurations
databaseAHT = props.getProperty("jdbc.database.aht");
usernameAHT = props.getProperty("jdbc.username.aht");
passwordAHT = props.getProperty("jdbc.password.aht");
//url = url + serverName + "/" + databaseRateio;
System.out.println("SYSTEM INFO: Registrando driver JDBC");
try
{
Class.forName(driverName);
System.out.println("SYSTEM INFO: Driver JDBC registrado com sucesso");
}
catch (ClassNotFoundException e)
{
System.err.println("SYSTEM ERROR: Falha no registro do driver JDBC");
e.printStackTrace();
}
}
public static Connection getConnection(DATABASE database)
{
try
{
System.out.println("SYSTEM INFO: Abrindo conexão com o banco de dados");
if (database.equals(DATABASE.RATEIO))
{
url = url + serverName + "/" + databaseRateio;
connection = DriverManager.getConnection(url, usernameRateio, passwordRateio);
}
if (database.equals(DATABASE.AHT))
{
url = url + serverName + "/" + databaseAHT;
connection = DriverManager.getConnection(url, usernameAHT, passwordAHT);
}
System.out.println("SYSTEM INFO: Conexão com o banco de dados aberta com sucesso");
}
catch (SQLException e)
{
System.err.println("SYSTEM ERROR: Falha na abertura da conexão");
e.printStackTrace();
}
return connection;
}
public static void closeConnection(DATABASE database)
{
try
{
JDBCConnectionFactory.getConnection(database).close();
System.out.println("SYSTEM INFO: Conexão com o banco de dados fechada com sucesso");
}
catch (SQLException e)
{
System.err.println("SYSTEM ERROR: Falha no fechamento da conexão");
e.printStackTrace();
}
}
}
Vida longa e próspera,
Marcelo Magalhães