postgresql-jdbc.git / summary / log / commit / refs

commit    3ee699fe480ec30ebb982a0bcd924c23bea3f291
Author:   Kris Jurka <jurka@ejurka.com>
Date:     Fri Feb 10 07:59:41 2012 +0000

    Cache a copy of ResultSetMetaData in the ResultSet.
    
    This solves a major performance problem for ResultSetMetaData users
    which did not cache the ResultSetMetaData object.  One of the users
    is the driver's own implementation of updatable ResultSets, so this
    can't be worked around solely in end user code.
    
    In the 9.0 and earlier releases, the Field objects were used to hold
    database lookup results and these were longer lived than the
    ResultSetMetaData object.  Now that ResultSetMetaData is holding
    these database lookups we must hold onto the object to avoid
    repeating the database queries.
    
    Reported as bug #6293, fix by Steven Schlansker.


org/postgresql/jdbc2/AbstractJdbc2ResultSet.java | 12 +++++++++++- org/postgresql/jdbc3/Jdbc3ResultSet.java | 3 +-- org/postgresql/jdbc3g/Jdbc3gResultSet.java | 3 +-- org/postgresql/jdbc4/Jdbc4ResultSet.java | 3 +-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java b/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java index 15eaaa04..da0d24b5 100644 --- a/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java +++ b/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java @@ -83,8 +83,18 @@ public abstract class AbstractJdbc2ResultSet implements BaseResultSet, org.postg private HashMap columnNameIndexMap; // Speed up findColumn by caching lookups - public abstract ResultSetMetaData getMetaData() throws SQLException; + private ResultSetMetaData rsMetaData; + protected abstract ResultSetMetaData createMetaData() throws SQLException; + + public ResultSetMetaData getMetaData() throws SQLException + { + checkClosed(); + if (rsMetaData == null) { + rsMetaData = createMetaData(); + } + return rsMetaData; + } public AbstractJdbc2ResultSet(Query originalQuery, BaseStatement statement, Field[] fields, Vector tuples, ResultCursor cursor, int maxRows, int maxFieldSize, diff --git a/org/postgresql/jdbc3/Jdbc3ResultSet.java b/org/postgresql/jdbc3/Jdbc3ResultSet.java index 0fa72903..2df3c964 100644 --- a/org/postgresql/jdbc3/Jdbc3ResultSet.java +++ b/org/postgresql/jdbc3/Jdbc3ResultSet.java @@ -26,9 +26,8 @@ public class Jdbc3ResultSet extends org.postgresql.jdbc3.AbstractJdbc3ResultSet super(originalQuery, statement, fields, tuples, cursor, maxRows, maxFieldSize, rsType, rsConcurrency, rsHoldability); } - public java.sql.ResultSetMetaData getMetaData() throws SQLException + protected java.sql.ResultSetMetaData createMetaData() throws SQLException { - checkClosed(); return new Jdbc3ResultSetMetaData(connection, fields); } diff --git a/org/postgresql/jdbc3g/Jdbc3gResultSet.java b/org/postgresql/jdbc3g/Jdbc3gResultSet.java index 1e81bc73..d98239a4 100644 --- a/org/postgresql/jdbc3g/Jdbc3gResultSet.java +++ b/org/postgresql/jdbc3g/Jdbc3gResultSet.java @@ -26,9 +26,8 @@ public class Jdbc3gResultSet extends org.postgresql.jdbc3g.AbstractJdbc3gResultS super(originalQuery, statement, fields, tuples, cursor, maxRows, maxFieldSize, rsType, rsConcurrency, rsHoldability); } - public java.sql.ResultSetMetaData getMetaData() throws SQLException + protected java.sql.ResultSetMetaData createMetaData() throws SQLException { - checkClosed(); return new Jdbc3gResultSetMetaData(connection, fields); } diff --git a/org/postgresql/jdbc4/Jdbc4ResultSet.java b/org/postgresql/jdbc4/Jdbc4ResultSet.java index 67956fb4..d5e47a9b 100644 --- a/org/postgresql/jdbc4/Jdbc4ResultSet.java +++ b/org/postgresql/jdbc4/Jdbc4ResultSet.java @@ -26,9 +26,8 @@ public class Jdbc4ResultSet extends AbstractJdbc4ResultSet implements java.sql.R super(originalQuery, statement, fields, tuples, cursor, maxRows, maxFieldSize, rsType, rsConcurrency, rsHoldability); } - public java.sql.ResultSetMetaData getMetaData() throws SQLException + protected java.sql.ResultSetMetaData createMetaData() throws SQLException { - checkClosed(); return new Jdbc4ResultSetMetaData(connection, fields); } [parent: c96f5c585b26]