2012-10-28 28 views
0

有含有未知列錯誤幾百個問題,但看着幾十後,沒有一個是一樣的我的問題。它們在select語句中似乎都是錯誤的,但在我的情況下,select語句a)有時可以從servelt中工作,b)始終可以從PHP中工作,c)始終可以從Squirrel SQL客戶端運行。間歇無效MySQLSyntaxErrorException:未知列「xxx.yyy在‘字段列表’ - Tomcat的

我有一個遺留系統,不能控制查詢。多年來,這些查詢在PHP mysql中運行良好。這個錯誤是間歇性的。

例如,所有的報告都正常,昨晚工作。今天早上我再次嘗試了這個服務,並且一些查詢失敗了,從Tomcat服務器(Linux Centos,Java 1.6,Tomcat 6)的MySQLSyntaxErrorException。我將war文件的副本複製到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; 
+0

您可以發送您正在使用的查詢嗎? – sunleo

+1

他說他不被允許顯示查詢。你有權訪問MySQL服務器日誌嗎?您可能需要打開常規查詢日誌並打開所有警告選項。請參閱http://dev.mysql.com/doc/refman/5.0/en/server-logs.html –

+0

原來,它與JDBC無關(即使尚未解決)。從tomcat服務器的mysql命令行客戶端也會出現同樣的問題。該查詢在本地運行良好,並且在另一主機上使用JDBC客戶端運行。 –

回答

1

我敢打賭,你失去的數據包。看看你的服務器日誌或網絡設備,看看數據包是否被丟棄或有問題。

+1

如果超過max_allowed_pa​​cket,是否知道'JDBC'驅動拋出了什麼'Exception'?如果它在某些時候只是在查詢上失敗,那可能是在這些情況下較長的參數會導致超出這個大小。 http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html –

+0

該手冊指出此錯誤會導致連接關閉。這沒有發生 - 我們所得到的是帶有無效列消息的語法異常。 –

相關問題