Re: memory management
- From: Ingo Menger <quetzalcotl@xxxxxxxxxxxxxx>
- Date: Wed, 31 Oct 2007 03:55:56 -0700
On 31 Okt., 11:32, Thomas Kellerer <YQDHXVLMU...@xxxxxxxxxxxxx> wrote:
josh, 31.10.2007 11:14:
On 31 Ott, 10:56, Thomas Kellerer <YQDHXVLMU...@xxxxxxxxxxxxx> wrote:
josh, 31.10.2007 10:22:
Hi, I have the following problem:My guess is that you are buffering the retrieved rows somehow (or
in a while loop I get from a db some records and in the same time
I put them with an insert preparedStatement in
a destination db but the jave process increase the memory until it
goes in out of memory.
How can I optimize that? also If I increase Tomcat java memory when I
process more than 500 records
tha java memory is already at 700mb of usage!
keeping references to them). You will need to show us your code.
Thomas
ok I post the code:
st_from = conn.createStatement();
rs_from = st_from.executeQuery(query_from);
ps_into = conn_t.prepareStatement(insert_into);
int i_out_record = 0;
int i_in_record = 0;
while(rs_from.next())
{
i_out_record++;
out_record += "SELECT su record (" + i_out_record + ")";
in_record += "INSERT su record (";
row_error = rs_from.getString(campi_from[0]); // se errore su quale
id
for(int i=0; i < campi_from.length; i++)
{
out_record += campi_from[i] + "=" +
rs_from.getString(campi_from[i]) + "::" ;
ps_into.setString(i+1, rs_from.getString(campi_from[i])); //
prepara l'insert
in_values += campi_to[i] + "=" + rs_from.getString(campi_from[i])
+ "::" ;
}
out_record = out_record.substring(0, out_record.length()-2); //
tolgo il cancelletto finale
int res = ps_into.executeUpdate();
if(res != 0)
{
i_in_record++;
in_record += i_in_record + ")" + in_values;
// chiudi la statement
//ps_into.close();
}
out_record += "\n";
in_record += "\n";
/*
if(i_out_record > 10)
break;
*/
}
String log = "Per la tabella origine " + tabellaFrom + " processati
in uscita record: " + i_out_record + "\n";
log += "Per la tabella destinazione " + tabellaTo + " processati in
entrata record: " + i_in_record + "\n";
log += "-----------------------------------------------------------
\n";
log += out_record + in_record;
//out.print(st);
out.print(log);
After a quick look, I'd say the following lines are your problem:
>out_record += "SELECT su record (" + i_out_record + ")";
>in_record += "INSERT su record (";
>in_record += i_in_record + ")" + in_values;
As far as I can tell, this will create huge strings with the complete
result set, as they are declared outside the loop (actually twice the
result set because one for the out_Record and one for the in_record).
Actually 4-fold, since at the end he does:
log += out_record + in_record;
//out.print(st);
out.print(log);
Just changing this will save 50% memory:
out.print(out_record);
out.print(in_record);
But, of course, the out_record and in_record logging is totally bad.
First, avoid + on strings. Use a StringBuilder instead.
If this doesn't solve the problem, write the out_record and in_record
directly to a file. For example, through a PrintWriter.
.
- Follow-Ups:
- Re: memory management
- From: Lew
- Re: memory management
- References:
- memory management
- From: josh
- Re: memory management
- From: Thomas Kellerer
- Re: memory management
- From: josh
- Re: memory management
- From: Thomas Kellerer
- memory management
- Prev by Date: OT: commons digester examples with subversion
- Next by Date: Re: REAL SSCCE of my graphical interface with memory leaks
- Previous by thread: Re: memory management
- Next by thread: Re: memory management
- Index(es):
Relevant Pages
|