放假已经有几天了,如今是到了长沙市区这边做办公用品这一块。放假了,意味着自己已经毕业了,虽然说真正要拿到毕业证的时间是要到明年上半年去,但是事实上自己已经离开了校门,所以需要面对的事情很多,如今是和朋友一起做办公用品这一块。既然在这边做办公用品这一块,就必须努力做好这一块,所谓--真正的生活不是做自己喜欢的事,而是喜欢自己做的事。社会中,要是不能及时的得出抉择,你就面临着淘汰,这几天我深刻的体会到在大学里面你可以不用去想那么多事,但是你到了社会上你必须得把很多事情去做好,并且想方设法的去做好。大学里面你可以去逃避事情,但是社会里面你就不行,因为你的工作会影响到整个公司的发展,所以有时候你必须得快速的作出抉择。
暂时是这样决定的,先暑假一边考驾照,一边在在朋友这边做事,也可以说得上是创业。到了暑假过后,到时应该还有其他的安排。
博客有一段时间没有更新了,最近还要考驾照,所以说,自己得多花点时间去做事情。天气是比较热,但是克服一下应该不是很大的问题。
今天查询了一下软考的成绩,没想到和自己预期的一样,上午42分,下午49分,比总成绩多一分,但是这个成绩是我自己在考完后自己对照参考答案就猜到的结果,不过这一次的考试,总结一下,主要还是心态问题,这次没有过,下次继续考,一般来说,第三次应该不是很大问题。
来到这边做办公用品这一块,发现很多问题,但是有时候,毕竟不是自己去创业,就算是朋友做,自己也提出一些要求或者是建议,不一定合适,所以接受事实,做一个智者。
过两天会去驾校考理论,所以这几天需要复习一下理论知识。
考完驾照之后,买火车票回一趟深圳。毕竟自己也有很长一段时间没有回深圳了。不过九月份的时候,还是会回深圳找工作,毕竟这里不是我长久呆的地方。做出这样的选择,并不是我自己有其他的想法,而是我一开始就没有想过来这边创业。人生的规划中,在这边做事只是一个起点,但是不是终点。我相信有两个月的积累,九月份的时候去找工作,应该有一定的优势。
不管怎么样,这两个月内,我必须尽心尽力去做好个人的工作。就当是一次实习吧!
暂时是这样决定的,先暑假一边考驾照,一边在在朋友这边做事,也可以说得上是创业。到了暑假过后,到时应该还有其他的安排。
博客有一段时间没有更新了,最近还要考驾照,所以说,自己得多花点时间去做事情。天气是比较热,但是克服一下应该不是很大的问题。
今天查询了一下软考的成绩,没想到和自己预期的一样,上午42分,下午49分,比总成绩多一分,但是这个成绩是我自己在考完后自己对照参考答案就猜到的结果,不过这一次的考试,总结一下,主要还是心态问题,这次没有过,下次继续考,一般来说,第三次应该不是很大问题。
来到这边做办公用品这一块,发现很多问题,但是有时候,毕竟不是自己去创业,就算是朋友做,自己也提出一些要求或者是建议,不一定合适,所以接受事实,做一个智者。
过两天会去驾校考理论,所以这几天需要复习一下理论知识。
考完驾照之后,买火车票回一趟深圳。毕竟自己也有很长一段时间没有回深圳了。不过九月份的时候,还是会回深圳找工作,毕竟这里不是我长久呆的地方。做出这样的选择,并不是我自己有其他的想法,而是我一开始就没有想过来这边创业。人生的规划中,在这边做事只是一个起点,但是不是终点。我相信有两个月的积累,九月份的时候去找工作,应该有一定的优势。
不管怎么样,这两个月内,我必须尽心尽力去做好个人的工作。就当是一次实习吧!
HyperSpace Hybrid就是一款即时启动操作系统,但它的特别之处在于能够和Windows系统同时运行,因此在Windows启动这样的等待时间内可以暂时提供一 些简单功能。而随时按下键盘上的F4键,就可以在Windows操作系统和HyperSpace之间切换。HyperSpace提供了网络浏览、收发 Email、YouTube视频、FaceBook等功能,据称还可以令笔记本续航时间延长30%。该操作系统需要一个约3GB的独立分区,并且只能和英语版的Vista SP1 x86操作系统共存。
HyperSpace的即时切换功能基于Intel的VT虚拟机技术,因此要想实现该特性,必须使用支持VT技术的Core、Core 2处理器,系统要求还包括2GB内存,Intel GMA 3000/3100/X3500/X4500显卡。Phoenix测试可用的笔记本包括联想ThinkPad T400、X300、X301、X200,技嘉W466U、宏碁4720、东芝E105、富士通1010等。
除了能够支持即时切换的HyperSpace Hybrid,Phoenix还提供了一个只能重启进入,独立运行的版本HyperSpace Dual。该版本的的系统要求大大降低,512MB内存以上的Atom、赛扬M上网本即可支持,由于不需要即时切换功能,也不再限制Windows操作系 统版本。两个版本都提供21天的免费试用,此后Hybrid版年费59.95美元,Dual版年费39.95美元。
有需要的朋友可以进行下载
以下是切换版本的HyperSpace软件下载,该软件只有1.59MB。由于没找到Hybrid版,所以本博客也不给出下载地址;
以下是本站下载地址:
下载文件
HyperSpace的即时切换功能基于Intel的VT虚拟机技术,因此要想实现该特性,必须使用支持VT技术的Core、Core 2处理器,系统要求还包括2GB内存,Intel GMA 3000/3100/X3500/X4500显卡。Phoenix测试可用的笔记本包括联想ThinkPad T400、X300、X301、X200,技嘉W466U、宏碁4720、东芝E105、富士通1010等。
除了能够支持即时切换的HyperSpace Hybrid,Phoenix还提供了一个只能重启进入,独立运行的版本HyperSpace Dual。该版本的的系统要求大大降低,512MB内存以上的Atom、赛扬M上网本即可支持,由于不需要即时切换功能,也不再限制Windows操作系 统版本。两个版本都提供21天的免费试用,此后Hybrid版年费59.95美元,Dual版年费39.95美元。
有需要的朋友可以进行下载
以下是切换版本的HyperSpace软件下载,该软件只有1.59MB。由于没找到Hybrid版,所以本博客也不给出下载地址;
以下是本站下载地址:
下载文件 1, mysql安装时设置字符集utf-8(包括数据库字符集,以及表的字符集), jdbc驱动用最新的
2. hibernate配置文件(hibernate.cfg.xml)中,加上属性
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
3. web.xml设置Filter
=================================================
<filter>
<filter-name>
Set Web Application Character Encoding
</filter-name>
<filter-class>com.util.SetEncodeFilter</filter-class>
<init-param>
<param-name>defaultencoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>
Set Web Application Character Encoding
</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
=============================================
SetEncodeFilter.java
1package com.util;
2
3import java.io.IOException;
4
5import javax.servlet.Filter;
6import javax.servlet.FilterChain;
7import javax.servlet.FilterConfig;
8import javax.servlet.ServletException;
9import javax.servlet.ServletRequest;
10import javax.servlet.ServletResponse;
11
12public class SetEncodeFilter implements Filter {
13
14 protected FilterConfig filterConfig = null;
15
16 protected String defaultEncoding = null;
17
18 /** *//**//* (non-Javadoc)
19 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
20 */
21 public void init(FilterConfig arg0) throws ServletException {
22 // TODO Auto-generated method stub
23 this.filterConfig = arg0;
24 this.defaultEncoding = filterConfig.getInitParameter("defaultencoding");
25 }
26
27 /** *//**//* (non-Javadoc)
28 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
29 */
30 public void doFilter(
31 ServletRequest request,
32 ServletResponse response,
33 FilterChain chain)
34 throws IOException, ServletException {
35 // TODO Auto-generated method stub
36 request.setCharacterEncoding(selectEncoding(request));
37 chain.doFilter(request, response);
38 }
39
40
41 public void destroy() {
42
43 this.defaultEncoding = null;
44 this.filterConfig = null;
45 }
46
47
48 protected String selectEncoding(ServletRequest request) {
49
50 return this.defaultEncoding;
51 }
52
53} 4.提交表单的jsp页面设置
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cdredfox/archive/2006/09/18/1236347.aspx
在之前的文章里,我已经提过如何解决JSP中乱码问题(解决tomcat下中文乱码问题 ),其中也详细解说了MYSQL乱码问题,相信通过里面的办法,肯定都已经解决了JSP里的乱码问题,不过还是有些人的MYSQL乱码问题没有得到解决,包括我自己,所以又找了一些资料,希望这次能完全解决MYSQL数据库的乱码问题。
--------------------------------------------------------------------------------
第一种方法,很精辟的总结:
经常更换虚拟主机,而各个服务商的MYSQL版本不同,当导入数据后,总会出现乱码等无法正常显示的问题,查了好多资料,总结出自己的一点技巧:
WINDOWS 下导入应该这样
使用MYSQL的命令
在DOS命令下进入mysql的bin目录下,输入mysql -uroot -p密码 数据库名称<要恢复的数据库, 例如我们要把D盘的一个名称为test.sql的数据库恢复到本地的test2这个数据库,那么就这样: mysql -uroot -p密码 test2以前的国外主机用的Mysql是4.x系列的,感觉还比较好,都无论GBK和UTF-8都没有乱码,没想到新的主机的Mysql是5.0版本的,导入数据后,用Php读出来全是问号,乱码一片,记得我以前也曾经有过一次切换出现乱码的经验,原因肯定是Mysql版本之间的差异问题。
只好查资料,发现了一个解决方法,就是在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码,对于GBK的数据库则使用SET NAMES GBK,代码如下:
$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
mysql_query("SET NAMES 'GBK'");
数据库字符集为utf-8
连接语句用这个
mysql_query("SET NAMES 'UTF8'");
mysql_query("SET CHARACTER SET UTF8");
mysql_query("SET CHARACTER_SET_RESULTS=UTF8'");
还有个方法就是,如果你自己的机器的话,可以更改MYSQL字符集,一般在MYSQ4和MYSQL5这两个版本中有效
--------------------------------------------------------------------------------
第二个方法:很不错的解说,可以试一下
mysql乱码处理总结:
(1)java中处理中文字符正常,在cmd client中显示乱码是字符集的问题.
(2)字段长度设置够长,但插入中文字符时提示com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column错误是字符集的问题.
(3)乱码问题归根到底是字符集的问题,那就从字符集设置方面考虑,不外乎下面几个方面:server,client,database,connection,results.
-------------------------解决办法----------------------
(1)修改 my.ini(MySQL Server Instance Configuration 文件)
# CLIENT SECTION
[client]
port=3306
[mysql]
default-character-set=gbk
# SERVER SECTION
[mysqld]
default-character-set=gbk
(2)修改data目录中相应数据库目录下的db.opt配置文件
default-character-set=gbk
default-collation=gbk_chinese_ci
(3)数据库连接串中指定字符集
URL=jdbc:mysql://yourIP/college?user=root&password=yourPassword&useUnicode=true&characterEncoding=gbk 注:在mysql4.1.0版 要加useUnicode=true&characterEncoding=gbk 如果是5.0版以上的,加不加都是没有关系的!
(4)在创建数据库时指定字符集
create database yourDB CHARACTER SET gbk;
(5)在dos命令上要设置
set names gbk
好了,经过检查上面四个方面的设置,应该 OK 了!不会出现诸如
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column等问题.
Mysql中文乱码解决
原来常常在群里看到mysql的乱码问题,但是由于本人一直在用oracle和sql server所以没多在乎,昨天用了用mysql结果就遇到了传说中的乱码…..。现在我们来讲讲mysql的乱码问题。首先你进入的你mysql
用show variables查看
这里可以查看到你的字符集,character_set_server是服务器编码。现在我们默认的是latin1要改变服务器的编码必须重新启动服务器,我们先用mysqladmin –uroot shutdown关闭服务器,然后mysqld –C GBK启动服务器 –C是character_set_server的一个简写(可以也可以写成mysqld –character_set_server gbk).这样修改以后我们再进入mysql查看就会显示:
这样我们就把服务器和数据库的编码改为了GBK。
现在我们就可以插入中文字符串了,但是为什么有时间还是会显示
Exception in thread "main" com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'name' at row 1
这是因为你只是修改了mysql的服务器的字符编码,并没有修改已经有数据库的编码,这时候你需要手动的把data目录下的数据库中的db.opt中的编码改为
default-character-set=gbk
default-collation=gbk_chinese_ci
这样修改以后你在重启服务器就可以插入中文了。
但是这时候还有个问题就是在你应用程序当中显示的是中文字符,但是在命令窗口还是乱码。
这时候你注意我们上面图中的character_set_client字符还是latin1当然显示的是乱码咯哟。所以你进入mysql客户端程序的时候因该把客户端默认的编码改为gbk才能显示正常。
你可以在mysql里修改,也可以在登陆的时候mysql –uroot –default-character-set=gbk修改
如此以来就解决了中文问题了。
我刚开始的时候在程序中加入了一个characterEncoding变量(下图),但是想来想去都觉得这个变量没什么用,所以后来去掉也能显示正常。
jdbc:mysql://127.0.0.1:3306/ee?characterEncoding=gbk"
--------------------------------------------------------------------------------
第三种方法,说有太复杂了,反到不知道怎么弄了,你试试,也许可以用得上
1.修改/etc/my.cnf文件,改成这样:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8
[mysql.server]
user=mysql
basedir=/var/lib
[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
注意:就是加入了一句default-character-set=utf8。
2./etc/init.d/mysqld restart 重新启动mysql;
3.打开phpmyadmin,选择lang为"Chines simplifies(zh-utf-8)",选择"MySQL 连接校对"为"utf8_general_ci "点“显示 MySQL 的运行信息”--“变量”,可以看到:
character set client utf8 utf8
character set connection utf8 utf8
character set database utf8 utf8
character set results utf8 utf8
character set server utf8 utf8
character set system utf8 utf8
collation connection utf8_general_ci utf8_general_ci
collation database utf8_general_ci utf8_general_ci
collation server utf8_general_ci utf8_general_ci
从这里可以看到character全部变成utf8了。
有人要问,为什么都要改成utf8呢?改成GB2312不行吗?
解释如下:
我也不想改成utf8,只是phpmyadmin2.6在mysql4.1的时候只会用utf8,连其他页面的charset也都是utf8,改成gb2312一定会乱码,我们只能凑phpmyadmin了。
只有在mysql3.23的时候,phpmyadmin才会多一个gb2312的页面charset,这时候是正常的。
3.将以前的mysql3的库文件导入mysql4.1的库
有两种情况:
一是从phpmyadmin上导入,这时候你要注意的是在选择库文件的页面左下脚有个“文件的字符集:”,默认是utf8,要改成gb2312,否则导进去乱码;
二是在linux下导入,这时候你需要先在库文件的头部加一行:
SET NAMES 'gb2312'; 注意最后也是;号,别漏了。
然后执行mysql -u用户名 -p密码 xxx.sql > 库名
导入完成以后再用phpmyadmin打开看,里面的中文字就是正确的。
4.从mysql4.1里导出库文件
一.用phpmyadmin导出
导出倒是问题不大,如果phpmyadmin的浏览页面里显示的中文是正常的,那么导出肯定也是正常的
二.在linux上导出
如果用mysqldump导出出现了乱码也没有关系,可以运行iconv来转换一下
iconv -c -f UTF-8 -t GB2312 库文件名 > 新的gb2312的库文件名
综上所述,你要注意:
1。尽量在需要导入的库文件的开头加入SET NAMES 'gb2312';告诉mysql你要导入的是一个gb2312的文件;
2。可能你需要这个:
SET NAMES 'utf8';
在登陆到mysql后用,把character的一些默认参数改到utf8上,有时可以减少一些困扰,不过也不是必须的。
在mysql上使用:
SHOW VARIABLES LIKE 'character_set_%';
用来查看当前的状态。
3.如果出现乱码也不要怕,一是你要注意留存原有的备份,二是用iconv来进行转化。
在正常使用之前注意做导入导出的测试,确保万无一失。
最后加一句:www.quicklinux.org原创文章,转载请注明出处。呵呵
邮件:support@quicklinux.org
作者: MySQL 发布日期: 2005-12-14
我升级了MYSQL到4.1.2,phpmyadmin用的是2.6.2。数据表里面有中文的字段中文都变成了乱码,导出数据也是乱码。我用以前的2.5.7没有问题,想问一下,应该在phpmyadmin的那个文件里改哪个设置一下才能显示出来的是正常的中文字?
和字符相关的变量中这几个和sql很有关系:
character_set_client
character_set_connection
character_set_results
此外就是数据库中对相应字段设置的charact set,如果没有对字段设置,缺省是table的charact set,table也没有指定则缺省使用database的。
上面3个变量的作用是这样的,client表示客户端发送过来的字符集,results表示发送到客户端的字符集(这两个分开是因为发送过来和发送过去的不一定是同一个客户端),connection则在客户端和数据库起一个连接作用。
具体是这样:比如我在mysql命令行设置client为gbk,connection为utf8,results为gbk,数据库为big5,
当我发送一个insert语句的时候,这个语句作为gbk代码,先转为utf8代码(connection),再转为big5(database)插入数据库。
而运行一个select语句的时候,从数据库得到的结果则相反的过程,由big5转为utf8,再转为gbk,你得到gbk的结果。
因此最主要的是让client和results和你使用的客户端一致。比如你的网页是utf8编码,你就要设置这两个为utf8。
而在mysql命令行的时候,我用的是2000,需要设置为gbk
而我们用的set names XXX,实际上就是同时设置这3个变量为XXX。
在这样的情况下,我们可以把一个数据库中的不同表或不同字段设为不同的字符集,只要上面3个设置正确,就可以在数据库中同时使用不同的字符集。
注意要保证你的数据库中的字符已经使用了正确的字符集,比如如果一开始你设置错误,插入数据后,本身数据的编码就是不正确的,然后即使设置改回来,也不可能得到正确的显示了。
好了,随便弄了下,希望对你有所帮助
以下是一些关于MySQL数据库的排序和索引的知识。供大家分享一下。
性能测试中碰到关于mysql排序消耗非常之巨,使用索引来去除排序,可以比较好的降低load。我对mysql是比较初学的
root@orphean 02:19:27>select count(*) from tmp_info;
+----------+
| count(*) |
+----------+
| 42916 |
+----------+
1 row in set (0.02 sec)
root@orphean 02:29:27>select count(*) from tmp_info where status = 1;
+----------+
| count(*) |
+----------+
| 32911 |
+----------+
1 row in set (0.02 sec)
root@orphean 02:29:40>select count(*) from tmp_info where status = 2;
+----------+
| count(*) |
+----------+
| 10005 |
+----------+
1 row in set (0.00 sec)
root@orphean 02:33:16>select count(*) from tmp_info
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%';
+----------+
| count(*) |
+----------+
| 32888 |
+----------+
1 row in set (0.19 sec)
--可以看到虽然加了很多查询条件,但是过滤性并不好,返回的数据量还是比较大,占了增加的表3/4
--看一下全表扫描和用索引的消耗
索引字段:`status`, `level`, `appraise`, `open_date`, `outer_sys_code`, `gmt_modified`
root@orphean 04:06:20>explain select count(*) from tmp_info
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ref
possible_keys: IDX_RECRUIT_STATUS
key: IDX_RECRUIT_STATUS
key_len: 1
ref: const
rows: 1626
Extra: Using where
1 row in set (0.00 sec)
+----------+
| count(*) |
+----------+
| 32888 |
+----------+
1 row in set (0.17 sec)
=======================
root@orphean 04:07:08>explain select count(*) from tmp_info IGNORE INDEX (IDX_RECRUIT_STATUS)
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 42277
Extra: Using where
1 row in set (0.00 sec)
+----------+
| count(*) |
+----------+
| 32888 |
+----------+
1 row in set (0.14 sec)
可以看到全表扫描速度要快,其实这个也是可想而知的,用索引扫描返回了表70%多的数据,上面的是count语句,下面看一下分页list语句
root@orphean 04:12:49>explain select * from tmp_info where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%'
-> ORDER BY gmt_modified desc
-> LIMIT 1,20 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ref
possible_keys: IDX_RECRUIT_STATUS
key: IDX_RECRUIT_STATUS
key_len: 1
ref: const
rows: 21041
Extra: Using where
1 row in set (0.00 sec)
---------------------------+------------------------+---------------------+---------------------+
20 rows in set (0.00 sec)
root@orphean 04:13:19>explain select * from tmp_info IGNORE INDEX (IDX_RECRUIT_STATUS)
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%'
-> ORDER BY gmt_modified desc
-> LIMIT 1,20 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 42082
Extra: Using where; Using filesort
1 row in set (0.00 sec)
---------------------------+-------------
20 rows in set (0.33 sec)
这个非常明显,看到使用索引去掉filesort之后,sql的效率非常高,显示执行的时间是0.00s(基本在几个毫秒),而使用全表就需要非常330ms
如果我把索引中的gmt_modifid字段移后,是排序用不到索引,那是什么效果呢
ALTER TABLE `orphean`.`tmp_info` DROP INDEX `IDX_RECRUIT_STATUS`,
ADD INDEX `IDX_RECRUIT_STATUS` USING BTREE(`status`, `level`, `appraise`, `open_date`, `outer_sys_code`, `gmt_modified`);
root@orphean 04:58:50>EXPLAIN select * from tmp_info
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%'
-> ORDER BY gmt_modified desc
-> LIMIT 1,20 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ref
possible_keys: IDX_RECRUIT_STATUS
key: IDX_RECRUIT_STATUS
key_len: 1
ref: const
rows: 11234
Extra: Using where; Using filesort
1 row in set (0.00 sec)
---------------------------+------------------------+---------------------+---------------------+
20 rows in set (0.35 sec)
没有用到排序索引消耗的代价比全表扫描来的还大,可惜排序对于mysql的消耗是非常非常大的。 上面的sql比较是将30000多条记录排序啊,代价昂贵!
在性能测试的时候,使用全表扫描或者没有用上索引排序的时候,数据库CPU在50%(16个CPU用掉了8个),load在8以上,而在用索引去掉排序之后,使CPU下降到4%,load在1以下
小结:1. 尽可以去除mysql的排序,使用索引。 要使用索引来用作排序,必须索引列都在查询条件中,而且排序字段前面的查询条件是用=号连接,
因此可能会创建多个索引,前面的字段都相同,只是排序字段的位置不一样的情况。 这个时候用强制索引去提示吧
2. 如果在确定查询返回的结果集太大,查询条件的筛选度太下,那就干脆用全表扫描吧,用 IGNORE INDEX (IDX_NAME)来忽略索引。
MySQL排序的话,可以使用以下语句
select * from news order by publishdate desc limit 0,10;
说明一下,news是表名 publishdate是列名 desc是降序 limit 是限制在多少道多少之间的记录,相当于mssql中的top语句
性能测试中碰到关于mysql排序消耗非常之巨,使用索引来去除排序,可以比较好的降低load。我对mysql是比较初学的
root@orphean 02:19:27>select count(*) from tmp_info;
+----------+
| count(*) |
+----------+
| 42916 |
+----------+
1 row in set (0.02 sec)
root@orphean 02:29:27>select count(*) from tmp_info where status = 1;
+----------+
| count(*) |
+----------+
| 32911 |
+----------+
1 row in set (0.02 sec)
root@orphean 02:29:40>select count(*) from tmp_info where status = 2;
+----------+
| count(*) |
+----------+
| 10005 |
+----------+
1 row in set (0.00 sec)
root@orphean 02:33:16>select count(*) from tmp_info
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%';
+----------+
| count(*) |
+----------+
| 32888 |
+----------+
1 row in set (0.19 sec)
--可以看到虽然加了很多查询条件,但是过滤性并不好,返回的数据量还是比较大,占了增加的表3/4
--看一下全表扫描和用索引的消耗
索引字段:`status`, `level`, `appraise`, `open_date`, `outer_sys_code`, `gmt_modified`
root@orphean 04:06:20>explain select count(*) from tmp_info
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ref
possible_keys: IDX_RECRUIT_STATUS
key: IDX_RECRUIT_STATUS
key_len: 1
ref: const
rows: 1626
Extra: Using where
1 row in set (0.00 sec)
+----------+
| count(*) |
+----------+
| 32888 |
+----------+
1 row in set (0.17 sec)
=======================
root@orphean 04:07:08>explain select count(*) from tmp_info IGNORE INDEX (IDX_RECRUIT_STATUS)
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 42277
Extra: Using where
1 row in set (0.00 sec)
+----------+
| count(*) |
+----------+
| 32888 |
+----------+
1 row in set (0.14 sec)
可以看到全表扫描速度要快,其实这个也是可想而知的,用索引扫描返回了表70%多的数据,上面的是count语句,下面看一下分页list语句
root@orphean 04:12:49>explain select * from tmp_info where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%'
-> ORDER BY gmt_modified desc
-> LIMIT 1,20 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ref
possible_keys: IDX_RECRUIT_STATUS
key: IDX_RECRUIT_STATUS
key_len: 1
ref: const
rows: 21041
Extra: Using where
1 row in set (0.00 sec)
---------------------------+------------------------+---------------------+---------------------+
20 rows in set (0.00 sec)
root@orphean 04:13:19>explain select * from tmp_info IGNORE INDEX (IDX_RECRUIT_STATUS)
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%'
-> ORDER BY gmt_modified desc
-> LIMIT 1,20 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 42082
Extra: Using where; Using filesort
1 row in set (0.00 sec)
---------------------------+-------------
20 rows in set (0.33 sec)
这个非常明显,看到使用索引去掉filesort之后,sql的效率非常高,显示执行的时间是0.00s(基本在几个毫秒),而使用全表就需要非常330ms
如果我把索引中的gmt_modifid字段移后,是排序用不到索引,那是什么效果呢
ALTER TABLE `orphean`.`tmp_info` DROP INDEX `IDX_RECRUIT_STATUS`,
ADD INDEX `IDX_RECRUIT_STATUS` USING BTREE(`status`, `level`, `appraise`, `open_date`, `outer_sys_code`, `gmt_modified`);
root@orphean 04:58:50>EXPLAIN select * from tmp_info
-> where status = 1 and outer_sys_code = 1 and
-> level <=10000 and appraise <=1000 and open_date >='2009-06-15 11:27:39' and category like '%,1048,%'
-> ORDER BY gmt_modified desc
-> LIMIT 1,20 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tmp_info
type: ref
possible_keys: IDX_RECRUIT_STATUS
key: IDX_RECRUIT_STATUS
key_len: 1
ref: const
rows: 11234
Extra: Using where; Using filesort
1 row in set (0.00 sec)
---------------------------+------------------------+---------------------+---------------------+
20 rows in set (0.35 sec)
没有用到排序索引消耗的代价比全表扫描来的还大,可惜排序对于mysql的消耗是非常非常大的。 上面的sql比较是将30000多条记录排序啊,代价昂贵!
在性能测试的时候,使用全表扫描或者没有用上索引排序的时候,数据库CPU在50%(16个CPU用掉了8个),load在8以上,而在用索引去掉排序之后,使CPU下降到4%,load在1以下
小结:1. 尽可以去除mysql的排序,使用索引。 要使用索引来用作排序,必须索引列都在查询条件中,而且排序字段前面的查询条件是用=号连接,
因此可能会创建多个索引,前面的字段都相同,只是排序字段的位置不一样的情况。 这个时候用强制索引去提示吧
2. 如果在确定查询返回的结果集太大,查询条件的筛选度太下,那就干脆用全表扫描吧,用 IGNORE INDEX (IDX_NAME)来忽略索引。
MySQL排序的话,可以使用以下语句
select * from news order by publishdate desc limit 0,10;
说明一下,news是表名 publishdate是列名 desc是降序 limit 是限制在多少道多少之间的记录,相当于mssql中的top语句
1. 首先用EMBED标签将Flash文件载入网页
2. 然后利用FlashVars参数向picbox.swf传递参数
image(图片地址列表), url(点击后的链接地址列表), info(显示的文字列表),三个参数间用&号连续,顺序任意。如:
image=i1.jpg|i2.jpg|i3.jpg|i4.jpg&url=http://www.xgto.cn|http://www.9966.info |http://www.xiaobai.info|http://www.yaocai123.com &info=淘宝网手机商城|9966电视剧|小白影视馆|中药材百科
Flash动态图片切换效果源码下载地址:
下载文件 文章转载:http://www.phplamp.org/2010/04/flash-picbox-code-download/
为了加强浏览者的体验,不在等待页面加载时感到枯燥,从而关闭网页,很多网站都会制作一个“网页正在加载中”的提示效果或显示加载进程,加载完成后提示消失,大部分都应用在网站的首页,今天我教大家把这一特效添加到WordPress主题中。要实现该特效同样要用到jQuery,如果大家和我目前用的主题一样,为了实现其它特效已提前加载了jquery,那么正好充分利用jquery的强大功能,添加此特效何乐而不为呢?当然仅仅为了实现这个特效,而去加载50几K的jquery就有点得不偿失了。
实现方法:
打开header.php模板文件
第一步:加载jquery.min.js
外链接格式:
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.2.3.min.js"></script>
内链格式:
<script type="text/javascript" src="<?php bloginfo('stylesheet_directory'); ?>/js/jquery.min.js" ></script>
第二步:在</head>前添加一段JS代码
<script type="text/javascript">
jQuery(function(){
jQuery('#loading-one').empty().append('页面加载完毕.').parent().fadeOut('slow');
});</script>
第三步:在<body>后添加显示效果样式
<div id="loading" style="position:fixed !important;position:absolute;top:0;left:0;height:100%; width:100%; z-index:999; background:#000 url(这里输入一个图片地址) no-repeat center; opacity:0.6; filter:alpha(opacity=60);font-size:14px;line-height:20px;" onclick="javascript:turnoff('loading')">
<p id="loading-one" style="color:#fff;position:absolute; top:50%; left:50%; margin:50px 0 0 -50px; padding:3px 10px;" onclick="javascript:turnoff('loading')">页面载入中,请稍后...</p>
</div>
图片大小格式不限,不加图片也可以,到此该特效添加完毕
最近安装的的软件比较多,刚才还差点把机器给崩溃了。想了想还是把一些没用到的服务给卸载一下。这样的话,可以使机器运行得更加顺畅。再者,要是自己想写一个集成服务器软件的话,也需要这方面的知识,所以到互联网上查找了一下。以便以后使用。
第一种方法:
1. 开始 ->运行 ->cmd
2. cd到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(Framework版本号按IIS配置)
3. 安装服务: 运行命令行 InstallUtil.exe E:/test.exe
卸载服务: 运行命令行 InstallUtil.exe -u E:/test.exe
这样就能删除了,但如果还是不能删除的话,沒关系下面还有一种方法。
第二种方法:
运行-->cmd-->到c:\windows\system32文件夹下-->输入sc delete <服务名称>,然后就可以把服务卸载了
这时候,我们可以用另外一个命令来卸载,如下:
C:\WINDOWS\system32>sc delete mysql
sc delete "mysql"
当然你也可以用这个工具create,start,stop服务。比如,我们就可以用下面的命令,安装服务,并把服务启动起来。
installutil fsshare.exe
sc start "冰点阳光工作室共享"
第一种方法:
1. 开始 ->运行 ->cmd
2. cd到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(Framework版本号按IIS配置)
3. 安装服务: 运行命令行 InstallUtil.exe E:/test.exe
卸载服务: 运行命令行 InstallUtil.exe -u E:/test.exe
这样就能删除了,但如果还是不能删除的话,沒关系下面还有一种方法。
第二种方法:
运行-->cmd-->到c:\windows\system32文件夹下-->输入sc delete <服务名称>,然后就可以把服务卸载了
这时候,我们可以用另外一个命令来卸载,如下:
C:\WINDOWS\system32>sc delete mysql
sc delete "mysql"
当然你也可以用这个工具create,start,stop服务。比如,我们就可以用下面的命令,安装服务,并把服务启动起来。
installutil fsshare.exe
sc start "冰点阳光工作室共享"
从一个小时前,网站子域名就出现无法访问,直接跳转到了一个新的页面,页面信息提示为域名服务器更新,需要一段时间才能解决。不过这不会影响顶级域名的访问,我们虚拟主机的用户使用的是子域名的话,网站可能近期内无法访问,我将继续跟踪那边最新的状况,将第一时间发布域名状态信息。
我现在大二快毕业了,也要准备找工作了,所以积累一些面试知识是非常有必要的。以下是我找到的一篇关于SSH框架的面试题目,在此和大家分享以下。
Struts,Spring,Hibernate面试题总结
1、Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因。
不是
声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope="prototype"来管理
2、MVC,分析一下struts是如何实现MVC的
m:JavaBean 或结合 EJB 组件或者pojo构成
c:Action 来实现
v:一组 JSP 文件及其标签构成。
=================================================
注:POJO的解释如下:
在http://www.webopedia.com/TERM/P/POJO.htm查到解释如下:
POJO, or Plain Old Java Object, is a normal Java object class (that is, not a JavaBean, EntityBean etc.) and does not serve any other special role nor does it implement any special interfaces of any of the Java frameworks. This term was coined by Martin Fowler, Rebbecca Parsons and Josh MacKenzie who believed that by creating the acronym POJO, such objects would have a "fancy name", thereby convincing people that they were worthy of use.
基本意思是说POJO一个正规的Java对象(不是JavaBean,EntityBean等),也不担当任何的特殊的角色,也不实现任何Java框架指定的接口。
我觉得上面的解释很准确,POJO应该不是我们开始认为的JavaBean,当然更不是EJB,它不应该依赖于框架即继承或实现某些框架类或接口。例如:Struts1中的Action和ActionForm当然不属于POJO了,而在Struts2中的Action由于可以不继承任何的接口,所以在这种情况下Action是POJO,但是Struts2中的Action也可以继承ActionSupport类就不再属于POJO了。POJO里面是可以包含业务逻辑处理和持久化逻辑,也可以包含类似与JavaBean属性和对属性访问的set和get方法的。
最后,我们总结一下给一个定义把,POJO是一个简单的、正规Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。
文章出处:http://www.diybl.com/course/3_program/java/javashl/200845/108451.html
=================================================
3、struts中的几个关键对象的作用(说说几个关键对象的作用)
Action:控制器类,ActionForm:表单对象,DynaValidatorForm:动态form,ActonMapping:配置文件中action节点的信息......
4、说说AOP和IOC的概念以及在spring中是如何应用的。
AOP:面向切面编程,即Aspect-Oriented Programming的缩写
IOC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。详细参考http://dev.csdn.net/develop/article/24/24397.shtm
(DI: 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。)
5、Hibernate有哪几种查询数据的方式
hql查询,sql查询,条件查询
6、load()和get()的区别
hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load默认支持延迟加载,在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundEcception;所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在 load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理(load时候之查询一级缓存,不存在则创建代理)。get() 现在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回null ;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
7、谈谈hibernate的延迟加载和openSessionInView
延迟加载要在session范围内,用到的时候再加载;opensessioninview是在web层写了一个
filter来打开和关闭session,这样就表示在一次request过程中session一直开着,保证了延迟
加载在session中的这个前提。
8、spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。
声明事务和编程事务
隔离级别:
- DEFAULT使用数据库默认的隔离级别
- READ_UNCOMMITTED会出现脏读,不可重复读和幻影读问题
- READ_COMMITTED会出现重复读和幻影读
- REPEATABLE_READ会出现幻影读
- SERIALIZABLE最安全,但是代价最大,性能影响极其严重
和传播行:
- REQUIRED存在事务就融入该事务,不存在就创建事务
- SUPPORTS存在事务就融入事务,不存在则不创建事务
- MANDATORY存在事务则融入该事务,不存在,抛异常
- REQUIRES_NEW总是创建新事务
- NOT_SUPPORTED存在事务则挂起,一直执行非事务操作
- NEVER总是执行非事务,如果当前存在事务则抛异常
- NESTED嵌入式事务
9、Hibernate中的update()和saveOrUpdate()的区别.
摘自hibernate说明文档:
saveOrUpdate()做下面的事:
如果对象已经在本session中持久化了,不做任何事
如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常
如果对象没有持久化标识(identifier)属性,对其调用save()
如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
如果对象是附带版本信息的(通过 <version>或 <timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。 否则update() 这个对象
10、Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。
getHiberanteTemplate里面提供了save,update,delete,find等方法。
简单说一个:如果配置了声明式事务,当执行getHibernateTemplate的各种方法的时候,事务会
自动被加载
如果没有配置事务,那么以上操作不会真正的被同步到数据库,除非配置了hibernate的
autocommit=true
11、spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。
spring事务分两种形式,声明式事务和编程式事务,spring提供了一个事务的接口
PaltformTractionManager接口,针对不同的事务,spring进行了不同的实现,对hibernate事务
的实现HIbernateTractionManager,对JDBC的JdbcTractionManager,
DataSourceTractionManager以及JdoTractionManager。接口platformTractionManager提供了三
个方法,获取事务,提交和回滚的方法。
12、Hibernate工作原理及为什么要用?
原理:
1、读取并解析配置文件
2、读取并解析映射信息,创建SessionFactory
3、打开Sesssion
4、创建事务Transation
5、持久化操作
6、提交事务
7、关闭Session
8、关闭SesstionFactory
为什么要用:
1、对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2、Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3、hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4、hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
13、Hibernate是如何延迟加载?
1、Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
2、Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
14、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
15、说下Hibernate的缓存机制
1、内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2、二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:
数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系 统频繁使用、非关键数据
c) 第三方缓存的实现
16、Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数
17、如何优化Hibernate?
1、使用双向一对多关联,不使用单向一对多
2、灵活使用单向一对多关联
3、不用一对一,用多对一取代
4、配置对象缓存,不使用集合缓存
5、一对多集合使用Bag,多对多集合使用Set
6、继承类使用显式多态
7、表字段要少,表关联不要怕多,有二级缓存撑腰
18、Struts工作机制?为什么要使用Struts?
工作机制:
Struts的工作流程:
在web应用启动时就会加载初始化ActionServlet,ActionServlet从
struts-config.xml文件中读取配置信息,把它们存放到各种配置对象
当ActionServlet接收到一个客户请求时,将执行如下流程.
(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
为什么要用:
JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
19、Struts的validate框架是如何验证的?
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。
20、说下Struts的设计模式
MVC模式:web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用 Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。
21、spring工作机制及为什么要用?
1、spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2、DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3、DispatcherServlet请请求提交到目标Controller
4、Controller进行业务逻辑处理后,会返回一个ModelAndView
5、Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6、视图对象负责渲染返回给客户端。
为什么用:
AOP让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。
IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。
Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。
本文章转自http://zhanghongliang-cyj.javaeye.com/blog/678970
Struts,Spring,Hibernate面试题总结
1、Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因。
不是
声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope="prototype"来管理
2、MVC,分析一下struts是如何实现MVC的
m:JavaBean 或结合 EJB 组件或者pojo构成
c:Action 来实现
v:一组 JSP 文件及其标签构成。
=================================================
注:POJO的解释如下:
在http://www.webopedia.com/TERM/P/POJO.htm查到解释如下:
POJO, or Plain Old Java Object, is a normal Java object class (that is, not a JavaBean, EntityBean etc.) and does not serve any other special role nor does it implement any special interfaces of any of the Java frameworks. This term was coined by Martin Fowler, Rebbecca Parsons and Josh MacKenzie who believed that by creating the acronym POJO, such objects would have a "fancy name", thereby convincing people that they were worthy of use.
基本意思是说POJO一个正规的Java对象(不是JavaBean,EntityBean等),也不担当任何的特殊的角色,也不实现任何Java框架指定的接口。
我觉得上面的解释很准确,POJO应该不是我们开始认为的JavaBean,当然更不是EJB,它不应该依赖于框架即继承或实现某些框架类或接口。例如:Struts1中的Action和ActionForm当然不属于POJO了,而在Struts2中的Action由于可以不继承任何的接口,所以在这种情况下Action是POJO,但是Struts2中的Action也可以继承ActionSupport类就不再属于POJO了。POJO里面是可以包含业务逻辑处理和持久化逻辑,也可以包含类似与JavaBean属性和对属性访问的set和get方法的。
最后,我们总结一下给一个定义把,POJO是一个简单的、正规Java对象,它包含业务逻辑处理或持久化逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。
文章出处:http://www.diybl.com/course/3_program/java/javashl/200845/108451.html
=================================================
3、struts中的几个关键对象的作用(说说几个关键对象的作用)
Action:控制器类,ActionForm:表单对象,DynaValidatorForm:动态form,ActonMapping:配置文件中action节点的信息......
4、说说AOP和IOC的概念以及在spring中是如何应用的。
AOP:面向切面编程,即Aspect-Oriented Programming的缩写
IOC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。详细参考http://dev.csdn.net/develop/article/24/24397.shtm
(DI: 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。)
5、Hibernate有哪几种查询数据的方式
hql查询,sql查询,条件查询
6、load()和get()的区别
hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load默认支持延迟加载,在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundEcception;所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在 load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理(load时候之查询一级缓存,不存在则创建代理)。get() 现在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回null ;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
7、谈谈hibernate的延迟加载和openSessionInView
延迟加载要在session范围内,用到的时候再加载;opensessioninview是在web层写了一个
filter来打开和关闭session,这样就表示在一次request过程中session一直开着,保证了延迟
加载在session中的这个前提。
8、spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。
声明事务和编程事务
隔离级别:
- DEFAULT使用数据库默认的隔离级别
- READ_UNCOMMITTED会出现脏读,不可重复读和幻影读问题
- READ_COMMITTED会出现重复读和幻影读
- REPEATABLE_READ会出现幻影读
- SERIALIZABLE最安全,但是代价最大,性能影响极其严重
和传播行:
- REQUIRED存在事务就融入该事务,不存在就创建事务
- SUPPORTS存在事务就融入事务,不存在则不创建事务
- MANDATORY存在事务则融入该事务,不存在,抛异常
- REQUIRES_NEW总是创建新事务
- NOT_SUPPORTED存在事务则挂起,一直执行非事务操作
- NEVER总是执行非事务,如果当前存在事务则抛异常
- NESTED嵌入式事务
9、Hibernate中的update()和saveOrUpdate()的区别.
摘自hibernate说明文档:
saveOrUpdate()做下面的事:
如果对象已经在本session中持久化了,不做任何事
如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常
如果对象没有持久化标识(identifier)属性,对其调用save()
如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
如果对象是附带版本信息的(通过 <version>或 <timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。 否则update() 这个对象
10、Spring对多种ORM框架提供了很好的支持,简单描述在Spring中使用Hibernate的方法,并结合事务管理。
getHiberanteTemplate里面提供了save,update,delete,find等方法。
简单说一个:如果配置了声明式事务,当执行getHibernateTemplate的各种方法的时候,事务会
自动被加载
如果没有配置事务,那么以上操作不会真正的被同步到数据库,除非配置了hibernate的
autocommit=true
11、spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。
spring事务分两种形式,声明式事务和编程式事务,spring提供了一个事务的接口
PaltformTractionManager接口,针对不同的事务,spring进行了不同的实现,对hibernate事务
的实现HIbernateTractionManager,对JDBC的JdbcTractionManager,
DataSourceTractionManager以及JdoTractionManager。接口platformTractionManager提供了三
个方法,获取事务,提交和回滚的方法。
12、Hibernate工作原理及为什么要用?
原理:
1、读取并解析配置文件
2、读取并解析映射信息,创建SessionFactory
3、打开Sesssion
4、创建事务Transation
5、持久化操作
6、提交事务
7、关闭Session
8、关闭SesstionFactory
为什么要用:
1、对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2、Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3、hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4、hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
13、Hibernate是如何延迟加载?
1、Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
2、Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
14、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
15、说下Hibernate的缓存机制
1、内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2、二级缓存:
a) 应用及缓存
b) 分布式缓存
条件:
数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系 统频繁使用、非关键数据
c) 第三方缓存的实现
16、Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数
17、如何优化Hibernate?
1、使用双向一对多关联,不使用单向一对多
2、灵活使用单向一对多关联
3、不用一对一,用多对一取代
4、配置对象缓存,不使用集合缓存
5、一对多集合使用Bag,多对多集合使用Set
6、继承类使用显式多态
7、表字段要少,表关联不要怕多,有二级缓存撑腰
18、Struts工作机制?为什么要使用Struts?
工作机制:
Struts的工作流程:
在web应用启动时就会加载初始化ActionServlet,ActionServlet从
struts-config.xml文件中读取配置信息,把它们存放到各种配置对象
当ActionServlet接收到一个客户请求时,将执行如下流程.
(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
为什么要用:
JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
19、Struts的validate框架是如何验证的?
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。
20、说下Struts的设计模式
MVC模式:web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用 Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。
21、spring工作机制及为什么要用?
1、spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2、DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3、DispatcherServlet请请求提交到目标Controller
4、Controller进行业务逻辑处理后,会返回一个ModelAndView
5、Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6、视图对象负责渲染返回给客户端。
为什么用:
AOP让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。
IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。
Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。
本文章转自http://zhanghongliang-cyj.javaeye.com/blog/678970






