今天发现另一种没注意到的空指针异常,加上之前碰到的,简单总结一下。

本次的问题,直接上示例代码
[code]
public static void main(String[] args) {
User u = null;
System.out.println("用户编号:" + u == null ? "无" : u.getUserId());
}

public static class User {

private int userId;

public int getUserId() {
return userId;
}
}
[/code]
这个代码看起来好像没问题,实际上报空指针异常。

- 阅读剩余部分 -

某些原因,web服务由resin改为tomcat,最大的一个问题就是tomcat在高并发下完全不胜任(估计会有人扔砖头过来)。
原因:tomcat的session关不掉,每次无cookie请求都会创建新会话,内存中会存储这些会话对象。

举例如下:
tomcat启动后
[code]
[[email protected] data]# jmap -histo:live 22809 | grep session
613: 1 160 org.apache.catalina.session.StandardManager
[/code]

用chrome的隐身模式访问几次后(每次都关掉chrome隐身窗口,然后重新打开,否则cookie会重用,会话也会重用。chrome的隐身只是一个孤岛,不是多个孤岛)
[code]
[[email protected] data]# jmap -histo:live 22809 | grep session
350: 13 1144 org.apache.catalina.session.StandardSession
554: 13 360 org.apache.catalina.session.ManagerBase$SessionTiming
690: 13 208 org.apache.catalina.session.StandardSessionFacade
794: 1 160 org.apache.catalina.session.StandardManager
[/code]

13次访问,产生13组session对象,每组三个。

- 阅读剩余部分 -

今天有童鞋找我问MySql用户无法连接的问题,怀疑是这位童鞋把密码弄错了,就再改了一次密码,结果一直报错。
[code]
mysql> SET PASSWORD FOR user_*=PASSWORD('*');
ERROR 1133 (42000): Can't find any matching row in the user table
[/code]
这个用户肯定是有的
[code]
mysql> select host,user,password from mysql.user where user = 'user_*';
+-----------+--------+-------------------------------------------+
| host | user | password |
+-----------+--------+-------------------------------------------+
| localhost | user_* | *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
[/code]

- 阅读剩余部分 -

Workpress只支持子域名或者子目录方式的多站点,不支持多个不相干的域名,在网络管理员管理子站点时,是可以把域名改为不相干域名,只是这个子站点将一直登录失败。

我要说的,正是解决这个登录失败的问题。

- 阅读剩余部分 -

内训2:说说域名解析

case: 想通过mcp这个名称直接访问10.4.21.184,比如:
ping mcp
ssh mcp
wget http://mcp:8186/

最简单的方法:绑host
在/etc/hosts文件最后加一行
[code]
10.4.21.184 mcp
[/code]

如果多人共享,这种条目比较多,更新起来就会很不爽。有另外一种方式:
在resolv.conf中指定搜索域,用真正的域名来实现
[code]
search toft.tk
[/code]
search后可以跟多个域名,之间用空格分开即可,解析时会域名的配置的顺序分别去解析。
比如:ping mcp
会自动去解析mcp.toft.tk

一个很自然的问题:如果hosts和resolv.con两个都配置了,会以谁的解析结果为准

- 阅读剩余部分 -

内训1:误删日志恢复及运行目录确定。

case 1:
运行着的服务产生的日志,被误删除,怎么找回来。
步骤:
1、先用top或ps找到服务的进程编号:pid
2、xxxxx代表找到的那个pid,找到它下面对应的被删除但还被占用的文件,lsof -p xxxxx | grep deleted
3、在输出结果中,找到日志所在的那一行,找到第四列的数值,比如:115w,假设此值为yyy即115
4、查看相应的日志文件:cat /proc/xxxxx/fd/yyy
或者输出到另一文件:cat /proc/xxxxx/fd/yyy > /tmp/zzz.log
完成。

case 2:
有多个雷同进程,看不出来其所在目录,比如下面这个
[code]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8669 root 20 0 3345m 507m 11m S 0.0 3.2 56:53.80 java -cp .:./../lib/*:./../bin -server -Xmx1024m -Xms1024m
[/code]
步骤:
1、先用top或ps找到服务的进程编号xxxx,比如:8669
2、看lsof的cwd的NAME,一般在标题下的第一行:lsof -p xxxx | head -n 2
还可以用更傻一些的方法:lsof -p xxxx | grep cwd
最后那个NAME列对应的值就是这个进程的工作目录。

- 阅读剩余部分 -