mybatis-3 icon indicating copy to clipboard operation
mybatis-3 copied to clipboard

NullPointerException on first query

Open pivsxii opened this issue 3 years ago • 1 comments

MyBatis version

3.2.7 (we have issues even with 3.3.0)

Database vendor and version

Oracle 19.12

Test case or example project

We're not able to provide an example project

Steps to reproduce

Running a query with a STRUCT object in a mapper (SDO_GEOMETRY in databases) for the first time

Expected result

Getting the result (column value)

Actual result

NullPointerException

Sorry for the little info posted, but we have a strange behaviour after the upgrade our DB from Oracle 18 to 19.12. Whenever we start our application the first query run over a table with a SDO_GEOMETRY column fails with NullPointerException

09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) Caused by: java.lang.NullPointerException: null
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at oracle.jdbc.driver.OracleResultSetMetaData.getColumnClassName(OracleResultSetMetaData.java:779) ~[ojdbc8.jar!/:19.12.0.0.0]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.resultset.ResultSetWrapper.<init>(ResultSetWrapper.java:61) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getFirstResultSet(DefaultResultSetHandler.java:188) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:143) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:60) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:73) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:60) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:137) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:96) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:77) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at sun.reflect.GeneratedMethodAccessor372.invoke(Unknown Source) ~[na:na]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_261]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_261]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at com.sun.proxy.$Proxy1855.query(Unknown Source) ~[na:na]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:108) ~[mybatis-3.2.7.jar:3.2.7]
09:14:32,434 INFO [stdout] (AsyncAppender-Worker-Thread-113) ... 222 common frames omitted

Here is the error log with 3.3:

09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) Caused by: java.lang.NullPointerException: null
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at oracle.jdbc.driver.OracleResultSetMetaData.getColumnClassName(OracleResultSetMetaData.java:779) ~[ojdbc8.jar!/:19.12.0.0.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.resultset.ResultSetWrapper.<init>(ResultSetWrapper.java:61) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getFirstResultSet(DefaultResultSetHandler.java:198) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:153) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_311]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_311]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_311]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_311]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,369 INFO [stdout] (AsyncAppender-Worker-Thread-124) at com.sun.proxy.$Proxy1858.query(Unknown Source) ~[na:na]
09:17:09,370 INFO [stdout] (AsyncAppender-Worker-Thread-124) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120) ~[mybatis-3.3.0.jar:3.3.0]
09:17:09,370 INFO [stdout] (AsyncAppender-Worker-Thread-124) ... 228 common frames omitted

After that everything runs smoothly and we find the reason why. In class BaseExecutor we noticed that the first time there's no cache and so there are 2 different flows from there.

      list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
      if (list != null) {
        handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
      } else {
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
      }

queryFromDatabase go through a couple of class reaching ResultSetWrapper and the exception is raised at

metaData.getColumnClassName(i)

Please find attached the Oracle driver we're using. It could be similar to https://github.com/mybatis/mybatis-3/issues/224 but even with 3.3.0 it keeps giving NullPointerException.

Thank you in advance.

Paolo

ojdbc8.zip

pivsxii avatar Nov 24 '21 08:11 pivsxii

Hello @pivsxii ,

We need a repro. Please create a small demo project like these and share it on your repository.

harawata avatar Nov 27 '21 17:11 harawata

No response. Closing.

harawata avatar Mar 08 '23 23:03 harawata