Skip site navigation (1) Skip section navigation (2)

Re: JDBC HighLoad

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: JDBC HighLoad
Date: 2005-01-28 12:36:19
Message-ID: 41FA31C3.8010502@fastcrypt.com (view raw or flat)
Thread:
Lists: pgsql-jdbc
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
>
>

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


In response to

Responses

pgsql-jdbc by date

Next:From: Stéphane RIFFDate: 2005-01-28 13:10:47
Subject: Re: [SPAM] - Re: JDBC HighLoad - Found word(s) XXX in the
Previous:From: Stéphane RIFFDate: 2005-01-28 11:09:06
Subject: Re: JDBC HighLoad

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group