Changeset: 6fd18d4cfa41 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=6fd18d4cfa41
Modified Files:
        src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
Branch: default
Log Message:

Delay the creation of five helper SimpleDateFormat objects for each 
PreparedStatement object
 till they are actually needed (only when setDate() or setTime() or 
setTimestamp() is called)
 to save resources (memory, allocation and gc time).


diffs (123 lines):

diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java 
b/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java
@@ -83,22 +83,17 @@ public class MonetPreparedStatement
 
        private final MonetConnection connection;
 
-       /* only parse the date patterns once, use multiple times */
+       /* placeholders for date/time pattern formats created once (only when 
needed), used multiple times */
        /** Format of a timestamp with RFC822 time zone */
-       final SimpleDateFormat mTimestampZ =
-               new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
+       private SimpleDateFormat mTimestampZ;
        /** Format of a timestamp */
-       final SimpleDateFormat mTimestamp =
-               new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+       private SimpleDateFormat mTimestamp;
        /** Format of a time with RFC822 time zone */
-       final SimpleDateFormat mTimeZ =
-               new SimpleDateFormat("HH:mm:ss.SSSZ");
+       private SimpleDateFormat mTimeZ;
        /** Format of a time */
-       final SimpleDateFormat mTime =
-               new SimpleDateFormat("HH:mm:ss.SSS");
+       private SimpleDateFormat mTime;
        /** Format of a date used by mserver */
-       final SimpleDateFormat mDate =
-               new SimpleDateFormat("yyyy-MM-dd");
+       private SimpleDateFormat mDate;
 
        /**
         * MonetPreparedStatement constructor which checks the arguments for
@@ -1469,6 +1464,10 @@ public class MonetPreparedStatement
                if (cal == null) {
                        setValue(parameterIndex, "date '" + x.toString() + "'");
                } else {
+                       if (mDate == null) {
+                               // first time usage, create and keep the mDate 
object for next usage
+                               mDate = new SimpleDateFormat("yyyy-MM-dd");
+                       }
                        mDate.setTimeZone(cal.getTimeZone());
                        setValue(parameterIndex, "date '" + mDate.format(x) + 
"'");
                }
@@ -2439,6 +2438,10 @@ public class MonetPreparedStatement
                if (hasTimeZone) {
                        // timezone shouldn't matter, since the server is 
timezone
                        // aware in this case
+                       if (mTimeZ == null) {
+                               // first time usage, create and keep the mTimeZ 
object for next usage
+                               mTimeZ = new SimpleDateFormat("HH:mm:ss.SSSZ");
+                       }
                        String RFC822 = mTimeZ.format(x);
                        setValue(parameterIndex, "timetz '" +
                                        RFC822.substring(0, 15) + ":" + 
RFC822.substring(15) + "'");
@@ -2450,6 +2453,10 @@ public class MonetPreparedStatement
                        if (cal == null) {
                                setValue(parameterIndex, "time '" + 
x.toString() + "'");
                        } else {
+                               if (mTime == null) {
+                                       // first time usage, create and keep 
the mTime object for next usage
+                                       mTime = new 
SimpleDateFormat("HH:mm:ss.SSS");
+                               }
                                mTime.setTimeZone(cal.getTimeZone());
                                setValue(parameterIndex, "time '" + 
mTime.format(x) + "'");
                        }
@@ -2501,17 +2508,24 @@ public class MonetPreparedStatement
                if (hasTimeZone) {
                        // timezone shouldn't matter, since the server is 
timezone
                        // aware in this case
+                       if (mTimestampZ == null) {
+                               // first time usage, create and keep the 
mTimestampZ object for next usage
+                               mTimestampZ = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss.SSSZ");
+                       }
                        String RFC822 = mTimestampZ.format(x);
                        setValue(parameterIndex, "timestamptz '" +
                                        RFC822.substring(0, 26) + ":" + 
RFC822.substring(26) + "'");
                } else {
                        // server is not timezone aware for this field, and no
                        // calendar given, since we told the server our 
timezone at
-                       // connection creation, we can just write a plain 
timestamp
-                       // here
+                       // connection creation, we can just write a plain 
timestamp here
                        if (cal == null) {
                                setValue(parameterIndex, "timestamp '" + 
x.toString() + "'");
                        } else {
+                               if (mTimestamp == null) {
+                                       // first time usage, create and keep 
the mTimestamp object for next usage
+                                       mTimestamp = new 
SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+                               }
                                mTimestamp.setTimeZone(cal.getTimeZone());
                                setValue(parameterIndex, "timestamp '" + 
mTimestamp.format(x) + "'");
                        }
@@ -2613,7 +2627,7 @@ public class MonetPreparedStatement
         * @param val the exact String representation to set
         * @throws SQLException if the given index is out of bounds
         */
-       void setValue(int parameterIndex, String val) throws SQLException {
+       private void setValue(int parameterIndex, String val) throws 
SQLException {
                values[getParamIdx(parameterIndex)] = (val == null ? "NULL" : 
val);
        }
 
@@ -2628,9 +2642,7 @@ public class MonetPreparedStatement
         */
        private String transform() throws SQLException {
                StringBuilder buf = new StringBuilder(8 + 12 * size);
-               buf.append("exec ");
-               buf.append(id);
-               buf.append('(');
+               buf.append("exec ").append(id).append('(');
                // check if all columns are set and do a replace
                int col = 0;
                for (int i = 0; i < size; i++) {
@@ -2639,8 +2651,8 @@ public class MonetPreparedStatement
                        col++;
                        if (col > 1)
                                buf.append(',');
-                       if (values[i] == null) throw
-                               new SQLException("Cannot execute, parameter " + 
col + " is missing.", "M1M05");
+                       if (values[i] == null)
+                               throw new SQLException("Cannot execute, 
parameter " + col + " is missing.", "M1M05");
 
                        buf.append(values[i]);
                }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to