当前访问本站: hits

yjhmily

坚持走自己的路……

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  100 Posts :: 8 Stories :: 353 Comments :: 0 Trackbacks

2010年3月14日 #

原文出处:http://space.itpub.net/133735/viewspace-710117 
总结的不错!
-------------------------------------------------------------------------------------------------
生产环境最佳实践
1.linux 系统:
1】关闭文件系统/分区的atime 选项
Vi /etc/fstab
在对应的分区项后面添加noatime ,nodiratime
LABEL=/1 / ext3 defaults 1 1
LABEL=/data1 /data ext4 defaults,noatime,nodiratime 1 2
2】设置文件句柄4k+,目前该配置已经集成到启动脚本中。
Vi /etc/security/limit.conf
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
3】不要使用large vm page (不要使用大内存页选项)
Linux 大内存页参考:http://linuxgazette.net/155/krishnakumar.html
4】用dmesg 查看主机的信息。
2.linux 文件系统的选择:
Mongodb 采用预分配的大文件来存储数据,我们推荐
1】ext4
2】xfs
3.内核版本:
网络上对2.6.33-31 以及2.6.32 的表现持怀疑度, 而强力推荐2.6.36
4.线程堆栈的尺寸
默认的线程堆栈尺寸为10m ,调整为1m ,已经集成在启动脚本中。
项目过程中的总结与建议
1.大小写问题
mongodb 是默认区分大小写的,但是这会不会衍生出跟mysql 一样的问题?(mysql 区
分大小写,导致windows 与linux 下的表名,字段名不一致)。
如果无特别用途,建议表名,字段名全部用小写字母。
2.尽可能的缩短字段名的长度
mongodb 的schema free 导致了每笔数据都要存储他的key 以及属性,这导致了这些数
据的大量冗余。开发同事也许考虑到,从易读性出发设计的key 基本比较长,基本都是按
照起字面意思去设计的。这导致key 很长。对应的数据存储占用了很大的空间。
必要的时候,可以考虑建立一个key 与实际意义的map 表,尽量降低key 的长度。
示例定义:
// 基本信息
static final String _ID = "_id";
static final String STATUS_CODE = "sc";
// 缓冲
static final String DATE = "date";
static final String MAX_AGE = "age";
// 内容
static final String CONTENT = "content";
static final String CONTENT_TYPE = "ctype";
static final String CONTENT_LENGTH = "clen";
static final String ZIP = "zip";
3. mongodb 单表最大索引数为64
无索引排序的最大数据量为4M, 超过则报错退出。
建议where 条件尽量落在索引字段上,排序字段需要建立索引,索引的使用原则与oracle
mysql 一致,尽量降低索引数量,索引长度。
mongodb 的查询每次只能用到一个索引,对数据的查询不会“并发”执行
例如: db.tab.find({'id'=1,'name'=2}) 如果‘id’,‘name' 列上分别有索引
对查询效率提升意义不大,如果索引为('id','name') 则大幅提升效率。
4.mongodb 添加字段
如果添加字段且带有default 值,需要全部数据都要修改,这也是设计阶段需要考虑的
事情,这个问题的另外一种解法是应用代码里做一次判断。
5.测试过程的密码问题
对于用作数据库使用的Mongodb,在代码测试阶段都应加上密码验证,目前上线阶段基
本都会在密码验证方面出现问题(做缓存使用的可以不做密码验证)。
6.数据源连接方式
使用连接池模式,尽量减少认证带来的性能额外消耗
建议采用标准的uri 连接方式: mongodb://user:passwd@host:port,host:port/db
7.Mongodb日志量
正常情况下不需要开启-v 日志选项。
Mongodb 的-v 日志适合在开发环境的调试线上部署不建议采用这个参数,目前线上
部署的情况,-v 日志一天也会有几个G 的日志量,去掉这个参数,跟数据查询相关的操作
就不会记日志了,数据库的内部的重要操作还是会写日志的。
8.连接数大小的设置
Mongodb 驱动程序采用的连接池的方式连接到数据库,目前从观察到的情况是应用一
开启便根据变量的设置,建立全部连接,然后提供给程序使用,并且一旦其中某个连接
到数据库的访问失败,则会清空整个连接池到这台数据库的连接,并重新建立连接。
而mongodb 对中断连接的垃圾清理工作则是懒惰的被动清理方式,如果驱动程序端配
置的连接数过大,一旦发生重连,则会导致mongo 端堆积大量的垃圾连接数据,导致
主机资源耗尽。
建议: mongodb 驱动的连接池大小的设置一般应该控制100 以下,一般情况30-50 足
够支撑应用访问。
9.锁的问题
Mongodb 对数据库的访问全部加锁,如果是查询请求则设置共享锁,数据修改请求,
则设置全局排他锁,并且是实例级别的排他锁。并且写锁会阻塞读请求,如果长时间持有
写锁,会阻塞整个实例的读请求。
部署建议:
1】一般情况下,建议不同的应用不要合用一套示例。
2】如果资源不满足,需要合用,应该具有相同属性的应用合用一套实例。
例如合同mongo 的应用都是读多写少,防止一台写多应用阻塞读请求。
10.关于map/reduce问题
mongodb 对map/reduce 的支持是单线程的,我们不建议在前台使用该功能, group by
是通过map/reduce 实现的,开发过程中,要慎用。
11.安全问题
1】Mongodb 运行在mongodb 用户之上,并禁止mongodb 用户登录
2】使用Mongodb 自带的认证方法(adduser、auth)限制用户访问行为
3】将Mongodb 置于内网环境中
4】Mongodb 必须暴露在外网环境中的时候,使用IPTABLES 等网络层技术进行防护
5】网络层面内容为明文传输,可以考虑存储加密文档,应用端,加解密。
12.性能监控
Mongodb 自带有性能数据收集系统
Mongostat 实时采集数据库的多项指标,提供http console 端口号为应用端口号+1000。
关注的主要性能指标:
1】Faults:显示Mongodb 每秒页面故障的数量,这个是mongoDB 映射到虚拟地址空间,
而不是物理内存,这个值如果飙高的话,可能意味着机器没有足够的内存来
存储数据和索引。
2】Flushes:每秒做了多少次fsync,显示多少次数据被刷新进了磁盘
3】locked:写锁
4】idx miss:索引未命中比例
5】qr | qw:读写锁的请求队列长度。
6】conn: 当前已经建立的连接数。
其他命令:
Db.stat()
db.serverStatuse()
Db.collection.stats()
13.碎片问题
Mongodb 数据库如果数据修改很频繁,会出现比较严重的空间碎片问题,表现在磁盘
文件扩张与实际数据量不相符,内存不够用,索引命中率低,查询效率降低。
碎片整理,目前我们采用的版本没有太有效的方法。
可以用db.repaireDatabase() 来整理数据库,这个过程非常的慢
如果是Master-slave 模式则相当于执行一次主从切换,然后从新建立从库。
如果是replSet 架构可以停掉数据库,然后删除数据目录,从新从复制复制组中全同步数据,
这个时候要考虑oplog 的尺寸。
一个大体的步骤:
1.】先调用rs.freeze(1200),将每个不想让它成为primary 的机器让它在1200 秒内无法成为
primary(这步也可以不做)
2. 】将primary stepDown,不出意外新的primary 会起来.
3. 】将原primary kill 掉.
4. 】删掉所有data 数据(调用repair 很慢,真不如干掉重新来)
5. 】再重启动原primary 的进程
6. 】以此循环完成整个复制组的全部重建。
14.系统备份:
Mongodb 目前不支持在线备份,只能离线备份。
我们采用的架构为replSet 和Master-slave .
基于我们目前的架构以及数据一致性要求,我们没有安排相关的备份系统。
15.应用代码中Mongodb连接问题
在有些应用在使用Mongodb 过程中会存在以下两个小问题:
1. 在应用启动过程中,应用存在要求连接池中所有的连接都建立成功才让应用正
常启动,这种做法不可取,因为存在网络问题、Mongodb 拒绝连接或Mongodb 假死情况,如
果没加外部try catch 做防护,则Resin 不断重启也不能正常启动端口。
2.有些应用在使用Mongodb 中连接池配置了safe=true,w=1;这种配置意味着客户端在
插入数据或更新数据的时候,要求mongodb 必须将所更新的数据写入磁盘并返回更新成功
的信息给程序。如果碰上应用程序访问压力大,mongodb 就会反应迟钝,并会发生假死可能,
针对此情况,需要评估数据的一致性需求,做出合适调整。我们一般建议关闭此选项。
16.补充开发方面的一些问题
1】skip+limit翻页,越往后面越慢,有资料说用数组元素的分页可以解决,目前还没
试过,比较靠谱的做法是,先找出上次的id,翻页的时候不用skip:
last_row_id = ObjectId(‘....’);
db.activity_stream->find({_id:{$lt: last_row_id },
user_id:20 } ).sort( {_id:-1} ).limit(10);
2】.只有真正需要的字段才select出来
3】.更新的某条数据的时候,先查出来再更新会减小锁的时间
4】.只有返回很少结果的查询才用索引,否则会加载太多数据,比没有用索引还慢
5】.属性比较多的时候,建立分层的关系能够提高查询效率,否则每个记录都要过一遍
才能找到要的属性
17.关于硬件资源的选择:
虚拟机可以很好的隔离资源,并可动态的扩展。
我们建议mongodb 的部署采用虚拟机的方式,每个虚拟机部署一个实例,使各节点分
散在不同的物理机上,根据应用的前期预测,平衡虚拟机的之间的i/o。
posted @ 2012-09-29 22:17 kangxm 阅读(617) | 评论 (0)编辑 收藏

