[b]Amigos,
Quando o código abaixo é executado, com muitos registros (131000) da erro de memória. Existe algum erro no código?
Alguem pode me ajudar?
Abração…
private void extracao(String dsExt, String dsTab, String dsAtribs){
String dsSqlCarga = new String();
String dsValores = new String();
String conCarga = new String();
int nrCol, ttAtributo;
ResultSet rs = null;
try {
rs = conOperacional.selecionar(dsExt);
ttAtributo = rs.getMetaData().getColumnCount();
while (rs.next()) {
nrCol = 1;
dsValores = " ";
while (nrCol <= ttAtributo) {
dsValores = dsValores + "'" + rs.getString(nrCol) + "'";
if (nrCol < ttAtributo)
dsValores = dsValores + ", ";
nrCol ++;
}
dsSqlCarga = " insert into " + dsTab + " (" + dsAtribs + ") values (" + dsValores + ") ";
carga(dsSqlCarga);
}
} catch (Exception e) {
e.printStackTrace();
}
JOptionPane.showMessageDialog(null, "Carga executada!", "Informação", JOptionPane.INFORMATION_MESSAGE);
}
private void carga(String dsSql){
conDW.execultar( dsSql );
}
Para facilitar a leitura.
Não é o caso, mas você deve fechar o ResultSet.
private void extracao(String dsExt, String dsTab, String dsAtribs){
String dsSqlCarga = new String();
String dsValores = new String();
String conCarga = new String();
int nrCol, ttAtributo;
ResultSet rs = null;
try {
rs = conOperacional.selecionar(dsExt);
ttAtributo = rs.getMetaData().getColumnCount();
while (rs.next()) {
nrCol = 1;
dsValores = " ";
while (nrCol <= ttAtributo) {
dsValores = dsValores + "'" + rs.getString(nrCol) + "'";
if (nrCol < ttAtributo)
dsValores = dsValores + ", ";
nrCol ++;
}
dsSqlCarga = " insert into " + dsTab + " (" + dsAtribs + ") values (" + dsValores + ") ";
carga(dsSqlCarga);
}
} catch (Exception e) {
e.printStackTrace();
}
JOptionPane.showMessageDialog(null, "Carga executada!", "Informação", JOptionPane.INFORMATION_MESSAGE);
}
private void carga(String dsSql){
conDW.execultar( dsSql );
}
Estava tendo o mesmo problema… resolvi aumentando a memoria alocada pra JVM… atraves do comando:
java -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m -jar meu_programa.jar
Isso diz pra JVM alocar no minimo 512 megas na memoria e no máximo 1 giga…
Vc pode mudar esses parametros de acordo com sua necessidade…
thingol
Setembro 13, 2007, 10:36am
#4
Embora isto não faça absolutamente nenhuma diferença em termos de memória (não vai ser isso que vai lhe aliviar o problema), Java != VB, e não é aconselhável fazer isto que você fez:
String dsSqlCarga = new String();
String dsValores = new String();
String conCarga = new String();
O correto é usar isto:
String dsSqlCarga = "";
String dsValores = "";
String conCarga = "";
Não conheço casos em que seja necessário usar “new String()” para criar uma string vazia.
Outra sugestão é usar StringBuffer na variável dsSqlCarga.
Os comandos SQL (inserts no seu caso) são concatenados e , terminada a carga, um lote de processamentos (batch ) é executado de uma vez só. Mas isso vai depender da sua implementação no banco.
Valeu moçada… brigadao mesmo