同事在公司論壇里面發的,其實是我接手的一個項目中存在這個問題。
在使用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 閱讀(4187) |
評論 (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 閱讀(702) |
評論 (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 閱讀(2593) |
評論 (0) |
編輯 收藏
這兩句SQL區別是有沒有括號,但卻是一個可以查出來,一個幾乎查不出來。
一個簡單的問題,居然還犯低級錯誤,留下來提醒自己。
1
select 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
1
select 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 閱讀(166) |
評論 (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 閱讀(1500) |
評論 (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.htmlhttp://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#name-case-sensitivity
posted @
2007-01-29 09:40 rox 閱讀(1674) |
評論 (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 閱讀(696) |
評論 (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 閱讀(2647) |
評論 (0) |
編輯 收藏