adb shell

# mount -oremount,rw /dev/block/mtdblock3 /system

# pm list packages -f (列出apk和包名的对应关系)
# cd /system/app (APK文件所在地)
# rm Mms.* (rom自带的短信)
# exit

 

adb uninstall com.android.mms

 

返回Success,就说明卸载成功了

 

注意..
删除之前, 最好用

  1. adb pull /system/app/xxx.apk .

复制代码

给备份一下, 避免出错(系统老是Force Close, 没法用).
出错后, 可以用

  1. adb push xxx.apk /system/app
adb shell

# mount -oremount,rw /dev/block/mtdblock3 /system

# pm list packages -f (列出apk和包名的对应关系)
# cd /system/app (APK文件所在地)
# rm Mms.* (rom自带的短信)
# exit

 

adb uninstall com.android.mms

 

返回Success,就说明卸载成功了

 

注意..
删除之前, 最好用

  1. adb pull /system/app/xxx.apk .

复制代码

给备份一下, 避免出错(系统老是Force Close, 没法用).
出错后, 可以用

  1. adb push xxx.apk /system/app
posted @ 2012-08-10 17:56 kangxm 阅读(514) | 评论 (0)编辑 收藏

最近的机器内存又爆满了,出了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。
下面是参考网络资源和总结一些在java编程中尽可能做到的一些地方
-
1.尽量在合适的场合使用单例
使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面
第一,控制资源的使用,通过线程同步来控制资源的并发访问
第二,控制实例的产生,以达到节约资源的目的
第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
-
2.尽量避免随意使用静态变量
要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的内存,如
public class A{
static B b = new B();
}
此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。
-
3.尽量避免过多过常的创建java对象
尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最
大限度的重用对象,最好能用基本的数据类型或数组来替代对象。
-
4.尽量使用final修饰符
带 有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指 定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联 (inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
-
5.尽量使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。
-
6.尽量处理好包装类型和基本类型两者的使用场所
虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。
在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。
-
7.慎用synchronized,尽量减小synchronize的方法
都 知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁 了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小,并且应尽量使用方法同步代替代码块同步。
-
8.尽量使用StringBuilder和StringBuffer进行字符串连接
这个就不多讲了
-
9.尽量不要使用finalize方法
实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。
-
10.尽量使用基本数据类型代替对象
String str = "hello";
上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;
String str = new String("hello");
此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o
-
11.单线程应尽量使用HashMap, ArrayList
HashTable,Vector等使用了同步机制,降低了性能。
-
12.尽量合理的创建HashMap
当你要创建一个比较大的hashMap时,充分利用另一个构造函数
public HashMap(int initialCapacity, float loadFactor)
避 免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。
-
13.尽量减少对变量的重复计算
for(int i=0;i<list.size();i++)
应该改为
for(int i=0,len=list.size();i<len;i++)
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。 
-
14.尽量避免不必要的创建
A a = new A();
if(i==1){list.add(a);}
应该改为
if(i==1){
A a = new A();
list.add(a);}
-
15.尽量在finally块中释放资源
程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。 
-
16.尽量使用移位来代替'a/b'的操作
"/"是一个代价很高的操作,使用移位的操作将会更快和更有效
int num = a / 4;
int num = a / 8;
应该改为
int num = a >> 2;
int num = a >> 3;
但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解
-
17.尽量使用移位来代替'a*b'的操作
同样的,对于'*'操作,使用移位的操作将会更快和更有效
int num = a * 4;
int num = a * 8;
应该改为
int num = a << 2;
int num = a << 3;
-
18.尽量确定StringBuffer的容量
StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再 丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。 
如:StringBuffer buffer = new StringBuffer(1000);  
-
19.尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。
例如:
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时,耗内存操作;或调用耗时,耗内存的方法
……
}
这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。
-
20.尽量避免使用二维数组
二维数据占用的内存空间比一维数组多得多,大概10倍以上。
-
21.尽量避免使用split
除 非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需 要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。
-
22.ArrayList & LinkedList
一 个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指 针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2 者得数据结构,对症下药。
-
23.尽量使用System.arraycopy ()代替通过来循环复制数组
System.arraycopy() 要比通过循环来复制数组快的多 
-
24.尽量缓存经常使用的对象
尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。
-
25.尽量避免非常大的内存分配
有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。
-
26.慎用异常
当 创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。
如 果您创建一个 Exception ,就得付出代价。好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来。从技术上讲,您甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常。幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就 抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则。

