隨筆-46  評論-54  文章-0  trackbacks-0
           

          同事在公司論壇里面發的,其實是我接手的一個項目中存在這個問題。
          在使用Hibernate分頁器時,習慣使用直接把查詢語句、頁數、分頁大小,傳給分頁器,這樣會默認使用last來獲取總記錄數,效率非常的低。
          解決方法,很簡單,就是用SQL來count查詢條件獲得總記錄的Query,再給Hibernate分頁器(本身就寫好了的)。
          這樣就必須多寫幾行代碼,就是因為自己懶,覺著效果都一樣,就簡單的寫了。
          數據量大了以后,就很明顯的速度慢下來了。又全部重頭改過,很是郁悶。
          轉載此文,以示提醒!
          即使懶得研究Hibernate底層,也要注意它的效率問題。

           

           

          我看到一些資料這樣說,oracle的jdbc驅動是不支持服務器端的游標的,當你調用resultSet.last()時,jdbc驅動程序會把整個結果集的數據讀到內存,然后在內存中進行結果集的遍歷。

          如果在做分頁的時候,用這樣的方式獲取結果的總記錄數:
            rs.last();
            int rowcount = rs.getRow();
          在結果集很大的時候,這個性能是相當低下的,并且會用掉很多的內存。

          這個問題是昨天在檢查人才網的代碼時發現的,隨著數據增加,原來被掩蓋的問題才開始暴露出來。我們用jprofiler對程序進行剖析的情況也間接的證明了上面的說法:1) 連續幾次刷新工作列表后,虛擬機的內存被占滿了,運行垃圾回收后內存又被釋放出來。2) 從頁面請求到完成響應,resultSet.last()方法的調用占去了cpu的絕大部分時間。

          因為上面提到的分頁方法是一種常用的方法,我建議大家考慮一下自己的代碼是否存在這樣的問題,這對辦公系統的穩定運行可能是很重要的。


          參考:
          http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/jdbc/rs/CountResult.html
          提到了:
          如果 ResultSet 非常大,則 resultset.last() 有可能是非常費時的操作,因為它將使用服務器端的更多資源。因此,除非確實需要可滾動結果集,應避免使用這種方法。

          http://forum.springframework.org/showthread.php?t=50044&page=2
          提到了:
          Anyway, if it's a normal behaviour of the oracle driver to keep data in memory when using SCROLLABLE resultset

          http://xiongbo.javaeye.com/blog/38481
          對幾種游標類型做了介紹,并給出了建議

          posted @ 2008-05-28 11:26 rox 閱讀(4195) | 評論 (4)編輯 收藏
               摘要: 1、float.js  1    var delta=0.35;  2    var collection;  3    var closeB=false;  4   &n...  閱讀全文
          posted @ 2008-05-28 11:01 rox 閱讀(703) | 評論 (0)編輯 收藏
               摘要: Illegal class inheritance loop. 使用JAXB 2.0以上版本,使用schema文件綁定Java對象,并配置了外部配置文件binding.xjb后,出現這個錯誤。 現已解決,如下: 1、schema文件po.xsd:  1<?xml version="1.0" encoding="utf-8"?>  2...  閱讀全文
          posted @ 2008-05-02 16:57 rox 閱讀(2596) | 評論 (0)編輯 收藏

          這兩句SQL區別是有沒有括號,但卻是一個可以查出來,一個幾乎查不出來。
          一個簡單的問題,居然還犯低級錯誤,留下來提醒自己。

           

          1select uj.* from union_job uj , union_company uc where (uj.name like '%職員%' or uj.info like '%職員%'and uj.company_id=uc.id and uc.area= '廣東' order by uj.uptime desc

          1select uj.* from union_job uj , union_company uc where uj.name like '%職員%' or uj.info like '%職員%' and uj.company_id=uc.id and uc.area= '廣東' order by uj.uptime desc
          posted @ 2008-04-23 17:33 rox 閱讀(167) | 評論 (0)編輯 收藏

          1、修改啟動文件:
          vi /etc/rc.d/rc.local

          2、編輯并追加tomcat的啟動:
          #!/bin/sh
          echo "start tomcat">/var/log/tomcatmessages
          rm -rf /appserver/gooweb-tomcat-5.5.20/work/
          /appserver/gooweb-tomcat-5.5.20/bin/catalina.sh start

          注意:JAVA_HOME等環境變量還不會被加載的,這里是使用setenv.sh來加載的。

          3、修改計劃任務列表:
          crontab -e

          4、添加重啟任務:
          SHELL=/bin/bash
          PATH=/sbin:/bin:/usr/sbin:/usr/bin
          MAILTO=root
          HOME=/
          # run-parts
          01 0 * * 0 reboot

          定義為每周0點01分重啟系統。

          5、重啟計劃任務的服務:
          service crond restart

          6、查看日志
          tail -100 /var/log/cron


          另外要非常注意這里所有修改的文件都一定要 chmod +x
          不然要吃大虧。呵呵!

          posted @ 2007-12-27 16:42 rox 閱讀(1504) | 評論 (3)編輯 收藏
          浮動廣告代碼很多了,不介紹了。
          但是對于flash或者下拉框,是容易被遮擋的。

          1、flash的解決:
          ??? <!--1.設置FLASH為底層-->
          ??? <div style="z-index:-1">
          ??? <!--2.必須把FLASH設置為透明-->
          ??? <param name="wmode" value="transparent">

          2、下拉框的解決:
          ??? 因為下拉框的index是最高的,怎么調整都沒有用。
          ??? 所以,浮動層里面要增加一個iframe,里面再src近來一個新頁面,這個頁面就是廣告頁面。
          ???
          ?1?<!--?浮云?-->
          ?2?<div?id="fuyun"?style="Z-INDEX:?99999999999;?LEFT:?4px;?WIDTH:?100px;?POSITION:?absolute;?TOP:?372px;?HEIGHT:?100px">?
          ?3?<p?align="center">
          ?4?<iframe?height="80"?width="80"?frameborder="0"?scrolling="no"?hspace="0"?vspace="0"?style="padding:0;?margin:0"?src="ad_kfc/fy_kfc.html">
          ?5?</iframe>
          ?6?</p>
          ?7?</div>
          ?8?<script?language="JavaScript"?src="js/fy.js"></script>
          ?9?<SCRIPT?LANGUAGE="JavaScript">
          10?<!--
          11?????start();
          12?//-->
          13?</SCRIPT>

          其中這個src頁面代碼如下:
          1?<html>
          2?<head>
          3?<title>?fy?kfc?</title>
          4?</head>
          5?<body?style="padding:0;?margin:0">
          6?<a?href="/public/enterprise.do?id=29838"?target="_blank"><img?src="kfc.gif"?width="80"?height="80"?border=0></a>
          7?</body>
          8?</html>
          9?

          還是把浮動窗口的js代碼貼上來,原來網上找的代碼,參數名字過于簡單,怕多個js一起調用時會重名。自己改了一下的

          ?1?var?fuyun?=?document.getElementById("fuyun");
          ?2?var?fy_xPos?=?20;
          ?3?var?fy_yPos?=?document.body.clientHeight;
          ?4?var?fy_step?=?1;
          ?5?var?fy_delay?=?30;?
          ?6?var?fy_height?=?0;
          ?7?var?fy_Hoffset?=?0;
          ?8?var?fy_Woffset?=?0;
          ?9?var?fy_yon?=?0;
          10?var?fy_xon?=?0;
          11?var?fy_pause?=?true;
          12?var?interval;
          13?fuyun.style.top?=?fy_yPos;
          14?function?changePos()?{
          15?fy_width?=?document.body.clientWidth;
          16?fy_height?=?document.body.clientHeight;
          17?fy_Hoffset?=?fuyun.offsetHeight;
          18?fy_Woffset?=?fuyun.offsetWidth;
          19?fuyun.style.left?=?fy_xPos?+?document.body.scrollLeft;
          20?fuyun.style.top?=?fy_yPos?+?document.body.scrollTop;
          21?if?(fy_yon)?{
          22?fy_yPos?=?fy_yPos?+?fy_step;
          23?}
          24?else?{
          25?fy_yPos?=?fy_yPos?-?fy_step;
          26?}
          27?if?(fy_yPos?<?0)?{
          28?fy_yon?=?1;
          29?fy_yPos?=?0;
          30?}
          31?if?(fy_yPos?>=?(fy_height?-?fy_Hoffset))?{
          32?fy_yon?=?0;
          33?fy_yPos?=?(fy_height?-?fy_Hoffset);
          34?}
          35?if?(fy_xon)?{
          36?fy_xPos?=?fy_xPos?+?fy_step;
          37?}
          38?else?{
          39?fy_xPos?=?fy_xPos?-?fy_step;
          40?}
          41?if?(fy_xPos?<?0)?{
          42?fy_xon?=?1;
          43?fy_xPos?=?0;
          44?}
          45?if?(fy_xPos?>=?(fy_width?-?fy_Woffset))?{
          46?fy_xon?=?0;
          47?fy_xPos?=?(fy_width?-?fy_Woffset);
          48?}
          49?}
          50?function?start()?{
          51?fuyun.visibility?=?"visible";
          52?interval?=?setInterval('changePos()',?fy_delay);
          53?
          54?}
          55?function?fy_pause_resume()?{
          56?if(fy_pause)?{
          57?clearInterval(interval);
          58?fy_pause?=?false;
          59?}
          60?else?{
          61?interval?=?setInterval('changePos()',fy_delay);
          62?fy_pause?=?true;
          63?}
          64?}


          不提倡使用浮動廣告,現在多半都是懸浮廣告了。只是客戶指定要,而且還要不被遮擋,在多人的幫助下,終于解決了這個問題。

          大家可以到 http://www.jobhn.cn 網站上看看實際的效果。
          posted @ 2007-02-14 09:55 rox 閱讀(556) | 評論 (2)編輯 收藏
          mysql數據庫,庫名以目錄名存在,表名以文件名(后綴為.frm.MYD.MYI)存在。

          如test庫下user表,在windows中%mysql_home%\data\test\user.frm,windows文件名大小寫不敏感,
          無論是 select * from test.user 還是 select * from test.USER,都是沒有問題的。

          而在linux中/var/lib/mysql/test/user.frm,
          如果是 select * from test.user 就必須存在 user.frm
          如果是 select * from test.USER 就必須存在 USER.frm
          這是兩個不同的文件,也是兩個不同的表名。
          同樣庫名是以目錄存在,也存在區分大小寫的問題。

          相關的官方文檔:

          http://dev.mysql.com/doc/refman/5.1/en/identifier-case-sensitivity.html


          http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#name-case-sensitivity
          posted @ 2007-01-29 09:40 rox 閱讀(1677) | 評論 (2)編輯 收藏

          這里可以實現類對象數組。方便自己存儲和封裝數據用。

           1 function MyClass() {
           2   this.myData = 5
           3   this.myString = "Hello World";
           4 }
           5 
           6 var myClassObj1 = new MyClass();
           7 var myClassObj2 = new MyClass();
           8 myClassObj1.myData = 10;
           9 myClassObj1.myString = "Obj1:  Hello World";
          10 myClassObj2.myData = 20;
          11 myClassObj2.myString = "Obj2:  Hello World"
          12 
          13 var array = Array();
          14 array[0= myClassObj1;
          15 array[1= myClassObj2;
          16 
          17 for (i = 0; i < array.length; i++) {
          18     alert(array[i].myData);
          19     alert(array[i].myString);
          20 }
          posted @ 2006-11-29 11:57 rox 閱讀(997) | 評論 (0)編輯 收藏
          1 < c:import  url ="/site/All.html"  var ="url"   />
          2 < c:if  test ="${ not empty url }" >
          3      < x:parse  var ="doc"  xml ="${url}"   />
          4      < x:forEach  select ="$doc/sites/site"  var ="s" >
          5          < x:if  select ="$s/@id = '0'" >
          6              < x:out  select ="$s/@id" />
          7          </ x:if >
          8      </ x:forEach >
          9 </ c:if >

           相同結果代碼: 

          1<c:import url ="/site/All.html"  var ="url"/> 
          2<c:if test ="${ not empty url }">
          3    <x:parse var="doc" xml="${url}"/> 
          4    <x:forEach select="$doc/sites" var="s">
          5        <x:out select="$s/site[@id='0']"/>
          6        <x:out select="./site[@id='0']"/>
          7    </x:forEach> 
          8</c:if > 

           



          參考URL:

          http://java.sun.com/developer/technicalArticles/javaserverpages/faster/

          http://www.mokabyte.it/2002/12/jstl-3.htm

          http://www.w3school.com.cn/xpath/

          posted @ 2006-11-07 10:27 rox 閱讀(699) | 評論 (0)編輯 收藏
          MySql只支持Union(并集)集合運算,好像也是4.0以后才有的;
          但是對于交集Intersect、差集Except,就沒有實現了。
          一般的解決方案用in和not in來解決,小量數據還可以,但數據量大了效率就很低了。
          其實,可以使用Union來實現另外兩種的運算,當然是沒有辦法的辦法。

          差集Except:
          SELECT ID FROM (
          SELECT DISTINCT A.AID AS ID FROM TABLE_A A
          UNION ALL
          SELECT DISTINCT B.BID AS ID FROM TABLE_B B
          )TEMP GROUP BY ID HAVING COUNT(ID) = 1

          交集Intersect:
          SELECT ID FROM (
          SELECT DISTINCT A.AID AS ID FROM TABLE_A A
          UNION ALL
          SELECT DISTINCT B.BID AS ID FROM TABLE_B B
          )TEMP GROUP BY ID HAVING COUNT(ID) = 2

          不過,上述方法的功能也有限,
          只能用來檢查某個id是不是A、B表中都存在,
          或者只存在于A、B表其中之一,
          并不能對id在某表中多次出現做出檢查。
          而且,差集是有先后之分,這里沒有。

          posted @ 2006-09-01 09:29 rox 閱讀(2654) | 評論 (0)編輯 收藏
          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 固原市| 孝昌县| 奉节县| 抚州市| 驻马店市| 长葛市| 雷山县| 三河市| 蒙阴县| 陆良县| 津南区| 鹿泉市| 黄冈市| 张家界市| 兰州市| 玉树县| 湾仔区| 耿马| 普兰店市| 仙游县| 体育| 和田县| 台山市| 阜平县| 新竹市| 雷州市| 博客| 重庆市| 连江县| 赤水市| 汾西县| 师宗县| 辛集市| 海伦市| 兴安县| 绥德县| 武宁县| 南昌县| 县级市| 巴林左旗| 泰顺县|