隨筆-153  評(píng)論-235  文章-19  trackbacks-0
                昨天出了一個(gè)奇怪的問題,hibernate通過實(shí)體Id(char(10)型)取得數(shù)據(jù),session.find("from TableName where id=?","value");取不到數(shù)據(jù),但數(shù)據(jù)庫里是有這個(gè)條數(shù)據(jù)。真奇怪,后來用pl/sql看數(shù)據(jù)庫,鼠標(biāo)點(diǎn)到Id那時(shí),可以看到內(nèi)容后面還有一些空格,帶著期望與質(zhì)疑把字段里的值自制過來, session.find("from TableName where id=?","value    ");后發(fā)現(xiàn)可以。我特別試了下connection.createStatement("select * from table_name where id='value'");則正常取數(shù)據(jù),session.find("from TableName where id=?","value");而卻找不到數(shù)據(jù),然后又試了下
          ptmt = connection.prepareStatement(select * from table_name where id=?");
          ptmt.setString(1,"year");

          這樣也不行,以是結(jié)論是:jdbc驅(qū)動(dòng)PrepareStatement對(duì)char字段類型的查找問題,因?yàn)閔ibernate是用PrepareStatement的,自然,hibernate對(duì)char對(duì)應(yīng)的屬性條件查找出現(xiàn)找不到的情況,

          解決辦法是:
          1.屬性用TRIM函數(shù)處理:session.find("from TableName where TRIM(id)=?","value");
          2.char改為varchar2類型

          今天試了下mysql,它不會(huì)這樣的情況,所以結(jié)論是:Oracle JDBC PreparedStatement的bug(有可能它故意這樣)


          posted on 2007-10-17 22:22 流浪汗 閱讀(5575) 評(píng)論(1)  編輯  收藏 所屬分類: oracle

          評(píng)論:
          # re: oracle jdbc char 字段 PreparedStatement 查詢問題 2007-12-26 10:26 | 流浪汗
          方法1有嚴(yán)重的性能問題。同學(xué)的機(jī)子1G內(nèi)存, 2800+CPU,有100W行數(shù)據(jù)如果用了TRIM要26秒才能找出。如果去掉TRIM不到1秒。

          得出結(jié)論:如果數(shù)據(jù)長度是固定的可以用CHAR和VARCHAR2類型,如果是可變長的數(shù)據(jù)不要使用CHAR,不然寫SQL又要拼了,不能用?(PrepareStatement)

          可以看下 oracle sql =號(hào)左邊含有 TRIM 嚴(yán)重影響性能!   回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 抚顺市| 抚远县| 鱼台县| 文水县| 临西县| 永新县| 习水县| 永和县| 方山县| 永修县| 芜湖县| 如皋市| 海城市| 景谷| 叙永县| 甘孜| 玉林市| 福安市| 股票| 柘城县| 锡林郭勒盟| 如东县| 车险| 资溪县| 剑河县| 成安县| 仙桃市| 白沙| 奉新县| 息烽县| 浦东新区| 云阳县| 云南省| 溆浦县| 五家渠市| 平江县| 余庆县| 仁化县| 汉川市| 蕲春县| 庆云县|