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

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

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: [SPAM] - Re: JDBC HighLoad - Found word(s)
Date: 2005-01-28 14:59:11
Message-ID: 41FA533F.4000707@fastcrypt.com (view raw or flat)
Thread:
Lists: pgsql-jdbc
The pooling mechanism will take care of this; which brings up another 
point. The internal pooling implementation is not production class. Have 
a look at apache's dbcp, it is much better.

I think this works fine as long as it isn't a singleton. Instantiate the 
class, get a connection from the pool, do your inserts/updates, return 
the connection and you're done. I'd probably create the sql strings 
statically, there's no need for more than one instance of them.

Dave

Stéphane RIFF wrote:

> Dave Cramer wrote:
>
>> 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
>>>
>>>
>>
> You're right but how can i do if my class is not singleton, i don't 
> want each thread with a pool of connections
> i want a pool for all threads.
>
>
>

-- 
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 15:58:01
Subject: Re: [SPAM] - Re: [SPAM] - Re: [SPAM] - Re: JDBC HighLoad -
Previous:From: Stéphane RIFFDate: 2005-01-28 13:46:16
Subject: Re: [SPAM] - Re: [SPAM] - Re: JDBC HighLoad - Found word(s)

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