From 400b39da3f09a2e6f4462104f6ffbaa5fb778e8f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 5 Sep 2020 13:00:06 +0200 Subject: [PATCH] Revise documentation notes on getParameterType performance issues See gh-25679 (cherry picked from commit 939c76c4a52455349cbbc21c1a8639629f8fed80) --- .../jdbc/core/StatementCreatorUtils.java | 13 ++++++------- src/docs/asciidoc/data-access.adoc | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java index 8d12b1fbd369..e3562f3eeddd 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java @@ -66,12 +66,11 @@ public abstract class StatementCreatorUtils { * completely, i.e. to never even attempt to retrieve {@link PreparedStatement#getParameterMetaData()} * for {@link StatementCreatorUtils#setNull} calls. *

The default is "false", trying {@code getParameterType} calls first and falling back to - * {@link PreparedStatement#setNull} / {@link PreparedStatement#setObject} calls based on well-known - * behavior of common databases. Spring records JDBC drivers with non-working {@code getParameterType} - * implementations and won't attempt to call that method for that driver again, always falling back. - *

Consider switching this flag to "true" if you experience misbehavior at runtime, e.g. with - * a connection pool setting back the {@link PreparedStatement} instance in case of an exception - * thrown from {@code getParameterType} (as reported on JBoss AS 7). + * {@link PreparedStatement#setNull} / {@link PreparedStatement#setObject} calls based on + * well-known behavior of common databases. + *

Consider switching this flag to "true" if you experience misbehavior at runtime, + * e.g. with connection pool issues in case of an exception thrown from {@code getParameterType} + * (as reported on JBoss AS 7) or in case of performance problems (as reported on PostgreSQL). */ public static final String IGNORE_GETPARAMETERTYPE_PROPERTY_NAME = "spring.jdbc.getParameterType.ignore"; @@ -266,7 +265,7 @@ private static void setNull(PreparedStatement ps, int paramIndex, int sqlType, @ } else if (databaseProductName.startsWith("DB2") || jdbcDriverName.startsWith("jConnect") || - jdbcDriverName.startsWith("SQLServer")|| + jdbcDriverName.startsWith("SQLServer") || jdbcDriverName.startsWith("Apache Derby")) { sqlTypeToUse = Types.VARCHAR; } diff --git a/src/docs/asciidoc/data-access.adoc b/src/docs/asciidoc/data-access.adoc index 309f8b20a6c0..0771e7ce6b34 100644 --- a/src/docs/asciidoc/data-access.adoc +++ b/src/docs/asciidoc/data-access.adoc @@ -3498,7 +3498,7 @@ While this usually works well, there is a potential for issues (for example, wit case, which can be expensive with your JDBC driver. You should use a recent driver version and consider setting the `spring.jdbc.getParameterType.ignore` property to `true` (as a JVM system property or in a `spring.properties` file in the root of your classpath) -if you encounter a performance issue -- for example, as reported on Oracle 12c (SPR-16139). +if you encounter a performance issue (as reported on Oracle 12c, JBoss and PostgreSQL). Alternatively, you might consider specifying the corresponding JDBC types explicitly, either through a 'BatchPreparedStatementSetter' (as shown earlier), through an explicit type