随笔-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 阅读(4156) | 评论 (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 阅读(693) | 评论 (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 阅读(2572) | 评论 (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 阅读(153) | 评论 (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 阅读(1481) | 评论 (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 <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 <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 阅读(539) | 评论 (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 阅读(1657) | 评论 (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 阅读(988) | 评论 (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 阅读(681) | 评论 (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 阅读(2576) | 评论 (0)编辑 收藏
仅列出标题
共5页: 上一页 1 2 3 4 5 下一页