Re: [SPAM] - Re: JDBC HighLoad - Found word(s) XXX in the

From: Dave Cramer <pg(at)fastcrypt(dot)com>
To: Stéphane RIFF <stephane(dot)riff(at)cerene(dot)fr>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: [SPAM] - Re: JDBC HighLoad - Found word(s) XXX in the
Date: 2005-01-28 13:21:18
Message-ID: 41FA3C4E.1020009@fastcrypt.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Because every time you do pstmt_xxx = c.prepareStatement.... you are
over writing the previous one.

Dave

Stéphane RIFF wrote:

> Dave Cramer wrote:
>
>> Stephane,
>>
>> You are using this class as a singleton in a multithreaded
>> environment ???
>>
>>
>> Dave
>>
>> Stéphane RIFF wrote:
>>
>>> Stéphane RIFF wrote:
>>>
>>>> Hi i have a java aplication which connect to postgresql via jdbc.
>>>> This app make a lot of request per second.
>>>> The problem is that i get delayed records between the moment the
>>>> informations arrived via socket to java and
>>>> the moment it's recorded in the database. It seems that jdbc wait
>>>> before inserting/updating the db because
>>>> they are to much requests.
>>>> For testing i made a little app in c using libpq to see if problem
>>>> persist and there no delay.
>>>>
>>>> So i'd like to know a way to speed up jdbc if possible ???
>>>>
>>>>
>>> Here my connection class, is there something wrong ?
>>>
>>> import java.io.*;
>>> import java.util.*;
>>> import java.sql.*;
>>> import java.text.*;
>>> import javax.sql.DataSource;
>>> import org.postgresql.jdbc3.Jdbc3PoolingDataSource;
>>>
>>> import org.apache.log4j.Logger;
>>> import org.apache.log4j.PropertyConfigurator;
>>>
>>> public class SQLoader {
>>> private Jdbc3PoolingDataSource datasource ;
>>> //query object gps
>>> private PreparedStatement pstmt_gps ;
>>> //query object io
>>> private PreparedStatement pstmt_io ;
>>> //query object gps
>>> private PreparedStatement pstmt_ugps ;
>>> //query object io
>>> private PreparedStatement pstmt_uio ;
>>> //query object gps
>>> private PreparedStatement pstmt_hgps ;
>>> //query object io
>>> private PreparedStatement pstmt_hio ;
>>> //singleton class
>>> private final static SQLoader myRef = new SQLoader();
>>> //Log4j logger object
>>> private static Logger logger =
>>> Logger.getLogger(SQLoader.class.getName());
>>> //jdbc driver
>>> private String driver ;
>>> //jdbc connection string
>>> private String jdbcConnectionString ;
>>> //database user
>>> private String dbUser ;
>>> //database password
>>> private String dbPwd ;
>>> /**
>>> * Private constructor
>>> *
>>> * @since 1.0
>>> */
>>> private SQLoader() {}
>>> /**
>>> * Give access to the unique instance of this class
>>> *
>>> * @return The instance
>>> * @since 1.0
>>> */
>>> public static SQLoader getRef()
>>> {
>>> return myRef ;
>>> }
>>> public void connect(String driver,String dbc, String dbu,
>>> String dbp)
>>> {
>>> Connection m_conn = null;
>>> try {
>>> datasource = setupDataSource(dbc);
>>> }catch(Exception e){
>>> logger.fatal(e.toString());
>>> System.exit(-1);
>>> }
>>> }
>>> private void prepareQuery(Connection c)
>>> {
>>> try
>>> {
>>> //Construct predefined query
>>> String qry = "INSERT INTO gps_frame (" +
>>> "\"sbox_id\"," +
>>> "\"gps_date\"," +
>>> "\"badge_id\"," +
>>> "\"gmt_creation_date\"," +
>>>
>>> "\"wgs84_position\","+
>>> "\"speed\"," +
>>> "\"altitude\","+
>>> "\"heading\","+
>>> "\"validity\"," +
>>> "\"geom\")" +
>>> " VALUES( ?,?,?,?,?,?,?,?,?,?)";
>>> pstmt_gps = c.prepareStatement(qry);
>>>
>>> String qry1 = "INSERT INTO io_frame ("+
>>> "\"sbox_id\","+
>>> "\"gps_date\","+
>>> "\"io_type\","+
>>> "\"io_rank\","+
>>> "\"io_value\")"+
>>> " VALUES( ?,?,?,?,?)";
>>> pstmt_io = c.prepareStatement(qry1);
>>>
>>> String uqry = "UPDATE gps_frame SET "+
>>> "\"gps_date\"=?,"+
>>> "\"badge_id\"=?,"+
>>> "\"gmt_creation_date\"=?,"+
>>> "\"wgs84_position\"=?,"+
>>> "\"speed\"=?,"+
>>> "\"altitude\"=?,"+
>>> "\"heading\"=?,"+
>>> "\"validity\"=?,"+
>>> "\"geom\"=?"+
>>> " WHERE \"sbox_id\"=?";
>>> pstmt_ugps = c.prepareStatement(uqry);
>>>
>>> String uqry1 = "UPDATE io_frame SET "+
>>> "\"gps_date\"=?,"+
>>> "\"io_value\"=?"+
>>> " WHERE \"sbox_id\"=? AND \"io_rank\"=?
>>> AND io_type=?";
>>> pstmt_uio = c.prepareStatement(uqry1);
>>>
>>> qry = "INSERT INTO gps_frame_history (" +
>>> "\"sbox_id\"," +
>>> "\"gps_date\"," +
>>> "\"badge_id\"," +
>>> "\"gmt_creation_date\"," +
>>>
>>> "\"wgs84_position\","+
>>> "\"speed\"," +
>>> "\"altitude\","+
>>> "\"heading\","+
>>> "\"validity\"," +
>>> "\"geom\")" +
>>> " VALUES( ?,?,?,?,?,?,?,?,?,?)";
>>> pstmt_hgps = c.prepareStatement(qry);
>>>
>>> qry1 = "INSERT INTO io_frame_history ("+
>>> "\"sbox_id\","+
>>> "\"gps_date\","+
>>> "\"io_type\","+
>>> "\"io_rank\","+
>>> "\"io_value\")"+
>>> " VALUES( ?,?,?,?,?)";
>>> pstmt_hio = c.prepareStatement(qry1);
>>> }catch( java.sql.SQLException e)
>>> {
>>> logger.fatal(e.toString());
>>> System.exit(-1);
>>> }
>>> }
>>> /**
>>> * Disconnect from DB
>>> *
>>> * @since 1.0
>>> */
>>> public void disconnect()
>>> {
>>> try {
>>> shutdownDataSource(datasource);
>>> } catch(Exception e){
>>> logger.fatal(e.toString());
>>> System.exit(-1);
>>> }
>>> }
>>> public void saveTrame(String boxID, String badgeID, String
>>> gpsDate, double speed,
>>> String wgs84, double altitude,
>>> double azimuth,
>>> String validity, String geom,
>>> String sysDate, int[] input, int[] output)
>>> { Connection m_conn = null;
>>> try
>>> {
>>> m_conn = datasource.getConnection();
>>> m_conn.setAutoCommit(false);
>>> prepareQuery(m_conn);
>>> //set query values for update gps_frame
>>> pstmt_ugps.setString(1, gpsDate);
>>> pstmt_ugps.setString(2, badgeID);
>>> pstmt_ugps.setString(3, sysDate);
>>> pstmt_ugps.setString(4, wgs84);
>>> pstmt_ugps.setDouble(5, speed);
>>> pstmt_ugps.setDouble(6, altitude);
>>> pstmt_ugps.setDouble(7, azimuth);
>>> pstmt_ugps.setString(8, validity);
>>> pstmt_ugps.setString(9, geom);
>>> pstmt_ugps.setString(10, boxID);
>>> if(pstmt_ugps.executeUpdate()==0)
>>> { //if no frame already exists insert it
>>> pstmt_gps.setString(1, boxID);
>>> pstmt_gps.setString(2, gpsDate);
>>> pstmt_gps.setString(3, badgeID);
>>> pstmt_gps.setString(4, sysDate);
>>> pstmt_gps.setString(5, wgs84);
>>> pstmt_gps.setDouble(6, speed);
>>> pstmt_gps.setDouble(7, altitude);
>>> pstmt_gps.setDouble(8, azimuth);
>>> pstmt_gps.setString(9, validity);
>>> pstmt_gps.setString(10, geom);
>>> pstmt_gps.executeUpdate();
>>> for(int i = 0; i < input.length; i++)
>>> {
>>> pstmt_io.setString(1, boxID);
>>> pstmt_io.setString(2, gpsDate);
>>> pstmt_io.setString(3, "i");
>>> pstmt_io.setInt(4, (i+1));
>>> pstmt_io.setInt(5, input[i]);
>>> pstmt_io.executeUpdate();
>>> }
>>> for(int o = 0; o < output.length; o++)
>>> {
>>> pstmt_io.setString(1, boxID);
>>> pstmt_io.setString(2, gpsDate);
>>> pstmt_io.setString(3, "o");
>>> pstmt_io.setInt(4, (o+1));
>>> pstmt_io.setInt(5, output[o]);
>>> pstmt_io.executeUpdate();
>>> }
>>> }else
>>> { //if frame already exists in gps_frame update his io
>>> for(int i = 0; i < input.length; i++)
>>> {
>>> pstmt_uio.setString(1, gpsDate);
>>> pstmt_uio.setInt(2, input[i]);
>>> pstmt_uio.setString(3, boxID);
>>> pstmt_uio.setInt(4, (i+1));
>>> pstmt_uio.setString(5,"i");
>>> pstmt_uio.executeUpdate();
>>> }
>>> for(int o = 0; o < output.length; o++)
>>> {
>>> pstmt_uio.setString(1, gpsDate);
>>> pstmt_uio.setInt(2, output[o]);
>>> pstmt_uio.setString(3, boxID);
>>> pstmt_uio.setInt(4, (o+1));
>>> pstmt_uio.setString(5,"o");
>>> pstmt_uio.executeUpdate();
>>> }
>>> }
>>> //insert in hisory
>>> pstmt_hgps.setString(1, boxID);
>>> pstmt_hgps.setString(2, gpsDate);
>>> pstmt_hgps.setString(3, badgeID);
>>> pstmt_hgps.setString(4, sysDate);
>>> pstmt_hgps.setString(5, wgs84);
>>> pstmt_hgps.setDouble(6, speed);
>>> pstmt_hgps.setDouble(7, altitude);
>>> pstmt_hgps.setDouble(8, azimuth);
>>> pstmt_hgps.setString(9, validity);
>>> pstmt_hgps.setString(10, geom);
>>> pstmt_hgps.executeUpdate();
>>>
>>> for(int i = 0; i < input.length; i++)
>>> {
>>> pstmt_hio.setString(1, boxID);
>>> pstmt_hio.setString(2, gpsDate);
>>> pstmt_hio.setString(3, "i");
>>> pstmt_hio.setInt(4, (i+1));
>>> pstmt_hio.setInt(5, input[i]);
>>> pstmt_hio.executeUpdate();
>>> }
>>> for(int o = 0; o < output.length; o++)
>>> {
>>> pstmt_hio.setString(1, boxID);
>>> pstmt_hio.setString(2, gpsDate);
>>> pstmt_hio.setString(3, "o");
>>> pstmt_hio.setInt(4, (o+1));
>>> pstmt_hio.setInt(5, output[o]);
>>> pstmt_hio.executeUpdate();
>>> }
>>> m_conn.commit();
>>> }
>>> catch(java.sql.SQLException e){
>>> String msg = e ;
>>> logger.warn(msg);
>>> }
>>> finally {
>>> try { m_conn.close(); } catch(Exception e) { }
>>> }
>>> }
>>> public Jdbc3PoolingDataSource setupDataSource(String connectURI) {
>>> Jdbc3PoolingDataSource ds = new Jdbc3PoolingDataSource();
>>> ds.setDataSourceName("Xxx");
>>> ds.setServerName("xxx.xxx.xxx.xxx");
>>> ds.setDatabaseName("xxxxxxxxxxxxx");
>>> ds.setUser("xxxxx");
>>> ds.setPassword("xxxxx");
>>> ds.setMaxConnections(10);
>>> return ds;
>>> }
>>> public static void shutdownDataSource(DataSource ds) throws
>>> SQLException {
>>> }
>>> }
>>>
>>> When i highload postgresql with a multi-threaded serverSocket using
>>> this class,
>>> my app freezes very quickly and all my connection are in idle state.
>>> It seems that the connection aren't released.
>>>
>>> It don't know what i can do if someone could help ???
>>> Thanks
>>>
>>>
>>
> Yes i use it as a singleon what's the problem with that ???
> I instanciate One object => 1 pool for all threads and each thread use
> the saveTrame
> isn't this right ???
>
> Thanks
>
>

--
Dave Cramer
http://www.postgresintl.com
519 939 0336
ICQ#14675561

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Stéphane RIFF 2005-01-28 13:46:16 Re: [SPAM] - Re: [SPAM] - Re: JDBC HighLoad - Found word(s)
Previous Message Stéphane RIFF 2005-01-28 13:10:47 Re: [SPAM] - Re: JDBC HighLoad - Found word(s) XXX in the