0

包含未知列错误的问题有几百个,但看了几十个,没有一个与我的问题相同。它们实际上都是 select 语句中的错误,但在我的情况下,select 语句 a) 有时在servelt 中工作,b) 在 PHP 中始终有效,c) 在 Squirrel SQL 客户端中始终有效。

我有一个遗留系统,无法控制查询。多年来,这些查询在 PHP mysql 中运行良好。此错误是间歇性的。

例如,昨晚所有报告都正常工作。今天早上,我再次尝试了该服务,但由于 Tomcat 服务器(Linux Centos、Java 1.6、Tomcat 6)的 MySQLSyntaxErrorException,一些查询失败了。我将战争文件的副本复制到 Tomcat 的 webapp 目录中,以使 Tomcat 重新加载 servlet,并且查询再次正常工作。MySQL 服务器在不同的主机上,在 Centos 5 上是 5.0.17。

更多细节:昨天它似乎发生在 Tomcat 空闲一段时间 - 当我在几个小时后回到应用程序时,非常复杂的查询有一段时间遇到了这个错误。该应用程序有很多不太复杂的查询有效 - 我运行了几次然后突然复杂的查询开始工作。昨天发生了三四次。但作为一个反例,复杂的查询今天早上第一次工作。它也发生在 Tomcat 5.5 中。

mysql 服务器日志中没有消息;尽管我确实增加了最大数据包长度,但我目前无法打开警告。

此外,此查询与 mysql-connector-java-5.1.22-bin.jar 一致失败,但是当我降级到 mysql-connector-java-5.1.15-bin.jar 时,工作间歇性地正常启动。将查询复制到 Windows 上的 Squirrel SQL 客户端会导致它正常工作。

servlet 正在使用 Apache POI 来使用此查询的结果来制作电子表格。

这种软件组合是否存在已知问题?

新的信息 **

这与查询的长度无关。这是一个简短的示例,其中包含更改名称以保护无辜者的语句、堆栈跟踪和表定义;请注意,servlet 有时会成功,并且查询在粘贴到 Squirrel SQL 时工作正常。客户端或服务器端都没有其他消息或警告。还有一些类似的查询在 100% 的时间内始终有效。

询问

SELECT SQL_CALC_FOUND_ROWS aa_bbb_cccc.id, aa_bbb_cccc.user_id, aa_bbb_cccc.user, aa_bbb_cccc.state, aa_bbb_cccc.time_stamp, aa_bbb_cccc.c20, aa_bbb_cccc.c12, aa_bbb_cccc.c21, aa_bbb_cccc.c22, aa_bbb_cccc.c23, aa_bbb_cccc.c13, aa_bbb_cccc.c15, aa_bbb_cccc.c14, aa_bbb_cccc.c16, aa_bbb_cccc.c13b, aa_bbb_cccc.c13c FROM aa_bbb_cccc WHERE 1=1

堆栈跟踪

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'aa_bbb_cccc.c21' in 'field list'
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.Util.getInstance(Util.java:386)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2728)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2678)
        at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1612)
        ...

表定义

CREATE TABLE `aa_bbb_cccc` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL,
  `user` varchar(255) NOT NULL,
  `state` varchar(255) NOT NULL,
  `time_stamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `c20` varchar(255) default NULL,
  `c12` varchar(255) default NULL,
  `c13` varchar(255) default NULL,
  `c15` varchar(255) default NULL,
  `c14` varchar(255) default NULL,
  `c16` varchar(255) default NULL,
  `c13b` varchar(255) default NULL,
  `xx_yy` int(11) default NULL,
  `c13c` text,
  `key2` int(11) NOT NULL default '0',
  `c21` varchar(255) default NULL,
  `c22` varchar(255) default NULL,
  `c23` varchar(255) default NULL,
  PRIMARY KEY  (`id`,`key2`),
  KEY `user_id` (`user_id`),
  KEY `user` (`user`),
  KEY `state` (`state`),
  KEY `time_stamp` (`time_stamp`),
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4

1 回答 1

1

我敢打赌你正在丢失数据包。查看您的服务器日志或网络设备,看看数据包是否被丢弃或有问题。

于 2012-10-28T18:34:29.840 回答