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

Re: JDBC patch reduces memory consumption

From: Barry Lind <barry(at)xythos(dot)com>
To: Denis Perchine <dyp(at)perchine(dot)com>
Cc: pgsql-patches(at)postgresql(dot)org
Subject: Re: JDBC patch reduces memory consumption
Date: 2002-10-16 16:36:53
Message-ID: 3DAD95A5.2010408@xythos.com (view raw or flat)
Thread:
Lists: pgsql-patches
Denis,

Please provide a patch against current CVS.  Some of the code below is 
probably no longer needed given other changes that have been made in 
current sources.

thanks,
--Barry



Denis Perchine wrote:
> Hello,
> 
> This patch reduces JDBC memory usage for setString(),
> setBytes(), executeUpdate()
> 
> --
> Denis
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> diff -Nur postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java postgresql-7.2/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
> --- postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java	Tue Jan 15 01:37:33 2002
> +++ postgresql-7.2/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java	Wed Oct 16 19:44:35 2002
> @@ -118,20 +118,34 @@
>  	 * This is identical to toString() except it throws an exception if a
>  	 * parameter is unused.
>  	 */
> -	private synchronized String compileQuery()
> -	throws SQLException
> +	private synchronized String compileQuery() throws SQLException
>  	{
> -		sbuf.setLength(0);
> -		int i;
> -
> -		for (i = 0 ; i < inStrings.length ; ++i)
> -		{
> -			if (inStrings[i] == null)
> -				throw new PSQLException("postgresql.prep.param", new Integer(i + 1));
> -			sbuf.append (templateStrings[i]).append (inStrings[i]);
> -		}
> -		sbuf.append(templateStrings[inStrings.length]);
> -		return sbuf.toString();
> +                synchronized (sbuf) {
> +                        try {
> +          		        sbuf.setLength(0);
> +        		        int i;
> +                                
> +                                // calculate future buffer size
> +                                int size = templateStrings[inStrings.length].length();
> +                                for (i = 0 ; i < inStrings.length ; ++i)
> +                                  if (inStrings[i] == null)
> +                                    throw new PSQLException("postgresql.prep.param", new Integer(i + 1));
> +                                  else  
> +                                    size += templateStrings[i].length() + inStrings[i].length();
> +                                sbuf.ensureCapacity(size);    
> +        
> +        		        for (i = 0 ; i < inStrings.length ; ++i)
> +        		        {
> +        			        if (inStrings[i] == null)
> +        				        throw new PSQLException("postgresql.prep.param", new Integer(i + 1));
> +        			        sbuf.append (templateStrings[i]).append (inStrings[i]);
> +        		        }
> +        		        sbuf.append(templateStrings[inStrings.length]);
> +        		        return sbuf.toString();
> +                        } finally {
> +                          sbuf.setLength(0); // free some memory used by buffer
> +                        }                                
> +               }
>  	}
>  
>  	/*
> @@ -276,18 +290,31 @@
>  			synchronized (sbuf)
>  			{
>  				sbuf.setLength(0);
> -				int i;
> +
> +                                int i;
> +                                char c;
> +                                if (x.length() > 10000) {
> +                                  // calculate buffer size
> +                                  int size = 2 + x.length();
> +                                  for (i = 0 ; i < x.length() ; ++i) {
> +                                    c = x.charAt(i);
> +                                    if (c == '\\' || c == '\'')
> +                                      size ++;
> +                                  }
> +                                  sbuf.ensureCapacity(size);    
> +                                }
>  
>  				sbuf.append('\'');
>  				for (i = 0 ; i < x.length() ; ++i)
>  				{
> -					char c = x.charAt(i);
> +					c = x.charAt(i);
>  					if (c == '\\' || c == '\'')
>  						sbuf.append((char)'\\');
>  					sbuf.append(c);
>  				}
>  				sbuf.append('\'');
>  				set(parameterIndex, sbuf.toString());
> +                                sbuf.setLength(0); // free some memory used by buffer
>  			}
>  		}
>  	}
> diff -Nur postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/util/PGbytea.java postgresql-7.2/src/interfaces/jdbc/org/postgresql/util/PGbytea.java
> --- postgresql-7.2-orig/src/interfaces/jdbc/org/postgresql/util/PGbytea.java	Sat Jan  5 16:26:23 2002
> +++ postgresql-7.2/src/interfaces/jdbc/org/postgresql/util/PGbytea.java	Wed Oct 16 19:44:55 2002
> @@ -62,10 +62,33 @@
>  	{
>  		if (p_buf == null)
>  			return null;
> -		StringBuffer l_strbuf = new StringBuffer();
> +
> +                int l_int;
> +                StringBuffer l_strbuf;
> +                
> +                if (p_buf.length > 10000) {
> +                  // calculate buffer size        
> +                  int size = 0;        
> +                  for (int i = 0; i < p_buf.length; i++) {
> +                    l_int = (int)p_buf[i];
> +                    if (l_int < 0)
> +                      l_int = 256 + l_int;
> +                      
> +                    if (l_int < 040 || l_int > 0176)
> +                      size += 5;
> +                    else if (p_buf[i] == (byte)'\\')
> +                      size += 4;
> +                    else 
> +                      size += 1;
> +                  }
> +                  l_strbuf = new StringBuffer(size);
> +                }
> +                else 
> +                  l_strbuf = new StringBuffer();
> +                
>  		for (int i = 0; i < p_buf.length; i++)
>  		{
> -			int l_int = (int)p_buf[i];
> +			l_int = (int)p_buf[i];
>  			if (l_int < 0)
>  			{
>  				l_int = 256 + l_int;
> 
> 
> ------------------------------------------------------------------------
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
> 
> http://www.postgresql.org/users-lounge/docs/faq.html




In response to

pgsql-patches by date

Next:From: Peter EisentrautDate: 2002-10-16 22:12:21
Subject: Large file support on AIX
Previous:From: Tom LaneDate: 2002-10-16 14:10:01
Subject: Re: Fixes for autocommit = off

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