Re: memory management
- From: Thomas Kellerer <YQDHXVLMUBXG@xxxxxxxxxxxxx>
- Date: Wed, 31 Oct 2007 11:32:14 +0100
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).
Thomas
.
- Follow-Ups:
- Re: memory management
- From: Ingo Menger
- Re: memory management
- From: josh
- Re: memory management
- References:
- memory management
- From: josh
- Re: memory management
- From: Thomas Kellerer
- Re: memory management
- From: josh
- memory management
- Prev by Date: Re: [OT]
- Next by Date: Re: How to limit and change CPU and memory of a thread?
- Previous by thread: Re: memory management
- Next by thread: Re: memory management
- Index(es):
Relevant Pages
|