文章主要是为了抛砖引玉,希望有更多牛人的指点

谢谢的 xuanyuan 的建议:
===================================================
7.慎用synchronized,尽量减小synchronize的方法
re:同意,不过文中有个地方说错了,使用synchronized关键字并不一定都是锁定当前对象的,要看具体的锁是什么。如果是在方法上加的synchronized,则是以对象本身为锁的,如果是静态方法则锁的粒度是类。
---------------
9.尽量不要使用finalize方法
re:同意,其实不推荐用finalize方法的根本原因在于,JVM的规范并不保证何时执行该方法,所以用这个方法来释放资源很不合适,有可能造成长时间资源得不到释放。
---------------
16.尽量使用移位来代替'a/b'的操作;17.尽量使用移位来代替'a*b'的操作
re:个人不太同意这两条。这样做确实有更好的性能,但是却牺牲了可读性。这两个操作符对很多程序员来说并不直观。我认为在如今硬件价格不那么昂贵的情况下,略微牺牲一些性能,换来更好的可读性和可维护性是好的选择。
===================================================
19.尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。
例如:
Public void test(){
Object obj = new Object();
……
Obj=null;
}
上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时,耗内存操作;或调用耗时,耗内存的方法
……
}
如果Object obj = new Object(); 如果这对象并不是大对象,这有必要吗?Obj=null;只是告诉jvm这个对象已经成为垃圾,至于什么时候回收,还不能确定! 这可读性也不好!
===================================================
posted @ 2011-08-22 15:18 kangxm 阅读(542) | 评论 (0)编辑 收藏

提示/boot目录空间不足,查了一些资料,最后把久的内核给卸载得以解决。

1.首先查看自己使用的内核

lxz@lxz-pc:~$ uname -a

Linux lxz-pc 2.6.35-25-generic #44-Ubuntu SMP Fri Jan 21 17:40:48 UTC 2011 i686 GNU/Linux


2.然后查看自己boot目录,选择需要卸载的版本
lxz@lxz-pc:~$    cd /boot
lxz@lxz-pc:/boot$  ls -l
总计 35125
-rw-r--r-- 1 root root   705861 2011-01-22 06:04 abi-2.6.35-25-generic
-rw-r--r-- 1 root root   709370 2011-03-01 23:56 abi-2.6.35-28-generic-pae
-rw-r--r-- 1 root root   128615 2011-01-22 06:04 config-2.6.35-25-generic
-rw-r--r-- 1 root root   129056 2011-03-01 23:56 config-2.6.35-28-generic-pae
drwxr-xr-x 3 root root     7168 2011-03-23 10:31 grub
-rw-r--r-- 1 root root 10761551 2011-03-04 10:49 initrd.img-2.6.35-25-generic
-rw-r--r-- 1 root root 10741569 2011-03-23 10:18 initrd.img-2.6.35-28-generic-pae
drwx------ 2 root root    12288 2011-01-05 04:52 lost+found
-rw-r--r-- 1 root root   165084 2010-09-25 01:14 memtest86+.bin
-rw-r--r-- 1 root root   167264 2010-09-25 01:14 memtest86+_multiboot.bin
-rw-r--r-- 1 root root  1831296 2011-01-22 06:04 System.map-2.6.35-25-generic
-rw-r--r-- 1 root root  1873873 2011-03-01 23:56 System.map-2.6.35-28-generic-pae
-rw-r--r-- 1 root root     1192 2011-01-22 06:06 vmcoreinfo-2.6.35-25-generic
-rw-r--r-- 1 root root     1196 2011-03-01 23:57 vmcoreinfo-2.6.35-28-generic-pae
-rw-r--r-- 1 root root  4294672 2011-01-22 06:04 vmlinuz-2.6.35-25-generic
-rw-r--r-- 1 root root  4428048 2011-03-01 23:56 vmlinuz-2.6.35-28-generic-pae
上面显示的情况中,是我已经把linux-image-2.6.35-27-generic的结果

