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

          這樣也不行,以是結論是:jdbc驅動PrepareStatement對char字段類型的查找問題,因為hibernate是用PrepareStatement的,自然,hibernate對char對應的屬性條件查找出現找不到的情況,

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

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


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

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

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

          可以看下 oracle sql =號左邊含有 TRIM 嚴重影響性能!   回復  更多評論
            
          主站蜘蛛池模板: 新邵县| 宾川县| 通辽市| 双桥区| 北海市| 成都市| 海淀区| 团风县| 平遥县| 定日县| 德清县| 永昌县| 睢宁县| 鹿邑县| 江津市| 邢台县| 深水埗区| 九龙城区| 武威市| 浦北县| 柘城县| 大余县| 承德县| 石屏县| 始兴县| 安国市| 聂拉木县| 隆安县| 林西县| 墨竹工卡县| 东源县| 大悟县| 开江县| 襄垣县| 宿松县| 光山县| 水城县| 伊宁县| 长丰县| 武山县| 襄汾县|