mybatis-3
mybatis-3 copied to clipboard
NullPointerException on first query
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
Hello @pivsxii ,
We need a repro. Please create a small demo project like these and share it on your repository.
No response. Closing.