Re: bug report: slow getColumnTypeName

Поиск
Список
Период
Сортировка
От Luis Flores
Тема Re: bug report: slow getColumnTypeName
Дата
Msg-id CA+nXnG8thQTe6D-njQYqQUd-LuXD2--RBejCz6Oq7dtMUEEs=g@mail.gmail.com
обсуждение исходный текст
Ответ на Re: bug report: slow getColumnTypeName  (dmp <danap@ttc-cmc.net>)
Ответы Re: bug report: slow getColumnTypeName  (Luis Flores <luiscamposflores@gmail.com>)
Список pgsql-jdbc
I also confirm the performance regression.

Testing on Fedora17 64bit + PostgreSQL 9.1 + jdk 1.6.0_33, localhost
server, I get these numbers:
driver 802
getColumnType time (ms): 2777
getColumnTypeName time (ms): 1847
both time (ms): 1948

driver 903
getColumnType time (ms): 3044
getColumnTypeName time (ms): 27123
both time (ms): 25142

driver 1000
getColumnType time (ms): 2928
getColumnTypeName time (ms): 27214
both time (ms): 26407

During the getColumnTypeName tests postgresql daemon used 100% cpu time.

Here is the full test class:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;


public class Main
{
    public static void main( String arg[] )
        throws Exception
    {
        Class.forName( "org.postgresql.Driver" );
        Connection conn = DriverManager.getConnection(
"jdbc:postgresql://localhost/test", "postgres", "" );
        Statement create = conn.createStatement();
        create.execute( "CREATE TABLE t(id SERIAL, name VARCHAR);" );
        create.close();
        long l = System.currentTimeMillis();
        for( int i = 0; i < 10000; ++i )
        {
            Statement stm = conn.createStatement();
            stm.execute( "SELECT id, name FROM t;" );
            ResultSet rs = stm.getResultSet();
            ResultSetMetaData rsmd = rs.getMetaData();
            rsmd.getColumnType( 1 );
//            rsmd.getColumnTypeName( 1 );
            rs.close();
            stm.close();
        }
        System.out.println( "getColumnType time (ms): " + (
System.currentTimeMillis() - l ) );
        l = System.currentTimeMillis();
        for( int i = 0; i < 10000; ++i )
        {
            Statement stm = conn.createStatement();
            stm.execute( "SELECT id, name FROM t;" );
            ResultSet rs = stm.getResultSet();
            ResultSetMetaData rsmd = rs.getMetaData();
//            rsmd.getColumnType( 1 );
            rsmd.getColumnTypeName( 1 );
            rs.close();
            stm.close();
        }
        System.out.println( "getColumnTypeName time (ms): " + (
System.currentTimeMillis() - l ) );
        l = System.currentTimeMillis();
        for( int i = 0; i < 10000; ++i )
        {
            Statement stm = conn.createStatement();
            stm.execute( "SELECT id, name FROM t;" );
            ResultSet rs = stm.getResultSet();
            ResultSetMetaData rsmd = rs.getMetaData();
            rsmd.getColumnType( 1 );
            rsmd.getColumnTypeName( 1 );
            rs.close();
            stm.close();
        }
        System.out.println( "both time (ms): " + ( System.currentTimeMillis() - l ) );
        Statement drop = conn.createStatement();
        drop.execute( "DROP TABLE t;" );
        drop.close();
        conn.close();
    }
}


Luis Flores

On Tue, Oct 9, 2012 at 5:48 PM, dmp <danap@ttc-cmc.net> wrote:
> Eyal Wilde wrote:
>>
>> I verified with wireshark that  getColumnTypeName indeed do a request to
>> the postgres server. This happens with 9.1-901 and 9.1-903 BUT NOT WITH
>> 9.0-801!!
>>
>> So, the reason for the slowness seems to be obviouse now.
>>
>> it will take me some time to wrap up it into a test case. I would realy
>> like to help, but please let me know if it's realy necessary.
>>
>> On Oct 5, 2012 1:07 AM, "Eyal Wilde" <eyal@impactsoft.co.il
>> <mailto:eyal@impactsoft.co.il>> wrote:
>>
>>
>>                          ResultSetMetaData __md = __rs.getMetaData();
>>       //this is fine
>>                          String __sf1name = __md.getColumnName(1);
>>        //this is fine
>>                          int __if1type = __md.getColumnType(1);
>>             //this is fine
>>                          String __sf1type =
>>     __md.getColumnTypeName(1); //this is SLOW!! ~15msec
>>
>>     postgres server version is 9.1.5
>>     jdbc version, i checked both 9.1-901 and 9.1-903
>>     and... BTW, 9.0-801 works good (while connected pg9.1)!
>
>
> There does appear to be a change in the code that may have created the
> slowness that you are observing. Please try a a test case in which two
> back to back getColumnTypeName() calls are made. Is there a difference
> in time between the first and second and is there still on the second
> call a request to the postgres server.
>
> The code between 9.0-801 and later version does have a change in it
> that looks like for the caching for field metadata through
> fetchFieldMetaData().
> That method is called in the later versions for getColumnTypeName()
> with isAutoIncrement(), with was also added in later versions.
>
> danap.
>
>
>
>
> --
> Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-jdbc


В списке pgsql-jdbc по дате отправления:

Предыдущее
От: "David Johnston"
Дата:
Сообщение: Re: Bug in AbstracJdbc2Statement.replaceProcessing when using dollar quoting?
Следующее
От: Luis Flores
Дата:
Сообщение: Re: bug report: slow getColumnTypeName