3.卸载旧内核应该使用命令:
lxz@lxz-pc:/boot$  sudo apt-get remove linux-image-2.6.35-27-generic

4.查看/boot目录:
lxz@lxz-pc:/boot$ sudo du -m /boot           //以MB为单位显示
1    /boot/grub/locale
2    /boot/grub
1    /boot/lost+found
36    /boot

5.查看文件系统使用情况,和文件系统被挂在的位置:
lxz@lxz-pc:/boot$  df  -lh
文件系统            容量  已用  可用 已用%% 挂载点
/dev/sda7              71G  7.7G   60G  12% /
none                 1001M  244K 1001M   1% /dev
none                 1007M  216K 1006M   1% /dev/shm
none                 1007M  100K 1006M   1% /var/run
none                 1007M     0 1007M   0% /var/lock
/dev/sda8              92M   42M   46M  48% /boot
posted @ 2011-04-06 12:09 kangxm 阅读(3173) | 评论 (0)编辑 收藏

在ubuntu环境下进行android开发,想把目标设备定为真实的手机。

前几天刚买了个defy就试了下,结果打开手机usb调试模式连接到电脑后,在eclipse里面手机名字显示为一堆???号,且无法使用。

需要以下的步骤才能连接到:

1 把手机设备为usb调试模式并和电脑连接

2 打开终端运行

    lsusb


    屏幕上会有一行显示类似

    Bus 002 Device 012: ID 22b8 :xxxx Motorola xxxxxxxxxxxx

    这就是你的android手机了

3 然后在终端运行

   sudo gedit /etc/udev/rules.d/50-android.rules

   并编辑其中加入行: SUBSYSTEM=="usb", SYSFS{"Motorola xxxxxxxxxxxx "}=="22b8 ", MODE="0666"

4 接着运行

    sudo chmod a+rx /etc/udev/rules.d/50-android.rules

    sudo /etc/init.d/udev restart

5 最后进入android sdk的tools目录 platform-tools 运行

    sudo ./adb kill-server

    sudo ./adb devices

试着重新打开eclipse,在运行参数里选则手动选取目标设备,这时在Device Chooser里面应该就可以看到正常显示出名字的手机了。

posted @ 2011-03-23 14:11 kangxm 阅读(2040) | 评论 (2)编辑 收藏

        
        目前手上的项目需要用到memory cache,于是我选择强大的Memcached。至于Memcached的强大先不在这里说了,
后续有时间,我专门来介绍一下Memcached吧。今天只介绍下安装和配置;
         直接进入主题吧;
         1、下载
               Memcached下载地址: http://memcached.org/  我下载的最新版本v1.45
               Libevent下载地址:http://www.monkey.org/~provos/libevent/   我下载的版本是libevent-1.4.13-stable
              
          因为Memcache用到了libevent这个库用于Socket的处理,所以需要安装libevent

        2、先安装libevent
             # tar zxvf libevent-1.4.13-stable.tar.gz
             # cd libevent-1.4.13-stable
             # ./configure –prefix=/usr
             # make
             # make install
      
        3、再安装Memcached,同时需要安装中指定libevent的安装位置:
             # tar zxvf memcached-1.4.5.tar.gz
             # cd memcached-1.4.5
             # ./configure –with-libevent=/usr
             # make
             # make install
             安装完成后会把memcached放到 /usr/local/bin/memcached ,

        4、memcached的基本设置

             启动Memcache的服务器端:
             # /usr/local/bin/memcached -d -m 100 -u root -l 192.168.1.192 -p 12000 -c 256 -P /tmp/memcached.pid

    -d选项是启动一个守护进程,
    -m是分配给Memcache使用的内存数量,单位是MB,我这里是100MB,
    -u是运行Memcache的用户,我这里是root,
    -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.1.192,
    -p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
    -c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
    -P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

           如果要结束Memcache进程,执行:

           # kill  cat /tmp/memcached.pid

          也可以启动多个守护进程,不过端口不能重复。

            
posted @ 2010-04-20 12:19 kangxm 阅读(623) | 评论 (0)编辑 收藏

原处:http://www.javaeye.com/topic/644277

