Pessoal tenho um pequeno app que conecta no Oracle, faz um laço for e vai inserindo dados no banco, após ele faz um close() para fechar a conexão. O DBA da minha empresa está reclamando que enquanto estou executando o app fico com muitas conexões no banco, se eu abrir e fechar a cada conexão no laço for o app fica muito lento, tem algum meio de por exemplo montar vários insert´s e fazer um commit de uma só vez no final para evitar ficar com muitas conexões no banco?
vc deve estar abrindo um monte de conexões!!! posta o codigo ae!!
Velho, use a execucao a execucao em batch fornecido pelo preparedstatement.
for(int i=0;i<100;i++){
ps.addBatch(sql);
}
ps.executeBatch();
Alberto
Olha o meu código ae:
package controleweb;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import jxl.Cell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
/**
*
* @author petter
*/
public class Recebidos {
private static Connection conn;
private static int i = 0;
private static String stringa1;
private static String stringb2;
private static double douc3;
private static String stringd4;
private static String stringe5;
private static String stringf6;
private static String stringg7;
private static String stringh8;
private static String stringi9;
private static String stringj10;
private static String stringl11;
private static int intm12;
private static int resultado;
private static String normalizeIP;
private static int rs2;
private static int rs3;
public static String normalizeIP (String ip) throws UnknownHostException {
InetAddress addr = InetAddress.getByName (ip);
return addr.getHostAddress();
}
/**
* Creates a new instance of Enviados
*/
public static void main(String[] args ) throws IOException, BiffException,
ClassNotFoundException, SQLException {
//Dados para a conexão ao banco de dados
String driverName = "oracle.jdbc.driver.OracleDriver";
String serverName = "server";
String username = "user";
String password = "senha";
String url = "jdbc:oracle:thin:@"+serverName ;
//Conexão com o banco de dados
Class.forName(driverName);
Connection conn = DriverManager.getConnection(url, username, password);
//Pega o último valor do campo ID para auto-incremento
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("select max(ECO_ID) eco_id from email_controle");
while(rs.next()){
rs2 = rs.getInt("eco_id");
}
/* pega o arquivo do Excel */
Workbook workbook = Workbook.getWorkbook(new File("recebidos.xls"));
/* pega a primeira planilha dentro do arquivo XLS */
Sheet sheet = workbook.getSheet(0);
//Pega a quantidade de linhas da planilha
int linhas = sheet.getRows();
//Laço para fazer o looping para gravar todas as linhas da planilha
for(i = 0; i < linhas; i++){
/*Abre novamente a conexão*/
Class.forName(driverName);
conn = DriverManager.getConnection(url, username, password);
//Inicia o processamento das linhas com tratamento de exceção.
try{
/* pega os valores das células como se numa matriz */
Cell a1 = sheet.getCell(0,i);
Cell b2 = sheet.getCell(1,i);
Cell c3 = sheet.getCell(2,i);
Cell d4 = sheet.getCell(3,i);
Cell e5 = sheet.getCell(4,i);
Cell f6 = sheet.getCell(5,i);
Cell g7 = sheet.getCell(6,i);
Cell h8 = sheet.getCell(7,i);
Cell i9 = sheet.getCell(8,i);
Cell j10 = sheet.getCell(9,i);
Cell l11 = sheet.getCell(10,i);
/* pega os conteúdos das células */
stringa1 = a1.getContents();
stringb2 = b2.getContents();
NumberCell nc = (NumberCell) c3;
douc3 = nc.getValue();
int intc3;
intc3 = (int)douc3;
stringd4 = d4.getContents();
normalizeIP = normalizeIP (stringd4);
stringe5 = e5.getContents();
stringf6 = f6.getContents();
stringg7 = g7.getContents();
stringh8 = h8.getContents();
stringi9 = i9.getContents();
stringj10 = j10.getContents();
stringl11 = l11.getContents();
intm12 = 2;
//Incrementa o número da ID conforme o último registro pesquisado
if(rs2 < 1){
rs2 = 1;
}else{
rs2 = rs2 + 1;
System.out.println("Registro atual em gravação: " + i);
}
/*Executa o insert para inserir os dados no banco de testes MySQL*/
PreparedStatement ps = conn.prepareStatement("INSERT INTO EMAIL_CONTROLE(ECO_ID, ECO_DATA," +
" ECO_HORA, ECO_TAM, ECO_DE," +
" ECO_PARA, ECO_CC, " +
" ECO_ASSUNTO, ECO_ANEXO, ECT_ID," +
" ECO_IP) "+
" VALUES( ? , to_date( ? ,'DD/MM/YYYY'), ? , ? , ? , ? , ? , ? , ? , ? , ? )");
ps.setInt(1, rs2);
ps.setString(2, stringa1);
ps.setString(3, stringb2);
ps.setInt(4, intc3);
ps.setString(5, stringg7);
ps.setString(6, stringh8);
ps.setString(7, stringi9);
ps.setString(8, stringj10);
ps.setString(9, stringl11);
ps.setInt(10, intm12);
ps.setString(11, normalizeIP);
ps.addBatch();
//Executa o INSERT.
ps.executeBatch();
//Exception para tratar o limite de cursores abertos.
}catch(java.sql.BatchUpdateException bue){
bue.printStackTrace();
System.out.println("Limite de cursores máximos atingido. Limpando...");
conn.close();
conn = DriverManager.getConnection(url, username, password);
//Exception para tratar campos com dados inválidos.
}catch(java.lang.ClassCastException cce){
cce.printStackTrace();
System.out.println("O campo " + i + " está com o formato inválido!");
System.out.println("Exceção gerada, passando para o próximo registro.");
}
//Fecha o laço For
}
conn.close();
workbook.close();
rs3 = rs2 + i;
//Gera mensagens com dados sobre a atualização do banco
if(linhas == i){
System.out.println("*************************************************************");
System.out.println("****** Atualização de utilização de e-mail (recebidos) ******");
System.out.println("*************************************************************");
System.out.println("Banco de dados atualizado referente ao dia " + stringa1 + ".");
System.out.println("Total de registros gravados: " + linhas + ".");
System.out.println("Registros ID gravados de " + rs2 + " até " + rs3);
System.out.println("Aplicativo finalizado !");
System.out.println("");
}
}
}
aqui esta o problema:
//Laço para fazer o looping para gravar todas as linhas da planilha
for(i = 0; i < linhas; i++){
/*Abre novamente a conexão*/
Class.forName(driverName); <== Praque abrir outra conexao???
conn = DriverManager.getConnection(url, username, password);
pra que vc esta abrindo outra conexao a cada loop???
no “maximo” vc poderia criar uma conn2 do lado de fora do loop e usar ela para fazer o insert, mas nem isso precisaria, usa a primeira conn que tu abriu la em cima experimenta fazer assim:
for(i = 0; i < linhas; i++){
/*Abre novamente a conexão*/
// Class.forName(driverName);
// conn = DriverManager.getConnection(url, username, password); remove isso dai
//
//Inicia o processamento das linhas com tratamento de exceção.
try{
Vixi que mancada a minha, esse trecho era para ter sido removido, agora está tudo explicado. Valeu.