Oracle PreparedStatement - 一些开发人员的 NullPointerException,但不是全部
Oracle PreparedStatement - NullPointerException for some developers, but not all
项目概览
我有一个具有以下属性的项目:
- 数据库: Oracle 12c
- 1 table: MY_TABLE
- 2 列:
- ID: PK,VARCHAR2,32 字节大小限制,默认值 = SYS_GUID()
- MY_OBJ: 存储一个 JSON 对象以备将来使用
- 应用程序 Framework/Platform: Spring, Java 8u77
问题
我正在尝试 运行 以下准备好的语句,它应该为插入的对象输出新生成的 key/ID。不幸的是,我不断收到与语句相关的 NullPointerException。
奇怪的是,我们团队中有 75% 的人遇到了同样的问题,而我们团队中的其他 25% 的代码工作正常。
问题
为什么以下代码在一台机器上运行正常,但在其他机器上返回错误?
我如何使它在所有机器上工作?
代码
ObjectMapper mapper = new ObjectMapper();
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
jdbcOracle.update(new PreparedStatementCreator() { //Line 60: This line cited as containing NullPointerException error.
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("INSERT INTO MY_TABLE (MY_OBJ) VALUES (?)", new String[] {"ID"});
try {
ps.setString(1, mapper.writeValueAsString(myObj));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return ps;
}
}, generatedKeyHolder);
System.out.println("Generated Key: " + (String)generatedKeyHolder.getKeys().get("ID"));
尝试过的解决方案
- 我们创建了带有序列的备用 table,而不是默认为 SYS_GUID()。
- 我们尝试使用
System.RETURN_GENERATED_KEY
而不是 new String[] {"ID"}
- 我们确保所有机器上的数据库权限都相同。
- 我们确认数据库驱动程序在所有机器上都是相同的。
- 我可以删除
, new String[] {"ID"}
参数和 , generatedKeyHolder
参数来将 preparedStatement 设置为 运行,但是由于我正在尝试获取生成的密钥,这显然打败了目的。
堆栈跟踪
2016-05-04 00:05:43.148 ERROR 3156 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at oracle.jdbc.driver.AutoKeyInfo.initMetaDataColumnIndexes(AutoKeyInfo.java:423) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at oracle.jdbc.driver.AutoKeyInfo.initMetaData(AutoKeyInfo.java:396) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at oracle.jdbc.driver.OracleReturnResultSet.getMetaData(OracleReturnResultSet.java:77) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at org.springframework.jdbc.core.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:52) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:48) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.doInPreparedStatement(JdbcTemplate.java:911) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.doInPreparedStatement(JdbcTemplate.java:900) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:900) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at com.mysite.impl.MyImpl.save(MyImpl.java:60)
12.1.0.1 有一个关于密钥生成的错误。使用 Oracle JDBC 驱动程序版本 12.1.0.2。
Link: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
项目概览
我有一个具有以下属性的项目:
- 数据库: Oracle 12c
- 1 table: MY_TABLE
- 2 列:
- ID: PK,VARCHAR2,32 字节大小限制,默认值 = SYS_GUID()
- MY_OBJ: 存储一个 JSON 对象以备将来使用
- 应用程序 Framework/Platform: Spring, Java 8u77
问题
我正在尝试 运行 以下准备好的语句,它应该为插入的对象输出新生成的 key/ID。不幸的是,我不断收到与语句相关的 NullPointerException。
奇怪的是,我们团队中有 75% 的人遇到了同样的问题,而我们团队中的其他 25% 的代码工作正常。
问题
为什么以下代码在一台机器上运行正常,但在其他机器上返回错误?
我如何使它在所有机器上工作?
代码
ObjectMapper mapper = new ObjectMapper();
KeyHolder generatedKeyHolder = new GeneratedKeyHolder();
jdbcOracle.update(new PreparedStatementCreator() { //Line 60: This line cited as containing NullPointerException error.
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("INSERT INTO MY_TABLE (MY_OBJ) VALUES (?)", new String[] {"ID"});
try {
ps.setString(1, mapper.writeValueAsString(myObj));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return ps;
}
}, generatedKeyHolder);
System.out.println("Generated Key: " + (String)generatedKeyHolder.getKeys().get("ID"));
尝试过的解决方案
- 我们创建了带有序列的备用 table,而不是默认为 SYS_GUID()。
- 我们尝试使用
System.RETURN_GENERATED_KEY
而不是new String[] {"ID"}
- 我们确保所有机器上的数据库权限都相同。
- 我们确认数据库驱动程序在所有机器上都是相同的。
- 我可以删除
, new String[] {"ID"}
参数和, generatedKeyHolder
参数来将 preparedStatement 设置为 运行,但是由于我正在尝试获取生成的密钥,这显然打败了目的。
堆栈跟踪
2016-05-04 00:05:43.148 ERROR 3156 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at oracle.jdbc.driver.AutoKeyInfo.initMetaDataColumnIndexes(AutoKeyInfo.java:423) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at oracle.jdbc.driver.AutoKeyInfo.initMetaData(AutoKeyInfo.java:396) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at oracle.jdbc.driver.OracleReturnResultSet.getMetaData(OracleReturnResultSet.java:77) ~[ojdbc7-12.1.0.jar:12.1.0.1.0]
at org.springframework.jdbc.core.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:52) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.ColumnMapRowMapper.mapRow(ColumnMapRowMapper.java:48) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.doInPreparedStatement(JdbcTemplate.java:911) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.doInPreparedStatement(JdbcTemplate.java:900) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:900) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at com.mysite.impl.MyImpl.save(MyImpl.java:60)
12.1.0.1 有一个关于密钥生成的错误。使用 Oracle JDBC 驱动程序版本 12.1.0.2。 Link: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html