《为什么毕业后5年同学间的差距会拉得如此巨大?》 引起大家不少的共鸣,今天继续发布一篇励志的文章,首先声明:如果你是“愤青”或“类愤青”,对不起,请你离开,我怕我的观点再次伤害你那“纯洁”得几乎不识人间烟火的心灵!

   如果你想从此改变自己,那么,就花上十几分钟的时间,仔仔细细把这篇文章看完。如果你想改变自己的命运,那么,从现在就开始行动。有时候我们之所以失 败,99%的原因是因为说得太多,而行动得太少!那1%的人或许并不聪明,或许只是小学毕业,但是人家成功了,做了你的上司,那是因为人家善于用行动证明 自己,而不是嘴巴。我不敢保证看了我这篇文章就一定会使你平步青云,我没有那个本事。如果你有一天飞黄腾达,也绝对与这篇文章没有直接的关系。因为,你的 命运,只掌握在你自己的手中!

   同样是打工,为什么你一个月只有2、3K,而唐骏的身价却可以高达10亿?

   或许你会反驳我,说人人都成为唐骏的概率有多大?的确,人人都成为唐骏的确不现实,但是经过努力,月薪达到8K、1W的总是大有人在吧?虽然不能达到大富大贵,但也不至于被女朋友看不起,付不起房贷首付款吧?

    很多人都喜欢抱怨,觉得这个世道不好。但现实是,在同样世道不好的情况下,为什么有的人成功,而你却碌碌无为?差距在哪里?怪世道不好吗?还是怪自己没本 事?我说这话可能你不爱听。但是一个无法辩驳的事实是:你要是有本事,为什么月薪只有2、3K或者3、4K?事实胜于雄辩。所以,如果看到这里还想抱怨的 人,那么,也请你趁早离开。抱怨永远解决不了问题。

    职场是一个复杂的综合体。看到别人在职场上呼风唤雨,你认为很惬意,是么?但是他们风光表面的背后,又有几个有看到他们曾经付出的巨大艰辛?这个社会其实 是很公平的。努力不一定有回报,但是如果不努力,就一定没有回报。要怪,就怪自己投错胎,怪自己的老子没本事,当初没有给你留下一大笔可以挥霍的资本!

   说归说,对于那些想改变自己的朋友们来说,还是需要看清楚一些东西,有一些经验也想和大家分享分享。同样是职场人士,我也有我的经验和感受。在打工的3年 里,我得到了7次加薪(同时进入公司的员工,加薪不超过2次的员工大有人在),顺利地从员工做到了总监,是公司所有员工中成长最快的。我敢肯定,在看过这 篇文章的人当中,肯定有人比我更优秀。但是对于那些更渴望得到帮助的朋友们来说,我还是希望把自己的经验写出来,与大家分享。

我自己写了一篇文章,叫《决定前程的8件事,你做到了几件?》在这里整理出来,希望能对大家有所帮助。

一、一定要清楚自己未来的目标是什么
很多人把职场想得太美好,其实不然。如果你没有规划好,你就会难免遇到各种各样的问题:工作不开心;没有前进的动力;工作不是自己想像的那么好;自己的才能无法发挥;看到以前的同学待遇如何如何,便受不了刺激,急切地想跳槽;当初为了生存而找的工作,根本就不适合自己……
这是几乎所有初入职场的朋友都会面临的问题。而这些问题通常会在步入职场的1-3年之内最明显(3年之后之所以不明显,是因为你已经被现实折磨得 太久了,已经被种种不平现象同化了,因此也就习惯了。你曾经的种种抱负被现实碾得粉碎,于是,你也从一个志向远大的年轻人一下子变成了一个碌碌无为、甘于 平庸、成天为了生计而奔走的普通打工者)。

   如果不及早解决这些问题,那么,你就会荒废这3年的时间(有的人可能会更长),而对于一个职场新人来说,这3年至关重要,是锻炼能力、积累资本的黄金3 年!一旦错过,则要花费更多的时间,从头再来,重新弥补!更有甚者,可能一辈子都无法弥补!这绝对不是危言耸听!因此,如果你的职场年龄还没有超过3年, 恭喜你,还有改变命运的机会。而一旦超过了3年,那么,你的每一次改变,都将付出巨大的代价!

   为什么要清楚自己的目标?因为,有了目标,才有行动的指南。知道自己想干什么,喜欢干什么,这才是你前进的最终动力。工作不开心、动力不足、盲目跳槽的最 根本原因是职业目标不清晰。没有目标,便没有了追求,于是,所有的行动只是为了挣一口饭吃。你根本没有考虑过自己的未来应该端什么饭碗。
或许你在30岁之前还有挥霍的资本,因为年轻嘛,做什么都不怕。连广告上都说了,“30岁之前,有什么好怕的?!”而一旦过了30岁,你走的每 一步都必须要慎之又慎,因为:你要结婚、你要养活老婆孩子、你要供房贷、你要供养年迈的父母、孩子大了还要上学、父母年迈了需要照顾……等等等等,所有的 这些责任,都要你来承担。如果没有规划,一旦出现问题,你只能自乱阵脚。

   人生的职业发展如同品牌塑造一样,只不过你的产品就是你自己。你自己的发展目标,也就是你人生的品牌目标。有了目标,就要考虑该怎么走。每走一步,都应该 离目标更近,而不是更远。所以,你每做一个决定的时候,要衡量这个决定对不对,唯一的标准就是:它是不是能够帮助你离目标更近?如果不是,那么,赶紧住 手,因为,你走的路偏离了你的目标!再走下去,只能错得更离谱!

   对于人生目标,涉及到职业生涯规划的问题。这是一个老话题,很多人以为自己很了解了,其实却远不是那么回事。大家可以看一些相关书籍,但在中国,此类书籍 的最大问题就是说教性比较强,实用性非常差!很多人看了书之后依然一头雾水,不知所措,看了之后反而更糊涂。我的意见是,最好还是找一些专门的机构咨询一 下。
注意:是咨询,不是测评。二者的区别在于,咨询的意义在于“为客户提供可应用性的解决方案”,而测评则仅仅局限于“帮助你认识自己”,至于怎么 做,怎样行动才能更接近自己的目标,不知道!因为测评的人都是专家,而国内的专家都是做研究的,没有实战经验,甚至对职场升迁是怎么回事都不太清楚,怎么 可能指导你做实战规划?建议大家去做一下职业生涯规划。如果现在不解决,恐怕未来3年你都会白白浪费,更有可能因此而毁了你的一生!
记住:有了规划,不一定能够成功;但没有规划,一定不会成功!

