【问题标题】:SnappyData JDBC driver raising SQLState=XCL14 errorSnappyData JDBC 驱动程序引发 SQLState=XCL14 错误
【发布时间】:2016-07-26 22:36:22
【问题描述】:

SnappyData v.0-5 w/ ClientDriver JDBC 驱动程序。

我在 SnappyData 中有一个名为:sensor_data 的持久行表。

在 snappy> shell 中,此查询返回数千行。

snappy> select * from sensor_data where year_num = 2013 and month_num = 1;

在 SpringBoot 中从 JDBC 连接运行时,出现此错误:

PreparedStatementCallback; SQL 的未分类 SQLException [选择 * 来自 sensor_data where year_num = ?和month_num = ?]; SQL 状态 [XCL14];错误代码[20000]; (SQLState=XCL14 严重性=20000) 列位置“1”超出范围。这个的列数 结果集为“0”。

Java 代码是:

List<SensorData> list = jdbcTemplateBean.query("select * from sensor_data where year_num = ? and month_num = ?", 
                new Object[] {year, month},  new SensorDataRowMapper());

我需要做什么来解决这个 JDBC 问题?

在 Spring 启动时修剪 Stacktrace:

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; SQL 的未分类 SQLException [选择 * 来自 sensor_data where year_num = ?和month_num = ?]; SQL 状态 [XCL14];错误代码[20000]; (SQLState=XCL14 严重性=20000) 列位置“1”超出范围。这个的列数 结果集是'0'。;嵌套异常是 java.sql.SQLException: (SQLState=XCL14 Severity=20000) 列位置 '1' 超出 范围。此 ResultSet 的列数为“0”。在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645) 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:680) 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:707) 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:757) 在 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192) 在 org.kritek.scalability.repository.SensorDataRepository.findByYearAndMonth(SensorDataRepository.java:58) ... 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 在 java.lang.Thread.run(Thread.java:745) 引起: java.sql.SQLException: (SQLState=XCL14 Severity=20000) 列 位置“1”超出范围。这个的列数 结果集为“0”。 ... 原因:ERROR XCL14:列位置“1”不在 范围。此 ResultSet 的列数为“0”。在 com.pivotal.gemfirexd.internal.client.am.ColumnMetaData.checkForValidColumnIndex(ColumnMetaData.java:856) 在 com.pivotal.gemfirexd.internal.client.am.ColumnMetaData.getColumnType(ColumnMetaData.java:638) ... 72 更多

【问题讨论】:

  • 能否请您从 snappydata 服务器日志文件中添加异常堆栈跟踪?
  • 服务器上发生的日志记录为零。它没有通过 ClientDriver。 ClientDriver 似乎不喜欢参数化的 PreparedStatements(例如?)。我把这两个参数取出来,把年月硬编码,然后它执行 SQL 到 snappy 服务器。

标签: snappydata


【解决方案1】:

从堆栈看来,NamedParameterJdbcTemplate 正在被使用,但是 '?'正在使用占位符。对于NamedParameterJdbcTemplate,您需要使用命名参数,例如here

我会推荐使用标准的“?”占位符机制与JdbcTemplate 类似:

private JdbcTemplate jdbcTemplateBean;

public void setDataSource(DataSource dataSource) {
  this.jdbcTemplateBean = new JdbcTemplate(dataSource);
}

List<SensorData> list = jdbcTemplateBean.query(
    "select * from sensor_data where year_num = ? and month_num = ?",
    new Object[] { year, month },  new SensorDataRowMapper());

【讨论】:

  • 我尝试了这两种方法(使用 :year 和 :month 命名,并再次使用老式的 '?' 命名),但它们都因相同的错误而失败。当我扫描日志以将错误放入 StackOverflow 时,我在第一次尝试使用 NamedParameterJdbcTemplate 时错误地发布了堆栈跟踪。对此感到抱歉。总之,这两种方法都行不通。
【解决方案2】:

问题已解决。这是发生了什么...... SnappyData 将查询路由到 Spark,因为它确定它无法处理它。 Spark 对 JDBC PreparedStatements 或绑定变量一无所知,并引发了错误。为了解决这个问题,我必须在我的 DataSource 配置中设置 SnappyData JDBC 属性“route-query = false”。这确保了它不会被路由到 Spark。

【讨论】:

  • 请注意,我们已经在 master 分支中修复了这个问题,修复将在下一个版本中。
猜你喜欢
  • 2013-08-27
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2012-09-16
  • 2013-03-26
相关资源
最近更新 更多