??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲性色AV日韩在线观看,国产V亚洲V天堂A无码,亚洲一区中文字幕在线电影网
http://www.tkk7.com/zjrstar/archive/2011/08/13/356457.html一叶笑?/dc:creator>一叶笑?/author>Sat, 13 Aug 2011 07:04:00 GMT http://www.tkk7.com/zjrstar/archive/2011/08/13/356457.html http://www.tkk7.com/zjrstar/comments/356457.html http://www.tkk7.com/zjrstar/archive/2011/08/13/356457.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/356457.html http://www.tkk7.com/zjrstar/services/trackbacks/356457.html ./Middleware_BI.5/instances/instance1/bin/opmnctl startproc ias-component=coreapplication_obips1 ./Middleware_BI.5/instances/instance1/bin/opmnctl status ]]> ?/title> http://www.tkk7.com/zjrstar/archive/2010/03/17/315677.html一叶笑?/dc:creator>一叶笑?/author>Wed, 17 Mar 2010 07:15:00 GMT http://www.tkk7.com/zjrstar/archive/2010/03/17/315677.html http://www.tkk7.com/zjrstar/comments/315677.html http://www.tkk7.com/zjrstar/archive/2010/03/17/315677.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/315677.html http://www.tkk7.com/zjrstar/services/trackbacks/315677.html
枝绕万朵立?nbsp;
不把春来报,
p满h间?
]]> 无题 http://www.tkk7.com/zjrstar/archive/2009/05/22/277286.html一叶笑?/dc:creator>一叶笑?/author>Fri, 22 May 2009 05:22:00 GMT http://www.tkk7.com/zjrstar/archive/2009/05/22/277286.html http://www.tkk7.com/zjrstar/comments/277286.html http://www.tkk7.com/zjrstar/archive/2009/05/22/277286.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/277286.html http://www.tkk7.com/zjrstar/services/trackbacks/277286.html
晨入明光村?br />
暮经大钟寺,
夜归西二旗?
]]> 树的遍历Q{_ http://www.tkk7.com/zjrstar/archive/2009/04/19/266438.html一叶笑?/dc:creator>一叶笑?/author>Sun, 19 Apr 2009 09:58:00 GMT http://www.tkk7.com/zjrstar/archive/2009/04/19/266438.html http://www.tkk7.com/zjrstar/comments/266438.html http://www.tkk7.com/zjrstar/archive/2009/04/19/266438.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/266438.html http://www.tkk7.com/zjrstar/services/trackbacks/266438.html 之前的工作都没有接触到树Q也很研I它。幸q地的是Q在目前的工作中多次遇到树型l构的数据,那么讉K树节点中的数据就是必然的了,而且q需要按照指定规则对节点中的数据q行额外处理。经q学习之后,对与树相关的基本法有了一些认知,p划写几篇文。其实这L文章早已是汗牛充栋,而我只是把它当作我的学习ȝ|了Q以加深记忆与理解,如能对其他朋友有所助益Q则更感愉悦?:-) (2009.04.03最后更? q次先从最基础的开?-树的遍历。本文用了两种极常用的Ҏ来遍历树中的所有节?-递归QP代,但它们实现的都是深度优先(Depth-First)法?br>1. 树节点与数据 先定义树节点及数?用户对象)Qƈ创徏试用的数据?br>TreeNode是树节点的定义?/** * 树节点的定义?br>*/ public interface TreeNode { /** * 获取指定下标处的子节炏V?br> * * @param index * 下标?br> * @return 子节炏V?br>*/ public TreeNode getChildAt(int index); /** * q回指定子节点的下标?br> * * @param index * 下标?br> * @return 子节炏V?br>*/ public int getChildIndex(TreeNode index); /** * 获取子节点的数量?br> * * @return 子节点的数量?br>*/ public int getChildCount(); /** * q回父节炏V?br> * * @return 父节炏V?br>*/ public TreeNode getParent(); /** * 讄父节炏V注Q此处不需要改变父节点中的子节点元素?br> * * @param parent * 父节炏V?br>*/ public void setParent(TreeNode parent); /** * 获取所有的子节炏V?br> * * @return 子节点的集合?br>*/ public List<?> getChildren(); /** * 是否为叶节点?br> * * @return 是叶节点Q返回trueQ否则,q回false?br>*/ public boolean isLeaf(); }
GenericTreeNode是一个通用的树节点实现?
public class GenericTreeNode<T> implements TreeNode { private T userObject = null; private TreeNode parent = null; private List<GenericTreeNode<T>> children = new ArrayList<GenericTreeNode<T>>(); public GenericTreeNode(T userObject) { this.userObject = userObject; } public GenericTreeNode() { this(null); } /** * d子节炏V?br> * * @param child */ public void addChild(GenericTreeNode<T> child) { children.add(child); child.setParent(this); } /** * 删除指定的子节点?br> * * @param child * 子节炏V?br>*/ public void removeChild(TreeNode child) { removeChildAt(getChildIndex(child)); } /** * 删除指定下标处的子节炏V?br> * * @param index * 下标?br>*/ public void removeChildAt(int index) { TreeNode child = getChildAt(index); children.remove(index); child.setParent(null); } public TreeNode getChildAt(int index) { return children.get(index); } public int getChildCount() { return children.size(); } public int getChildIndex(TreeNode child) { return children.indexOf(child); } public List<GenericTreeNode<T>> getChildren() { return Collections.unmodifiableList(children); } public void setParent(TreeNode parent) { this.parent = parent; } public TreeNode getParent() { return parent; } /** * 是否为根节点?br> * * @return 是根节点Q返回trueQ否则,q回false?br>*/ public boolean isRoot() { return getParent() == null; } public boolean isLeaf() { return getChildCount() == 0; } /** * 判断指定的节Ҏ否ؓ当前节点的子节点?br> * * @param node * 节点?br> * @return 是当前节点的子节点,q回trueQ否则,q回false?br>*/ public boolean isChild(TreeNode node) { boolean result; if (node == null) { result = false; } else { if (getChildCount() == 0) { result = false; } else { result = (node.getParent() == this); } } return result; } public T getUserObject() { return userObject; } public void setUserObject(T userObject) { this.userObject = userObject; } @Override public String toString() { return userObject == null ? "" : userObject.toString(); } }
UserObject是节点上的用户对象,相当于是数据?
public class UserObject { private String name = null; private Integer value = Integer.valueOf(0); public UserObject() { } public UserObject(String code, Integer value) { this.name = code; this.value = value; } public String getName() { return name; } public void setName(String code) { this.name = code; } public Integer getValue() { return value; } public void setValue(Integer value) { this.value = value; } @Override public String toString() { StringBuilder result = new StringBuilder(); result.append("[name=").append(name).append(", value=").append(value).append("]"); return result.toString(); } }
TreeUtils是用于创建树的工L?
public class TreeUtils { public static GenericTreeNode<UserObject> buildTree() { GenericTreeNode<UserObject> root = new GenericTreeNode<UserObject>(); root.setUserObject(new UserObject("ROOT", Integer.valueOf(0))); GenericTreeNode<UserObject> node1 = new GenericTreeNode<UserObject>(); node1.setUserObject(new UserObject("1", Integer.valueOf(0))); GenericTreeNode<UserObject> node2 = new GenericTreeNode<UserObject>(); node2.setUserObject(new UserObject("2", Integer.valueOf(0))); GenericTreeNode<UserObject> node3 = new GenericTreeNode<UserObject>(); node3.setUserObject(new UserObject("3", Integer.valueOf(5))); root.addChild(node1); root.addChild(node2); root.addChild(node3); GenericTreeNode<UserObject> node11 = new GenericTreeNode<UserObject>(); node11.setUserObject(new UserObject("11", Integer.valueOf(0))); GenericTreeNode<UserObject> node21 = new GenericTreeNode<UserObject>(); node21.setUserObject(new UserObject("21", Integer.valueOf(0))); node1.addChild(node11); node2.addChild(node21); GenericTreeNode<UserObject> node111 = new GenericTreeNode<UserObject>(); node111.setUserObject(new UserObject("111", Integer.valueOf(3))); GenericTreeNode<UserObject> node112 = new GenericTreeNode<UserObject>(); node112.setUserObject(new UserObject("112", Integer.valueOf(9))); GenericTreeNode<UserObject> node211 = new GenericTreeNode<UserObject>(); node211.setUserObject(new UserObject("211", Integer.valueOf(6))); GenericTreeNode<UserObject> node212 = new GenericTreeNode<UserObject>(); node212.setUserObject(new UserObject("212", Integer.valueOf(3))); node11.addChild(node111); node11.addChild(node112); node21.addChild(node211); node21.addChild(node212); return root; } }
2. 递归?/strong> 使用递归法的最大好处就?-单,但一般地Q我们都认ؓ递归的效率不高?private static void recursiveTravel(GenericTreeNode<UserObject> node) { travelNode(node); // 讉K节点Q仅仅只是打印该节点|了?br> List<GenericTreeNode<UserObject>> children = node.getChildren(); for (int i = 0; i < children.size(); i++) { recursiveTravel(children.get(i)); // 递归地访问当前节点的所有子节点?br> } }
大家肯定知道Q系l在执行递归Ҏ(对于其它Ҏ也是如此)时是使用q行时栈。对Ҏ的每一ơ调用,在栈中都会创Z份此ơ调用的zd记录--包括Ҏ的参敎ͼ局部变量,q回地址Q动态链接库Q返回值等?br>既然pȝ能够隐式C用栈L行递归ҎQ那么我们就可以昑ּC用栈来执行上q递归E序Q这也是递归E序转化P代程序的常用思想。下面的iterativeTravelҎp用了q一思想?br>3. q代?/strong> private static void iterativeTravel(GenericTreeNode<UserObject> node) { Stack<GenericTreeNode<UserObject>> nodes = new Stack<GenericTreeNode<UserObject>>(); nodes.push(node); // 当前节点压入栈中?br>while (!nodes.isEmpty()) { GenericTreeNode<UserObject> bufNode = nodes.pop(); // 从栈中取Z个节炏V?br> travelNode(bufNode); // 讉K节点?br>if (!bufNode.isLeaf()) { // 如果该节点ؓ分枝节点Q则它的子节点全部加入栈中?br> nodes.addAll(bufNode.getChildren()); } } }
与递归法相比,q代法的代码略多了几行,但仍然很单?br>4. 结 ׃上述两种Ҏ?隐式或显式地)使用了运行栈Q所以此处的q代法ƈ不能提高整个E序的效率。相反地Q由于在应用E序中显式地使用?java.util.Stack)QiterativeTravelҎ的效率可能反而更低。但iterativeTravel的最大好处是Q能够有效地避免q行时栈溢出(java.lang.StackOverflowError)?br>如果树的层次不太深,每层的子节点C太多Q那么用递归法应该是没有问题的。毕竟,z地E序会提供更多的好处?
原文位置Q?a title="http://www.tkk7.com/jiangshachina/archive/2009/04/01/263241.html" href="http://www.tkk7.com/jiangshachina/archive/2009/04/01/263241.html">http://www.tkk7.com/jiangshachina/archive/2009/04/01/263241.html
]]>
试Windows live writer http://www.tkk7.com/zjrstar/archive/2009/04/17/266141.html一叶笑?/dc:creator>一叶笑?/author>Fri, 17 Apr 2009 05:53:00 GMT http://www.tkk7.com/zjrstar/archive/2009/04/17/266141.html http://www.tkk7.com/zjrstar/comments/266141.html http://www.tkk7.com/zjrstar/archive/2009/04/17/266141.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/266141.html http://www.tkk7.com/zjrstar/services/trackbacks/266141.html 如何利用Windows live writer 写博?/p> 1、在菜单中选择WeblogQ然后选择Another Weblog Service&?
2、在Weblog Homepage URL中输入你的Blog主页地址?br>3、输入用户名与密码?br>4、在Type of weblog that you are using中选择Metaweblog API?br>5、Remote posting URL for your weblog中输?a href="http://www.tkk7.com/Blog">http://www.tkk7.com/Blog?services/metaweblog.aspx?
使用注意Q用Windows Live Writer发布之后QWindows Live Writerq不改变当前H口的状?也没有明昄提示)Q在当前H口中会刚发布的随W处于编辑状态,如果修改q发布,会直接修改刚发布的随W内宏V?/p>
]]> ?/title> http://www.tkk7.com/zjrstar/archive/2009/04/17/266139.html一叶笑?/dc:creator>一叶笑?/author>Fri, 17 Apr 2009 05:32:00 GMT http://www.tkk7.com/zjrstar/archive/2009/04/17/266139.html http://www.tkk7.com/zjrstar/comments/266139.html http://www.tkk7.com/zjrstar/archive/2009/04/17/266139.html#Feedback 2 http://www.tkk7.com/zjrstar/comments/commentRss/266139.html http://www.tkk7.com/zjrstar/services/trackbacks/266139.html
?br />
四月春风x?
d旧袄换绿衫?br />
江中鸭拨涟漪,
l雨无惊忘归途?br />
]]> Eclipse使用SVN[转] http://www.tkk7.com/zjrstar/archive/2009/03/11/259221.html一叶笑?/dc:creator>一叶笑?/author>Wed, 11 Mar 2009 13:32:00 GMT http://www.tkk7.com/zjrstar/archive/2009/03/11/259221.html http://www.tkk7.com/zjrstar/comments/259221.html http://www.tkk7.com/zjrstar/archive/2009/03/11/259221.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/259221.html http://www.tkk7.com/zjrstar/services/trackbacks/259221.html ׃原文地址不详Q我转脓臻Ihttp://www.tkk7.com/mose2006/archive/2008/01/05/173070.html
1.下蝲所需软g
1.1SVN服务?svn-1.4.3-setup.exe)
http://subversion.tigris.org/project_packages.html
1.2把SVN讄成window服务(SVNService.exe)
我没有下载地址,如有需?留下你的email
1.3Eclipse的SVN插g(用Eclipse插g下蝲):
2.配置服务?/strong>
2.1安装svn-1.4.3-setup.exe
2.2开?>q行->cmd->q入SVN服务端的安装目录下面的bin目录
2.3cmd下运行svnadmin create SVN库的位置(?D:\SVN_PRJ)
2.4复制SVNService.exe到SVN服务端安装目录下的bin目录
2.5cmd下运行SVNService -install -d -r D:\SVN_PRJ(SVN库的位置)
2.6如果x消掉后台服务,则运行SVNService -remove
2.7q入D:\SVN_PRJ\conf目录下编辑svnserve.conf,内容如下(切记下面几行字前不能有空?Q?br />
[general]
anon-access = read #匿名讉K权限,取gؓread,write,none
auth-access = write #认证用户的权?br />
password-db = passwd #认证用户数据?卛_许连到SVN的用?当前目录下的passwd文g中存攄用户及密?
realm = TESTING #在用戯证界面上出现的提C?br />
2.8~辑D:\SVN_PRJ\conf\passwd文g,内容如下
[users]
test = password #q时你连接SVN的时候可以用用户名为test密码为password来连接SVN
2.9开?>讄->控制面板->理工具->服务->启动SVNService服务
3.Eclipse下配|SVN插g
3.1帮助->软g更新->查找q安?>搜烦要安装的新功能部?>新徏q程站点->输入一个Q意的名称->URL输入
http://subclipse.tigris.org/update_1.2.x->定->选中你刚才添加的q程站点->完成->选中Subclipse->执行安装操作
3.2H口->打开透视?>SVN资源库研I?>右键->新徏->资源库位|?>URL中输入svn://127.0.0.1/->输入2.7定义的用户名test和密?br />
password
4.提交工程
4.1叛_工程->组->׃n目->选择SVN->选择svn://127.0.0.1(如果没有,则创Z个新的资源库)->下一?>完成
5.下蝲工程
5.1在SVN资源库透视图下,点开svn://127.0.0.1,会显C出现在本机SVN上的所有工E?叛_你想下蝲的工E?>Zؓ->下一?>完成
6.基本操作
6.1同步
在MyEclipse J2EE透视图下,叛_你要同步的工E?>组->与资源库同步->q时会进入同步透视?会显C出本机与SVN上内Ҏ不同的文?双击文g?会显C出两个文g中哪里不?
6.2提交
在同步透视图下?灰色向右的箭?表示你本Z改过",叛_该文?可以选择提交操作;
6.3覆盖/更新
在同步透视图下?蓝色向左的箭?表示你本Z改过",叛_该文?可以选择覆盖/更新操作;
7.图标说明
7.1灰色向右头:本地修改q?br />
7.2蓝色向左头:SVN上修改过
7.3灰色向右且中间有个加L头:本地比SVN上多出的文g
7.4蓝色向左且中间有个加L头:SVN上比本地多出的文?br />
7.5灰色向右且中间有个减L头:本地删除?而SVN上未删除的文?br />
7.6蓝色向左且中间有个减L头:SVN上删除了,而本地未删除的文?br />
7.7U色双向头:SVN上修改过,本地也修改过的文?br />
8.一些我遇到的出错信?/strong>
8.1在上面讲?.2步输入URL(svn://127.0.0.1)点下一步出?svnserve.conf:12: Option expected"错误
你打开svnserve.conf文g中的W?2?该错误是׃该行的前面有I格引v?把左边多出的I格删除掉即?
8.2在上面讲?.2步输入URL(svn://127.0.0.1/SVN_PRJ)点下一步出?svn://127.0.0.1/SVN_PRJ non-existent in revision '7'"错误
URL错了,应该输入svn://127.0.0.1卛_
9.SVN服务端自带的Z命o行的操作语句
9.1讄SVN服务端安装目录下?bin到环境变量中;
9.2在命令行下运行svn import c:/test svn://127.0.0.1/test -m "initial import" --username test --password passwd可进行上传操?br />
9.3q入你要出的目录,在命令行下运行svn checkout svn://127.0.0.1/test --username test -password passwd 可进行检出工E的操作
9.4在命令行下运行svn commit test.txt -m "modified" --username test -password passwd 可进行提交操?br />
9.5在命令行下运行svn update -r HEAD test.txt --username test -password passwd 可进行更新操?br />
? 上面讲的127.0.0.1可以换成外网IP,或者局域网IP皆可(?在家里创Z个SVN服务?卛_在公司去讉K安的SVN)
]]> 转脓Qoracle SQL性能优化 http://www.tkk7.com/zjrstar/archive/2009/02/10/254030.html一叶笑?/dc:creator>一叶笑?/author>Tue, 10 Feb 2009 03:16:00 GMT http://www.tkk7.com/zjrstar/archive/2009/02/10/254030.html http://www.tkk7.com/zjrstar/comments/254030.html http://www.tkk7.com/zjrstar/archive/2009/02/10/254030.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/254030.html http://www.tkk7.com/zjrstar/services/trackbacks/254030.html 原文地址Qhttp://www.tkk7.com/fuwei2241/archive/2006/10/01/oracleSQL.html
我们要做C但会写SQL,q要做到写出性能优良的SQL,以下为笔者学习、摘录、ƈ汇总部分资料与大家分nQ?
Q?Q?nbsp; 选择最有效率的表名序 ( 只在Z规则的优化器中有?) Q?
ORACLE 的解析器按照从右到左的顺序处?FROM 子句中的表名Q?FROM 子句中写在最后的?( 基础?driving table) 被最先处理,?FROM 子句中包含多个表的情况下 , 你必选择记录条数最的表作为基表。如果有 3 个以上的表连接查?, 那就需要选择交叉?(intersection table) 作ؓ基础?, 交叉表是指那个被其他表所引用的表 .
Q?Q?nbsp; WHERE 子句中的q接序Q:
ORACLE 采用自下而上的顺序解?WHERE 子句 , Ҏq个原理 , 表之间的q接必须写在其他 WHERE 条g之前 , 那些可以qo掉最大数量记录的条g必须写在 WHERE 子句的末?.
Q?Q?nbsp; SELECT 子句中避免?‘ * ‘ Q?
ORACLE 在解析的q程?, 会将 '*' 依次转换成所有的列名 , q个工作是通过查询数据字典完成?, q意味着耗费更多的时?
Q?Q?nbsp; 减少讉K数据库的ơ数Q?
ORACLE 在内部执行了许多工作 : 解析 SQL 语句 , 估算索引的利用率 , l定变量 , L据块{;
Q?Q?nbsp; ?SQL*Plus , SQL*Forms ?Pro*C 中重新设|?ARRAYSIZE 参数 , 可以增加每次数据库访问的索数据量 , gؓ 200
Q?Q?nbsp; 使用 DECODE 函数来减处理时_
使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的?.
Q?Q?nbsp; 整合?, 无关联的数据库访问:
如果你有几个单的数据库查询语?, 你可以把它们整合C个查询中 ( 即它们之间没有关系 )
Q?Q?nbsp; 删除重复记录 Q?
最高效的删除重复记录方?( 因ؓ使用?ROWID) 例子Q?
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
Q?Q?nbsp; ?TRUNCATE 替代 DELETE Q?
当删除表中的记录?, 在通常情况?, 回滚D?(rollback segments ) 用来存放可以被恢复的信息 . 如果你没?COMMIT 事务 ,ORACLE 会将数据恢复到删除之前的状?( 准确地说?恢复到执行删除命令之前的状况 ) 而当q用 TRUNCATE ?, 回滚D不再存放Q何可被恢复的信息 . 当命令运行后 , 数据不能被恢?. 因此很少的资源被调用 , 执行旉也会很短 . ( 译者按 : TRUNCATE 只在删除全表适用 ,TRUNCATE ?DDL 不是 DML)
Q?0Q?nbsp; 量多?COMMIT Q?
只要有可?, 在程序中量多?COMMIT, q样E序的性能得到提高 , 需求也会因?COMMIT 所释放的资源而减?:
COMMIT 所释放的资?:
a. 回滚D上用于恢复数据的信?.
b. 被程序语句获得的?
c. redo log buffer 中的I间
d. ORACLE 为管理上q?3 U资源中的内部花?
Q?1Q?nbsp; ?Where 子句替换 HAVING 子句Q?
避免使用 HAVING 子句 , HAVING 只会在检索出所有记录之后才对结果集q行qo . q个处理需要排?, 总计{操?. 如果能通过 WHERE 子句限制记录的数?, 那就能减这斚w的开销 . ( ?oracle ?) on ?where ?having q三个都可以加条件的子句中, on 是最先执行, where ơ之Q?having 最后,因ؓ on 是先把不W合条g的记录过滤后才进行统计,它就可以减少中间q算要处理的数据Q按理说应该速度是最快的Q?where 也应该比 having 快点的,因ؓ它过滤数据后才进?sum Q在两个表联接时才用 on 的,所以在一个表的时候,剩?where ?having 比较了。在q单表查询统计的情况下,如果要过滤的条g没有涉及到要计算字段Q那它们的结果是一LQ只?where 可以使用 rushmore 技术,?having ׃能,在速度上后者要慢如果要涉及到计的字段Q就表示在没计算之前Q这个字D늚值是不确定的Q根据上写的工作流E, where 的作用时间是在计之前就完成的,?having 是在计后才v作用的,所以在q种情况下,两者的l果会不同。在多表联接查询Ӟ on ?where 更早起作用。系l首先根据各个表之间的联接条Ӟ把多个表合成一个时表后,再由 where q行qoQ然后再计算Q计完后再?having q行qo。由此可见,要想qo条g起到正确的作用,首先要明白这个条件应该在什么时候v作用Q然后再军_攑֜那里
Q?2Q?nbsp; 减少对表的查询:
在含有子查询?SQL 语句?, 要特别注意减对表的查询 . 例子Q?
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT
TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)
Q?3Q?nbsp; 通过内部函数提高 SQL 效率 . Q?
复杂?SQL 往往牺牲了执行效?. 能够掌握上面的运用函数解决问题的Ҏ在实际工作中是非常有意义?
Q?4Q?nbsp; 使用表的别名 (Alias) Q?
当在 SQL 语句中连接多个表?, 请用表的别名ƈ把别名前~于每?Column ?. q样一?, 可以减解析的旉q减那些由 Column 歧义引v的语法错?.
Q?5Q?nbsp; ?EXISTS 替代 I N ??NOT EXISTS 替代 NOT IN Q?
在许多基于基表的查询?, Z满一个条?, 往往需要对另一个表q行联接 . 在这U情况下 , 使用 EXISTS( ?NOT EXISTS) 通常提高查询的效率 . 在子查询?,NOT IN 子句执行一个内部的排序和合q?. 无论在哪U情况下 ,NOT IN 都是最低效?( 因ؓ它对子查询中的表执行了一个全表遍?). Z避免使用 NOT IN , 我们可以把它改写成外q接 (Outer Joins) ?NOT EXISTS.
例子Q?
Q?高效 Q?SELECT * FROM EMP ( 基础?) WHERE EMPNO > 0 AND EXISTS ( SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')
( 低效 ) SELECT * FROM EMP ( 基础?) WHERE EMPNO > 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB' )
Q?6Q?nbsp; 识别 ' 低效执行 ' ?SQL 语句Q?
虽然目前各种关于 SQL 优化的图形化工具层出不穷 , 但是写出自己?SQL 工具来解决问题始l是一个最好的ҎQ?
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
ROUND ((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2 ) Hit_radio,
ROUND (DISK_READS/EXECUTIONS,2) Reads_per_run,
SQL_TEXT
FROM V$SQLAREA
WHERE EXECUTIONS>0
AND BUFFER_GETS > 0
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY 4 DESC ;
Q?7Q?nbsp; 用烦引提高效率:
索引是表的一个概念部?, 用来提高索数据的效率Q?ORACLE 使用了一个复杂的自^?B-tree l构 . 通常 , 通过索引查询数据比全表扫描要?. ?ORACLE 扑և执行查询?Update 语句的最佌\径时 , ORACLE 优化器将使用索引 . 同样在联l多个表时用烦引也可以提高效率 . 另一个用烦引的好处?, 它提供了主键 (primary key) 的唯一性验?. 。那?LONG ?LONG RAW 数据cd , 你可以烦引几乎所有的?. 通常 , 在大型表中用烦引特别有?. 当然 , 你也会发?, 在扫描小表时 , 使用索引同样能提高效?. 虽然使用索引能得到查询效率的提高 , 但是我们也必L意到它的代h . 索引需要空间来存储 , 也需要定期维?, 每当有记录在表中增减或烦引列被修Ҏ , 索引本n也会被修?. q意味着每条记录?INSERT , DELETE , UPDATE ؓ此多付出 4 , 5 ơ的盘 I/O . 因ؓ索引需要额外的存储I间和处?, 那些不必要的索引反而会使查询反应时间变?. 。定期的重构索引是有必要?. Q?
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
Q?8Q?nbsp; ?EXISTS 替换 DISTINCT Q?
当提交一个包含一对多表信?( 比如部门表和雇员?) 的查询时 , 避免?SELECT 子句中?DISTINCT. 一般可以考虑?EXIST 替换 , EXISTS 使查询更?, 因ؓ RDBMS 核心模块在 子查询的条g一旦满_ , 立刻q回l果 . 例子Q?
( 低效 ):
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E
WHERE D.DEPT_NO = E.DEPT_NO
( 高效 ):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X'
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO ) ;
Q?9Q?nbsp; sql 语句用大写的 Q因?oracle L先解?sql 语句Q把写的字母{换成大写的再执行
Q?0Q?nbsp; ?java 代码中尽量少用连接符“Q?#8221;q接字符Ԍ
Q?1Q?nbsp; 避免在烦引列上?NOT 通常 Q
我们要避免在索引列上使用 NOT, NOT 会生在和在索引列上使用函数相同?影响 . ?ORACLE” 遇到 ”NOT, 他就会停止用烦引{而执行全表扫?.
Q?2Q?nbsp; 避免在烦引列上用计.
WHERE 子句中,如果索引列是函数的一部分Q优化器不使用索引而用全表扫描.
举例 :
低效Q?
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效 :
SELECT … FROM DEPT WHERE SAL > 25000/12;
Q?3Q?nbsp; ?>= 替代 >
高效 :
SELECT * FROM EMP WHERE DEPTNO >=4
低效 :
SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于 , 前?DBMS 直接蟩到第一?DEPT {于 4 的记录而后者将首先定位?DEPTNO=3 的记录ƈ且向前扫描到W一?DEPT 大于 3 的记?.
Q?4Q?nbsp; ?UNION 替换 OR ( 适用于烦引列 )
通常情况?, ?UNION 替换 WHERE 子句中的 OR 会起到较好的效?. 对烦引列使用 OR 造成全表扫描 . 注意 , 以上规则只针对多个烦引列有效 . 如果?column 没有被烦?, 查询效率可能会因Z没有选择 OR 而降?. 在下面的例子?, LOC_ID ?REGION 上都建有索引 .
高效 :
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”
低效 :
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
如果你坚持要?OR, 那就需要返回记录最的索引列写在最前面 .
Q?5Q?nbsp; ?IN 来替?OR
q是一条简单易记的规则Q但是实际的执行效果q须验,?ORACLE8i 下,两者的执行路径g是相同的Q
低效 :
SELECT …. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30
高效
SELECT … FROM LOCATION WHERE LOC_IN IN (10,20,30);
Q?6Q?nbsp; 避免在烦引列上?IS NULL ?IS NOT NULL
避免在烦引中使用M可以为空的列Q?ORACLE 无法用该索引 Q对于单列烦引,如果列包含空|索引中将不存在此记录 . 对于复合索引Q如果每个列都ؓI,索引中同样不存在此记?. 如果臛_有一个列不ؓI,则记录存在于索引中. 举例 : 如果唯一性烦引徏立在表的 A 列和 B 列上 , q且表中存在一条记录的 A,B gؓ (123,null) , ORACLE 不接受下一条具有相?A,B | 123,null Q的记录 ( 插入 ). 然而如?所有的索引列都为空Q?ORACLE 认为整个键gؓI空不等于空 . 因此你可以插?1000 条具有相同键值的记录 , 当然它们都是I?! 因ؓIg存在于烦引列?, 所?WHERE 子句中对索引列进行空值比较将?ORACLE 停用该烦?.
低效 : ( 索引失效 )
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL ;
高效 : ( 索引有效 )
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >= 0;
Q?7Q?nbsp; L使用索引的第一个列 Q?
如果索引是徏立在多个列上 , 只有在它的第一个列 (leading column) ?where 子句引用?, 优化器才会选择使用该烦?. q也是一条简单而重要的规则Q当仅引用烦引的W二个列?, 优化器用了全表扫描而忽略了索引
Q?8Q?nbsp; ?UNION-ALL 替换 UNION ( 如果有可能的?) Q?
?SQL 语句需?UNION 两个查询l果集合?, q两个结果集合会?UNION-ALL 的方式被合ƈ , 然后在输出最l结果前q行排序 . 如果?UNION ALL 替代 UNION, q样排序׃是必要了 . 效率׃因此得到提高 . 需要注意的?Q?UNION ALL 重复输Z个结果集合中相同记录 . 因此各位q是 要从业务需求分析?UNION ALL 的可行?. UNION 对l果集合排序 , q个操作会用到 SORT_AREA_SIZE q块内存 . 对于q?块内存的优化也是相当重要?. 下面?SQL 可以用来查询排序的消耗量
低效Q?
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
UNION
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
高效 :
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
UNION ALL
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = '31-DEC-95'
Q?9Q?nbsp; ?WHERE 替代 ORDER BY Q?
ORDER BY 子句只在两种严格的条件下使用索引 .
ORDER BY 中所有的列必d含在相同的烦引中q保持在索引中的排列序 .
ORDER BY 中所有的列必d义ؓ非空 .
WHERE 子句使用的烦引和 ORDER BY 子句中所使用的烦引不能ƈ?.
例如 :
?DEPT 包含以下?:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
低效 : ( 索引不被使用 )
SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE
高效 : ( 使用索引 )
SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0
Q?0Q?nbsp; 避免改变索引列的cd .:
当比较不同数据类型的数据?, ORACLE 自动对列q行单的cd转换 .
假设 EMPNO 是一个数值类型的索引?.
SELECT … FROM EMP WHERE EMPNO = ‘123'
实际?, l过 ORACLE cd转换 , 语句转化?:
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123')
q运的是 , cd转换没有发生在烦引列?, 索引的用途没有被改变 .
现在 , 假设 EMP_TYPE 是一个字W类型的索引?.
SELECT … FROM EMP WHERE EMP_TYPE = 123
q个语句?ORACLE 转换?:
SELECT … FROM EMP WHERE TO_NUMBER(EMP_TYPE)=123
因ؓ内部发生的类型{?, q个索引不会被用到 ! Z避免 ORACLE 对你?SQL q行隐式的类型{?, 最好把cd转换用显式表现出?. 注意当字W和数值比较时 , ORACLE 会优先{换数值类型到字符cd
Q?1Q?nbsp; 需要当心的 WHERE 子句 :
某些 SELECT 语句中的 WHERE 子句不用烦?. q里有一些例?.
在下面的例子?, (1) ‘!=' 不使用索引 . C , 索引只能告诉你什么存在于表中 , 而不能告诉你什么不存在于表?. (2) ‘||' ?字符q接函数 . p其他函数那样 , 停用了烦?. (3) ‘+' 是数学函?. p其他数学函数那样 , 停用了烦?. (4) 相同的烦引列不能互相比较 , q将会启用全表扫?.
Q?2Q?nbsp; a. 如果索数据量过 30% 的表中记录数 . 使用索引没有显著的效率提高 .
b. 在特定情况下 , 使用索引也许会比全表扫描?, 但这是同一个数量上的区别 . 而通常情况?, 使用索引比全表扫描要块几倍乃臛_千?!
Q?3Q?nbsp; 避免使用耗费资源的操?:
带有 DISTINCT,UNION,MINUS,INTERSECT,ORDER BY ?SQL 语句会启?SQL 引擎
执行耗费资源的排?(SORT) 功能 . DISTINCT 需要一ơ排序操?, 而其他的臛_需要执行两ơ排?. 通常 , 带有 UNION, MINUS , INTERSECT ?SQL 语句都可以用其他方式重写 . 如果你的数据库的 SORT_AREA_SIZE 调配得好 , 使用 UNION , MINUS, INTERSECT 也是可以考虑?, 毕竟它们的可L很?
Q?4Q?nbsp; 优化 GROUP BY:
提高 GROUP BY 语句的效?, 可以通过不需要的记录?GROUP BY 之前qo?. 下面两个查询q回相同l果但第二个明显快了许?.
低效 :
SELECT JOB , AVG(SAL)
FROM EMP
GROUP JOB
HAVING JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
高效 :
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
GROUP JOB
]]> Struts2边学边练(3)-Struts2集成Hibernate完成CRUD操作 http://www.tkk7.com/zjrstar/archive/2009/01/08/250461.html一叶笑?/dc:creator>一叶笑?/author>Thu, 08 Jan 2009 03:35:00 GMT http://www.tkk7.com/zjrstar/archive/2009/01/08/250461.html http://www.tkk7.com/zjrstar/comments/250461.html http://www.tkk7.com/zjrstar/archive/2009/01/08/250461.html#Feedback 2 http://www.tkk7.com/zjrstar/comments/commentRss/250461.html http://www.tkk7.com/zjrstar/services/trackbacks/250461.html 阅读全文 ]]> Struts2边学边练(1)-HelloWorld http://www.tkk7.com/zjrstar/archive/2009/01/06/250161.html一叶笑?/dc:creator>一叶笑?/author>Tue, 06 Jan 2009 11:20:00 GMT http://www.tkk7.com/zjrstar/archive/2009/01/06/250161.html http://www.tkk7.com/zjrstar/comments/250161.html http://www.tkk7.com/zjrstar/archive/2009/01/06/250161.html#Feedback 0 http://www.tkk7.com/zjrstar/comments/commentRss/250161.html http://www.tkk7.com/zjrstar/services/trackbacks/250161.html
声明一下,我博客中所有的文章仅供本h学习之用Q最q有人对我的文章评论q激Q在此我希望您不要耽搁旉在我的博客中。如果文章中有什么不对之处,我欢q大家指出,但是我希望您珍惜自己的言行?br />
开发环境:
Web服务器: apache-tomcat-6.0.18
Struts版本Q?/span>struts-2.0.14
JDK版本Q?/span>JDK1.5.0_12
Eclipse版本Qeclipse-jee-ganymede-SR1-win32 也就是eclipse的开发JEE版本Q很多h都用myeclipseQ但是由于myeclipse是商业版本,所以觉得eclipse-jee-ganymede对于开发JEE的项目已l很不错了,所以我觉得没必要用myEclipsed发?br />
Struts2需要的jar包:
臛_需要如下五个包
struts2-core-2.0.11.1.jar
xwork-2.0.4.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
在这个简单的例子中,我们会完成以下步骤Q?br />
1.配置web.xml
2.~写jsp
3.~写Action实现c?br />
4.配置Action
5.发布q行
1.配置web.xml
Struts2的入口点是一?/span>Filter,需要将q个入口炚w|到web.xmlQ?br />
<? xml version="1.0" encoding="UTF-8" ?>
< web-app id ="WebApp_ID" version ="2.4" xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
< display-name > HelloWorld </ display-name >
< welcome-file-list >
< welcome-file > index.jsp </ welcome-file >
</ welcome-file-list >
< filter >
< filter-name > struts2 </ filter-name >
< filter-class > org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
</ filter >
< filter-mapping >
< filter-name > struts2 </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
</ web-app >
2. ~写jsp
在这个例子中需要两个jspQ一个是index.jsp, 用于输入用户的名字。第二个jsp是welcome.jspQ用于向用户问候?br />
在Struts2中只需要一个标{ֺ /struts-tags。这里面包含了所有的 Struts2标签。但使用 Struts2的标{֤家要注意一下。在 <s::form>中最好都使用 Struts2标签Q尽量不要用 HTML或普通文?
index.jsp如下Q?br />
<% @ page language = " java " contentType = " text/html; charset=ISO-8859-1 " pageEncoding = " ISO-8859-1 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=ISO-8859-1" >
< title > HelloWorld </ title >
</ head >
< body >
< s:form action ="Hello" >
< s:textfield name ="name" label ="Please Input Your Name:" ></ s:textfield >
< s:submit value ="Hello" ></ s:submit >
</ s:form >
</ body >
</ html >
welcome.jsp如下Q?br />
<% @ page language = " java " contentType = " text/html; charset=ISO-8859-1 " pageEncoding = " ISO-8859-1 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=ISO-8859-1" >
< title > HelloWorld </ title >
</ head >
< body >
Hello < s:property value ="name" />
</ body >
</ html >
3.~写Actionc?br />
Struts2.x 的Action需要从 com.opensymphony.xwork2.ActionSupport cȝѝ而且Action中已l包含了Struts1中的ActionFormcM息,所以不需要再写ActionFormcR?br />
在这个例子中只编写了一个HelloWorld.javac:
package com.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport {
private static final long serialVersionUID = - 2567455771246284511L ;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public String execute() throws Exception {
setName(getName());
return SUCCESS;
}
}
4.配置Actionc:
?span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts2.x中的配置文g一般ؓ struts.xml Q放?/span>WEB-INF"classes 目录中。下面是?/span>struts.xml 中配|动作类的代码:
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="default" extends ="struts-default" >
< action name ="Hello" class ="com.struts2.action.HelloWorld" >
< result name ="success" > /welcome.jsp </ result >
</ action >
</ package >
</ struts >
5.发布Q?br />
在eclipse-jee-ganymede下配|tomcat服务器,很简单?br />
Windows->Performance->Server->Runntime Environment->Add.随着向导可以增加tomcat服务器了?br />
然后鼠标右键点击目的根目录Q选择菜单的Run As->Run on Server可以发布启动你的项目了。而且q有eclipse自带的浏览器Q感觉很不错咯?br />
]]>
վ֩ģ壺
岻Ƶ |
߾Ʒ |
йһػƸѵĴƬйһɫƬ
|
߹ۿѰƵ
|
Ůһ |
99ȲƷ99 |
ƷxxxxˮƷþһ
|
պϵ |
**ɫëƬѹۿ |
ƻƻվ߹ۿ |
鵺̳߹ۿ |
ѹۿƷ |
ˬִֻ̼վ |
99ƵƷƵ7 |
߾Ʒ |
պ |
Ѳһ |
ۺϹһ |
aƷžžŴƬѿ |
Ʒһ |
ƷAVѿ |
jizzjizz߲ž |
Ʒѹۿһ |
һaȫƵ |
ۺAVһ |
ձxxxxɫƵ߹ۿ |
츾ɫ͵ |
߲ѲavƬ |
ձĻѿ |
ձԺԺ |
1000žžʮδֹۿ |
þúݺݰۺӰԺ |
ҹƵվ |
߹ۿxxxx |
˾þþƷ |
ҹѸƬ |
Ƶ |
++ۺ |
רһ |
ҳƵվ |
ҹһ |