二、能力固然重要,但并不能代表全部

  这里所说的能力,是指专业技能。步入职场你会发现,能力其实并没有你想像的那么重要,它并不是是步步高升的全部资本。你会发现一个能力不太强的人做了你的 上司,只因为他在这个公司干了10年——这说明“资历”是你高升的本钱(这种现象,在国有企业和政府机构里特别明显,因此,在国企工作的朋友和公务员同志 要注意了);有时候你会发现能力并不怎么强,但是与老板关系非常好的人通常能够得到提拔——这说明“关系”也是本钱。在我原先工作的公司,有两个特别明显 的例子。

    一 个有着丰富工作经验的男士,跳槽来到公司,能力也特别强,但就是与同事处理不好关系,自认为自己非常牛,喜欢主动当别人的“导师”,动不动就对别人的工作 指手画脚,顶头上司非常讨厌他;而同时进入公司的另外一位女士,能力不是特别强,但是非常踏实、勤奋、与其他同事相处得也很好,能够顾全大局。最后试用期 结束时,那位女士得到了公司的认可,而那位男士则收到了公司的辞退通知。

   在职场上,一定要对职场有清醒的认识,不要生活在梦幻当中,不要太理想化,不要标新立异,不要恃才傲物,不要认为有能力就可以走遍天下。专业技能固然重 要,但是职场发展看的是一个人的综合素质。综合素质高的人,才是职场发展的“潜力股”。这些综合素质,包括沟通能力、人际关系能力、团队合作能力、管理能 力、工作态度及敬业精神等各种“软实力”。

    对于有些朋友而言,可能会对这些“软实力”不屑一顾。很多人会说,如果老板喜欢爱拍马屁的人,难道我就要委屈自己,学着去拍马屁?很不幸,我会告诉你,答 案是肯定的,你一定要学会拍马屁,否则吃亏的是自己。但要声明的是,我不是教你诈。中国有句成语,叫外圆内方,用在人际交往上,就是说你与人相处要学会妥 善处理各种关系,但不可因此而失去了内心的准则,否则就变质了。尤其在中国这种注重人情的社会,这种人际交往的能力一定要好好练练。
如果有时间,看一下《厚黑学》,了解一下社会现实,切忌不可因此而迷失了自己。

三、要手足够的“亮剑”资本

    有的大学生经常会跟我说,我毕业之后一定要找到一份月薪多少多少的工作,争取做到什么什么职位。这时候我总是会耐心听完他们的“远大蓝图”,然后问一句:“你凭什么达到你的目标?你的资本是什么?”然后他就会哑口无言。

    我相信读过这篇文章的人也会和这位大学生一样,有着自己的伟大抱负,但是大学四年下来,你有没有想到,要实现这些目标,你的资本是什么?对于很多已经身在职场的朋友而言,你晋升的资本又是什么?

   人生在发展过程中,很多时候都需要毫不犹豫地向别人展示自己的实力,要敢于展示,善于展示,这就是“亮剑”。因为这年头,酒香也怕巷子深,是金子未必会发 光。相反,发光的倒是那些碎玻璃、烂瓶子。中国什么都缺,就是不缺人。茫茫人海,如果你一直都谦虚地默默无闻,那么,你就大错特错了。

   既然具备了“亮剑”的意识,那么,下一步你就要考虑到亮什么剑:我到底拿什么资本给人家看?对于职场上的朋友而言,你“亮剑”的资本又在哪里?你的业绩提 升了吗?你的能力提升了吗?你在一年内看过多少本对自己的职业有益的书籍?你参加过几次培训班来为自己充电?如果没有,你又凭什么让老板为你加工资?靠抱 怨?你肯定会提前被职场淘汰出局!


四、慎重对待第一份工作

这一观点,对于大学生来说,更有意义。
现在整个社会、媒体、专家等等各种单位都一直在鼓吹“先就业,再择业”。这种论调不是今年就有,而是多好多年前就出现了,并且屡屡出现,不绝于耳。相信当年我们大学毕业时候,也会有很多人相信了这一点吧?管它呢,骑驴找马,先找份工作挣钱填饱肚子再说!

但是根据本人自身的经验及职场发展的现实情况来看,本人绝对不赞同这种说法。相信现在在职场上发展不顺的朋友,多半也和第一份工作有关系吧?俗话说,“男怕入错行,女怕嫁错郎。”第一步错了,以后就会经常犯错。正所谓一步错,步步错。

为什么第一分工作这么重要呢?原因有三:

1、先入为主的观念影响。
具体是指,先听进去的话或先获得的印象往往在头脑中占有主导地位,以后再遇到不同的意见时,就不容易接受。举个最简单的例子:在你的头脑印象中, 诺基亚已经是手机的代名词。如果有一天诺基亚生产出了一种“诺基亚牌电脑”,你的心里是什么感觉?非常不对劲对不对?这主是先入为主现象。

我原先有一个同事,曾经在海尔工作过,她用的是海尔的手机,功能也非常不错,但她总是说要换一部手机,我问她原因,她说,兜里装着海尔的手机,总 感觉像装了一个大冰箱,非常不舒服。为什么?先入为主呗!不要小看这一现象,其实对人的潜意识影响非常大。海尔的手机和电脑等IT产品卖得不好,相当一部 分是因为先入为主:大家普遍认为海尔是家电的代名词,而不是IT的代名词。

