同事在公司论坛里面发的,其实是我接手的一个项目中存在这个问题。
在使用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 阅读(4184) |
评论 (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 阅读(701) |
评论 (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 阅读(2591) |
评论 (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 阅读(164) |
评论 (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 阅读(1495) |
评论 (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 阅读(553) |
评论 (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 阅读(1672) |
评论 (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 阅读(996) |
评论 (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 阅读(692) |
评论 (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 阅读(2636) |
评论 (0) |
编辑 收藏