From 15dee25198c0a7a4d3bdeca2193a003d552fac2f Mon Sep 17 00:00:00 2001 From: Steven Schlansker Date: Thu, 9 Feb 2012 15:30:39 -0800 Subject: [PATCH 1/2] Change the ResultSet to cache ResultSetMetaData instances. This dramatically improves performance with regards to metadata-intensive operations. The original motivation is that without caching, each call to a ResultSet.updateXXX method would retrieve a new instance of the metadata, causing an entire query to be run. If you update many columns in the same row, the cost came to be very expensive. Performance may improve in other workloads as well, but this has not been measured. --- org/postgresql/jdbc4/Jdbc4ResultSet.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/org/postgresql/jdbc4/Jdbc4ResultSet.java b/org/postgresql/jdbc4/Jdbc4ResultSet.java index 67956fb448..5a103eb409 100644 --- a/org/postgresql/jdbc4/Jdbc4ResultSet.java +++ b/org/postgresql/jdbc4/Jdbc4ResultSet.java @@ -20,6 +20,8 @@ */ public class Jdbc4ResultSet extends AbstractJdbc4ResultSet implements java.sql.ResultSet { + private Jdbc4ResultSetMetaData metaData; + Jdbc4ResultSet(Query originalQuery, BaseStatement statement, Field[] fields, Vector tuples, ResultCursor cursor, int maxRows, int maxFieldSize, int rsType, int rsConcurrency, int rsHoldability) throws SQLException { @@ -29,7 +31,13 @@ public class Jdbc4ResultSet extends AbstractJdbc4ResultSet implements java.sql.R public java.sql.ResultSetMetaData getMetaData() throws SQLException { checkClosed(); - return new Jdbc4ResultSetMetaData(connection, fields); + + if (metaData == null) + { + metaData = new Jdbc4ResultSetMetaData(connection, fields); + } + + return metaData; } public java.sql.Clob getClob(int i) throws SQLException From 39f9dd4a444e0ea738bedc922a6d1b7062208945 Mon Sep 17 00:00:00 2001 From: Steven Schlansker Date: Thu, 9 Feb 2012 15:55:56 -0800 Subject: [PATCH 2/2] Change Jdbc3(g)ResultSet to cache MetaData instances Same description as immediately previous commit, but also fixes the Jdbc3(g) ResultSet implementations. --- org/postgresql/jdbc3/Jdbc3ResultSet.java | 11 ++++++++++- org/postgresql/jdbc3g/Jdbc3gResultSet.java | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/org/postgresql/jdbc3/Jdbc3ResultSet.java b/org/postgresql/jdbc3/Jdbc3ResultSet.java index 0fa7290389..323e7e4fd9 100644 --- a/org/postgresql/jdbc3/Jdbc3ResultSet.java +++ b/org/postgresql/jdbc3/Jdbc3ResultSet.java @@ -20,6 +20,9 @@ */ public class Jdbc3ResultSet extends org.postgresql.jdbc3.AbstractJdbc3ResultSet implements java.sql.ResultSet { + + private Jdbc3ResultSetMetaData metaData; + Jdbc3ResultSet(Query originalQuery, BaseStatement statement, Field[] fields, Vector tuples, ResultCursor cursor, int maxRows, int maxFieldSize, int rsType, int rsConcurrency, int rsHoldability) throws SQLException { @@ -29,7 +32,13 @@ public class Jdbc3ResultSet extends org.postgresql.jdbc3.AbstractJdbc3ResultSet public java.sql.ResultSetMetaData getMetaData() throws SQLException { checkClosed(); - return new Jdbc3ResultSetMetaData(connection, fields); + + if (metaData == null) + { + metaData = new Jdbc3ResultSetMetaData(connection, fields); + } + + return metaData; } public java.sql.Clob getClob(int i) throws SQLException diff --git a/org/postgresql/jdbc3g/Jdbc3gResultSet.java b/org/postgresql/jdbc3g/Jdbc3gResultSet.java index 1e81bc73b3..f40342c4f8 100644 --- a/org/postgresql/jdbc3g/Jdbc3gResultSet.java +++ b/org/postgresql/jdbc3g/Jdbc3gResultSet.java @@ -20,6 +20,9 @@ */ public class Jdbc3gResultSet extends org.postgresql.jdbc3g.AbstractJdbc3gResultSet implements java.sql.ResultSet { + + private Jdbc3gResultSetMetaData metaData; + Jdbc3gResultSet(Query originalQuery, BaseStatement statement, Field[] fields, Vector tuples, ResultCursor cursor, int maxRows, int maxFieldSize, int rsType, int rsConcurrency, int rsHoldability) throws SQLException { @@ -29,7 +32,13 @@ public class Jdbc3gResultSet extends org.postgresql.jdbc3g.AbstractJdbc3gResultS public java.sql.ResultSetMetaData getMetaData() throws SQLException { checkClosed(); - return new Jdbc3gResultSetMetaData(connection, fields); + + if (metaData == null) + { + metaData = new Jdbc3gResultSetMetaData(connection, fields); + } + + return metaData; } public java.sql.Clob getClob(int i) throws SQLException