对于求职的大学生来说,这一观念同样会影响你以后的发展。你的第一份工作会对你以后的工作产生影响,你跳槽时,你的新雇主也会通过你的第一份工作 经验来判断你是否能够胜任这份工作。曾经有一个大学生,毕业之后想做策划,就找了一家广告公司。刚进公司时,因为文笔不错,被安排到了文案的位子上。而与 他同时进去的另外一个人,恰恰因为文笔不好而被安排到了策划的位子上。后来她屡次想转行做策划,但都是因为前一份工作经验的影响,而始终没有得到转行的机 会。

2、职场中不允许从头再来。

如果公司招聘的是有几年工作经验的老员工,一定要求是“相关经验”!这一点至关重要!因为这样的员工一般不需要培训,可以直接上岗,会很快为公司 带来最大的效益。如果是工作几年以后再打算转行的应聘人员,一般不会受到重视,一是不会给公司直接带来效益,二是培训起来也比较困难,思维已经固化。与其 这样,倒不如招一名应届生,白纸一张,可塑性强,发展起来潜力更大。

所以,一旦有了工作经验之后,再想转行从头再来,难度相当大。除非你认识公司的高层领导,可以得到一个机会,否则,很难。

3、时间成本不允许。

步入职场的前三年,是一个人职业成长的最重要、最关键的时期。如果你这时候还把工作的重点放在骑驴找马式的转行上,则会浪费你最宝贵的青春,你的成长也因此比其他人慢一步,而很多晋升的机会将因此而失去。
所以,对待第一份工作,一定要慎重。找工作就像结婚,情愿不结,绝不能乱结。
如果现在你刚刚步入职场还不到3年,劝你趁早做一个职业规划,亡羊补牢,尤未为晚。一旦你结婚了买房子了,你再想弥补都已经晚了!

五、要保持一种“空杯心态”

给大家讲一个故事。古时候有一个佛学造诣很深的人,听说某个寺庙里有位德高望重的老禅师,便去拜访。老禅师的徒弟接待他时,他态度傲慢,心想:我 是佛学造诣很深的人,你算老几?后来老禅师又十分恭敬地接待了他,并为他沏茶。可在倒水时,明明杯子已经满了,老禅师还不停地倒。他不解地问:“大师,为 什么杯子已经满了,还要往里倒?”大师说:“是啊,既然已满了,干嘛还要倒呢?”

禅师的意思是,既然你已经很有学问了,干嘛还要到我这里求教?这就是“空杯心态”的故事哲理。它最直接的含义就是一个装满水的杯子很难接纳新东 西,要将心里的“杯子”倒空,将自己所重视、在乎的很多东西以及曾经辉煌的过去从心态上彻底了结清空,只有将心倒空了,才会有外在的松手,才能拥有更大的 成功。这是每一个想在职场发展的人所必须拥有的最重要的心态。它告诉我们一个道理:做事的前提是先要有好心态。如果想学到更多的学问,先要把自己想象成 “一个空着的杯子”,而不是骄傲自满。

我见过很多的大学毕业生,刚进入公司时常常处处吹牛,说自己在学校如何如何,本来可以找到更好的工作,迫不得已才来到了这里等等之类的话,好像这 家公司委屈了自己。在这里提醒一下那些即将步入职场的大学生:这种心态千万要不得!不要认为自己很牛。还是那句你不爱听的话:中国什么都缺,就是不缺人! 话又说回来,你要是这么牛,为什么不像比尔?盖茨、戴尔、乔布斯那样,大学没毕业就退学去创办一家世界级的大企业?火车不是推的,牛皮不是吹的。
你要是有本事,就用事实证明给人家看,而不是成天抱怨!

对于身在职场的朋友而言,这一心态同样重要。中国有一个词,叫“虚怀若谷”。我们都知道,优秀的人有极高的素养,甚至是虚怀若谷,他们都有一个能 包容一切的胸怀,有了这样的胸怀,你在职场上就会获得别人的尊重,就会获得更多的发展机会。类似的词还有“大智若愚”“大巧若拙”等等,不多说,自己去体 会。

六、要懂一点做人的常识
职场就像一个大熔炉。在职场中,不仅仅是要挣一碗饭吃,更重要的是学会做人的道理。如果连最起码的道理都不懂,你不仅得不到别人的尊重,更会失去更多的发展机会。因为,在中国,人际关系也是生产力。中国有句古话:得道多助,失道寡助。

我见过很多人,虽然已经工作多年,但对于做人,却连一点最基本的常识都不懂。做人的道理万万千,但其中最重要的,莫过于以下三条:

