Browse Source

Revise documentation notes on getParameterType performance issues

See gh-25679

(cherry picked from commit 939c76c4a5)
pull/23967/head
Juergen Hoeller 6 years ago
parent
commit
400b39da3f
  1. 13
      spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java
  2. 2
      src/docs/asciidoc/data-access.adoc

13
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()} * completely, i.e. to never even attempt to retrieve {@link PreparedStatement#getParameterMetaData()}
* for {@link StatementCreatorUtils#setNull} calls. * for {@link StatementCreatorUtils#setNull} calls.
* <p>The default is "false", trying {@code getParameterType} calls first and falling back to * <p>The default is "false", trying {@code getParameterType} calls first and falling back to
* {@link PreparedStatement#setNull} / {@link PreparedStatement#setObject} calls based on well-known * {@link PreparedStatement#setNull} / {@link PreparedStatement#setObject} calls based on
* behavior of common databases. Spring records JDBC drivers with non-working {@code getParameterType} * well-known behavior of common databases.
* implementations and won't attempt to call that method for that driver again, always falling back. * <p>Consider switching this flag to "true" if you experience misbehavior at runtime,
* <p>Consider switching this flag to "true" if you experience misbehavior at runtime, e.g. with * e.g. with connection pool issues in case of an exception thrown from {@code getParameterType}
* a connection pool setting back the {@link PreparedStatement} instance in case of an exception * (as reported on JBoss AS 7) or in case of performance problems (as reported on PostgreSQL).
* thrown from {@code getParameterType} (as reported on JBoss AS 7).
*/ */
public static final String IGNORE_GETPARAMETERTYPE_PROPERTY_NAME = "spring.jdbc.getParameterType.ignore"; public static final String IGNORE_GETPARAMETERTYPE_PROPERTY_NAME = "spring.jdbc.getParameterType.ignore";
@ -266,7 +265,7 @@ public abstract class StatementCreatorUtils {
} }
else if (databaseProductName.startsWith("DB2") || else if (databaseProductName.startsWith("DB2") ||
jdbcDriverName.startsWith("jConnect") || jdbcDriverName.startsWith("jConnect") ||
jdbcDriverName.startsWith("SQLServer")|| jdbcDriverName.startsWith("SQLServer") ||
jdbcDriverName.startsWith("Apache Derby")) { jdbcDriverName.startsWith("Apache Derby")) {
sqlTypeToUse = Types.VARCHAR; sqlTypeToUse = Types.VARCHAR;
} }

2
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 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` 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) (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, Alternatively, you might consider specifying the corresponding JDBC types explicitly,
either through a 'BatchPreparedStatementSetter' (as shown earlier), through an explicit type either through a 'BatchPreparedStatementSetter' (as shown earlier), through an explicit type

Loading…
Cancel
Save