不明な列エラーを含む数百の質問がありますが、数十を調べた後、私の問題と同じものはありません。これらはすべて実際にはselectステートメントのエラーのようですが、私の場合、selectステートメントはa)servltから機能する場合があり、b)PHPから一貫して機能し、c)SquirrelSQLクライアントから一貫して機能します。
私はレガシーシステムを持っていて、クエリを制御できません。クエリは、PHPmysqlから何年もの間正常に機能しています。このエラーは断続的に発生します。
たとえば、昨夜はすべてのレポートが正しく機能していました。今朝、サービスを再試行しましたが、Tomcatサーバー(Linux Centos、Java 1.6、Tomcat 6)からのMySQLSyntaxErrorExceptionで一部のクエリが失敗しました。warファイルのコピーをTomcatのwebappディレクトリにコピーして、Tomcatにサーブレットをリロードさせたところ、クエリが再び正しく機能しました。別のホスト上のMySQLサーバーは、Centos5では5.0.17です。
詳細:昨日、Tomcatがしばらくアイドル状態だったときに発生したようです。数時間後にアプリケーションに戻ったとき、非常に複雑なクエリで一時的にこのエラーが発生しました。アプリケーションには、機能したそれほど複雑でないクエリがたくさんあります。これらを数回実行すると、突然、複雑なクエリが機能し始めました。これは昨日3、4回起こりました。しかし、反例として、複雑なクエリは今朝初めて機能しました。これはTomcat5.5でも発生しています。
mysqlサーバーログにメッセージはありません。最大パケット長を増やしましたが、現時点では警告をオンにできません。
また、このクエリはmysql-connector-java-5.1.22-bin.jarで一貫して失敗していましたが、mysql-connector-java-5.1.15-bin.jarにダウングレードすると、正しく動作が断続的に開始されました。クエリをWindowsのSquirrelSQLクライアントにコピーすると、正しく機能します。
サーブレットはApachePOIを使用して、このクエリの結果を使用してスプレッドシートを作成しています。
このソフトウェアの組み合わせに既知の問題はありますか?
新情報 **
クエリの長さとは関係ありません。これは、ステートメント、スタックトレース、および無実を保護するために名前が変更されたテーブル定義の短い例です。サーブレットは時々成功し、SquirrelSQLに貼り付けるとクエリは正常に機能することに注意してください。クライアント側にもサーバー側にも、他のメッセージや警告はありません。一貫して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;