1、严于律己,宽以待人。
职场不同于生活。虽然职场上同事之间的相互关系表面上会比较好,但你总会感觉到缺点儿什么。非常明显的一点,就是大家都在相互利用,人与人之间难免会因为利益关系而闹得不愉快。这时候,你若是锱铢必较,势必引起同事之间的不愉快。
在这种情况下,为避免纠纷,同时也为了赢得他人的尊重,你要学会大度一些,容忍一些。出现问题时,首先想想是不是自己出了问题,而不是一出现问题就去找别人的责任(长此以往,你的心态就会变得非常不平衡,因此也难以容人了)。
严于律己,宽以待人,是十分必要的。长期下去,你会积累很多的人脉,会得到大家的尊重;而你需要帮助时,大家也乐意伸手。
2、学会倾听。
无论什么时候,倾听都显示出一个人的职业素养。与别人交谈时,一定要记住等对方说完话时再发表意见,切不可中途插话或者打断他人。通过这种方式,大家都乐意和你交往,同样也会有助于树立你个人在大家心目中的形象。
3、诚实守信。
职业中固然处处充满了相互利用、利益至上的现象,在这种情况下,诚实守信仍然不失为一种传统美德。诚信同样可以带来效益。只要你诚实守信,长此以 往,大家都会对你形成一种良好的印象,都愿意和你交往。而那种两面三刀、当面一套背后一套的人,固然可以占一点小便宜,但要想成就大事业,诚实守信的基本 原则绝对不能丢。
七、要学会遵守游戏规则
我为什么在文章一开头就提醒“愤青”或者“类愤青”们不要看这篇文章?
因为他们多半是放荡不羁、不会遵守游戏规则的主儿!很多人都会感觉到,在职场上发展,不仅会受到各种约束,而且处处都充满了不公平现象。比如上班 迟到老板会扣你工资,但你加班的时候却从来没有拿过加班工资。这是最常见的一种现象,其他不公平的现象也比比皆是,这里就不多就了,大家都有体会。
在这个世界上,不要奢求公平。那只是一种乌托邦式的理想,从来都不存在于现实社会中。
员工和老板之间的关系,就好像是一场游戏。是游戏就会有游戏规划,否则,游戏就玩不下去。但是,游戏规则是谁制定的呢?当然是老板,各种利益也偏向老板!身在职场的你,一开始看不惯这种现象,是很正常的,因为你初涉职场,本质上还是比较纯洁的。
但你一定要学会慢慢接受这种游戏规则。不要试图改变这种规则,因为在老板面前,你没有太多的话语权。说得再难听些,你只是一个打工的,混口饭吃,给你吃就不错了,还嫌饭凉?如果不想做,可以离开。还是那句话:中国什么都缺,就是不缺人。
记住这句话:“如果你不是游戏规则的制定者,你的选择只有两条:要么屈从,要么离开!”
八、机会只垂青有准备的人
无论你再怎么抱怨,再怎么不开心,饭还是要吃的,觉还是要睡的,工作还是要做的,未来的事情永远只属于自己的。买房子也好,娶老婆也罢,压力只有 自己扛,老板不会为你操任何心。与其有时间去抱怨,但不如踏踏实实静下心来,好好提升自己的基本功,用事实证明自己的本事,让别人对你刮目相看,万不可因 为自己的书生意气而自做一个自毁前程的“愤青”。
当然,你的准备是多方面的,除了专业技能外,其他的辅助技能也是非常必要的,比如沟通能力、人际关系处理能力、管理能力等等。当然,更重要的是 要为自己的未来做一个规划,清楚地知道自己的目标是什么,应该怎么努力才能实现。适当的时候也要充充电,不要舍不得那半个月的工资,这也算是为自己的未来 进行投资,有什么舍不得的呢?如果你现在不学会“舍”,以后将永远也“得”不到。
有时候,你之所以发展得不好,不是因为没有机遇,而是因为你没有准备好,导致机遇与你擦肩而过。这个社会就是这样,再怎么不合理,再怎么不公 平,但是发展机遇是时时都会面临的,只看你有没有准备好。你要是真的练就了一身令人刮目相看的真本事,说不定明天就有人请你做某世界500强的总裁也不一 定呢。
以上只是本人做HR多年的经验积累,希望对大家有所帮助。作为过来人,我真诚地希望在职的朋友们及即将就业的大学生们也能够以一种“空杯心态” 看待这篇文章。有时候,过来人的经验是非常有价值的,那是他们用时间和金钱换来的血汗教训。有的人偏偏不信这一套,认为只有自己亲自体会过,才能知道是什 么滋味,别人的经验只是别人的,和自己无关。如果你这样想,那我也没有办法。我也要有一种宽容的心态,冷静看待那些“不见棺材不掉泪,不撞南墙不回头”的 “人才”,不是吗?参加一下培训,适当充一下电,为未来做更好、更完善的准备,才是积极的人生态度。记住:抱怨永远解决不了问题!)

posted @ 2010-04-16 12:24 kangxm 阅读(496) | 评论 (0)编辑 收藏

       假设我们现在有user和org两张表:
1、user用户表 字段包含:id、name、orgId 其中orgId标示该用户所属的组织
2、org组织表   字段包含:id、name
两表之间的关系很简单,一个组织下会拥有多个用户,一个用户属于某个组织。

         在解析之前先普及一下数据库空值(null)的概念:
有很多时候我们都能碰到某表中某字段值为空的情况,空值不等同于字符串中的空格、空串
也不等同于数字类型的0,所以,一般我们用IS NULL 关键字来检索有空值字段的记录。而不是用!=、<>这些判断符。

        接下来,我们给示例库表中做上一些测试数据,如下图:
                             

        有了这些数据,咱们就可以进入正题啦:
一、左连接、右连接
        A Left join(左连接)优先解出左表中所有的记录,包含右表中没有匹配到得记录。
        A Right join(右连接)优先解出右表中所有的记录,包含左表中没有匹配到得记录。

左右连接是相互对应的,所以在这里一并解释。
罗嗦一句如何区分左表和右表:
        在JOIN的左边出现的表叫左表,在JOIN的右边出现的表叫右表
具体体现在SQL语句上即:(以左连接为例)
        左连接语句:SELECT user.name,org.name FROM user LEFT JOIN org ON  user.orgId = org.id
        右链接语句:SELECT user.name,org.name FROM user RIGHT JOIN org ON  user.orgId = org.id
显而易见,该SQL中,user为左表、org为右表
下面我们来看看这两个语句分别执行后的效果:
                                   
        为了更好的看出左右连接的效果,我们再来看看内连接查询出来的效果
        内连接:SELECT user.name,org.name FROM user JOIN org ON  user.orgId = org.id
内连接语句执行后的效果:
                                                    
        很明显:
内连接与左连接相比,检索结果集中漏掉了user表的user3数据
内连接与右连接相比,检索结果集中漏掉了org表的org4数据

posted @ 2010-03-14 18:25 kangxm 阅读(648) | 评论 (0)编辑 收藏