Thread: Re: [GENERAL] JDBC and insert - stack overflow

Re: [GENERAL] JDBC and insert - stack overflow

From
Herouth Maoz
Date:
At 17:09 +0300 on 24/05/1999, Crispin Miller wrote:


> Hi,
> I am afraid I am a newbie. Forgive me if this is a silly question-
> I'm trying to create a large database using JDBC to load the tables by
> calling executeUpdate with the statement "SQL INSERT INTO" + tableName +
> " VALUES (" etc...

JDBC questions belong in the Interfaces list, where I have now redirected
this thread.

The proper way to perform inserts is using a PreparedStatement, like this:

PreparedStatement pstmt = con.prepareStatement(   "INSERT INTO my_table (num,str,dt) VALUES (?,?,?)"
);

Then you loop, and in each iteration you do:
  pstmt.setInt( 1, myIntVariable);  pstmt.setString( 2, myStringVariable);  pstmt.setDate( 3, mySQLDateVariable);
  int rowCount = pstmt.executeUpdate();

Try this method. I'm not sure it will solve your stack problems. Usually,
stack overflow is due to deep recursion. But once you use this, you should
be wasting less memory anyway.

By the way, use con.setAutoCommit( false ) to have all the inserts in one
big transaction. It saves a lot of time.

Herouth

--
Herouth Maoz, Internet developer.
Open University of Israel - Telem project
http://telem.openu.ac.il/~herutma




Re: [INTERFACES] Re: [GENERAL] JDBC and insert - stack overflow

From
Peter T Mount
Date:
On Tue, 25 May 1999, Herouth Maoz wrote:

> At 17:09 +0300 on 24/05/1999, Crispin Miller wrote:
> 
> 
> > Hi,
> > I am afraid I am a newbie. Forgive me if this is a silly question-
> > I'm trying to create a large database using JDBC to load the tables by
> > calling executeUpdate with the statement "SQL INSERT INTO" + tableName +
> > " VALUES (" etc...
> 
> JDBC questions belong in the Interfaces list, where I have now redirected
> this thread.
> 
> The proper way to perform inserts is using a PreparedStatement, like this:
> 
> PreparedStatement pstmt = con.prepareStatement(
>     "INSERT INTO my_table (num,str,dt) VALUES (?,?,?)"
> );
> 
> Then you loop, and in each iteration you do:
> 
>    pstmt.setInt( 1, myIntVariable);
>    pstmt.setString( 2, myStringVariable);
>    pstmt.setDate( 3, mySQLDateVariable);
> 
>    int rowCount = pstmt.executeUpdate();
> 
> Try this method. I'm not sure it will solve your stack problems. Usually,
> stack overflow is due to deep recursion. But once you use this, you should
> be wasting less memory anyway.

If at some point we can store the query plan when the prepared statement
is created, the updates will speed up tremendously, as the backend isn't
parsing every line. Obviously this is a future item...

> By the way, use con.setAutoCommit( false ) to have all the inserts in one
> big transaction. It saves a lot of time.

Don't forget to commit() at the end, as you can't guarantee that a
transaction will be committed when the connection closes.

Peter

--       Peter T Mount peter@retep.org.uk     Main Homepage: http://www.retep.org.uk
PostgreSQL JDBC Faq: http://www.retep.org.uk/postgresJava PDF Generator: http://www.retep.org.uk/pdf



Re: [INTERFACES] Re: [GENERAL] JDBC and insert - stack overflow

From
Tom Lane
Date:
Peter T Mount <peter@retep.org.uk> writes:
>> By the way, use con.setAutoCommit( false ) to have all the inserts in one
>> big transaction. It saves a lot of time.

> Don't forget to commit() at the end, as you can't guarantee that a
> transaction will be committed when the connection closes.

In fact, I believe that we guarantee the opposite: any open transaction
will be aborted if the client closes the connection without sending a
commit command...
        regards, tom lane