Jan 4

环境:linux,mysql5.5.21

错误:Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

原因:

  同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞;

解决方法:

1、提高允许的max_connection_errors数量(治标不治本):

  ① 进入Mysql数据库查看max_connection_errors: show variables like '%max_connection_errors%';

    ② 修改max_connection_errors的数量为1000: set global max_connect_errors = 1000;

  ③ 查看是否修改成功:show variables like '%max_connection_errors%';

2、使用mysqladmin flush-hosts 命令清理一下hosts文件(不知道mysqladmin在哪个目录下可以使用命令查找:whereis mysqladmin);

  ① 在查找到的目录下使用命令修改:/usr/bin/mysqladmin flush-hosts -h192.168.1.1 -P3308 -uroot -prootpwd;

  备注:

    其中端口号,用户名,密码都可以根据需要来添加和修改;

    配置有master/slave主从数据库的要把主库和从库都修改一遍的(我就吃了这个亏明明很容易的几条命令结果折腾了大半天);

    第二步也可以在数据库中进行,命令如下:flush hosts;

Apr 11
因为在最近项目中需要解析日志中的 URL 的参数,所以我对比了一下五种不同 的 URL 参数解析方法的性能。
URL 参数解析方法:

httpclient org.apache.http.client.utils.URLEncodedUtils

URLEncodedUtils.parse(query, Charset.forName("UTF-8"));
jettyUtil org.eclipse.jetty.util.UrlEncoded

MultiMap values = new MultiMap();  
UrlEncoded.decodeTo(query, values, "UTF-8", 1000);
tomcat org.apache.catalina.util.RequestUtil

Map values = new HashMap();  
RequestUtil.parseParameters(values, query, "UTF-8");
regex 正则表达式

String u = URLDecoder.decode(url, "UTF-8");  
for (String s : parameters) {  
    Pattern p = Pattern.compile(s + "=([^&]*)(&|$)");  
    Matcher m = p.matcher(u);  
    if (m.find()) {  
        m.group(1);  
    }  
}
split 使用String 的split 方法对 URL 进行分割,然后用equals 匹配对应的 参数

String u = URLDecoder.decode(url, "UTF-8");  
for (String s : parameters) {  
    String[] a = new String[100];  
    if (u.indexOf(s) != -1) {  
        a = (u.substring(u.indexOf(s))).split("&");  
        a[0].split("=");  
    }  
}  
前三者是 httpclient, jetty, tomcat 使用的 URL 解析工具。Split 方法是最简单 也是最直观的解析方法,regex 则使用了正则表达式去匹配参数。
Nov 1
Spring MVC 3.2.11 + Spring 3.2.11 + Mybatis3.23

1、Spring MVC 和 Spring 整合的时候,SpringMVC的spring-servlet.xml文件中 配置扫描包,不要包含 service的注解,Spring的applicationContext.xml文件中 配置扫描包时,不要包含controller的注解,如下所示:

SpringMVC的spring-servlet.xmll配置:

<context:component-scan base-package="tk.hecks">

  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>

</context:component-scan>

Spring MVC启动时的配置文件,包含组件扫描、url映射以及设置freemarker参数,让spring不扫描带有@Service注解的类。

为什么要这样设置?因为spring-servlet.xmll与applicationContext.xml不是同时加载,如果不进行这样的设置,那么,spring就会将所有带@Service注解的类都扫描到容器中,等到加载applicationContext.xml的时候,会因为容器已经存在Service类,使得cglib将不对Service进行代理,直接导致的结果就是在applicationContext 中的事务配置不起作用,发生异常时,无法对数据进行回滚。以上就是原因所在。

同样的在Spring的xml配置如下:

<context:component-scan base-package="tk.hecks">          

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

</context:component-scan>

扫描包路径,不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在spring-servlet.xml中扫描过一遍了。
Tags: , , , ,
Mar 30
《大型网站技术架构》读书笔记:

网站架构模式
关于什么是模式,这个来自建筑学的词汇是这样定义的:“每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作”。模式的关键在于模式的可重复性,问题与场景的可重复性带来解决方案的可重复使用。
点击在新窗口中浏览此图片
Mar 30
写本文的缘由:

由于近期本人团队内一个90后员工提出离职,引发本人对员工离职原因及90后员工培养方式的深入思考。

(注:可能分析有些片面,有些就事论事的意思,而且员工年轻化是一个趋势,这里提出90后只是便于就此事展开问题分析)

问题分析思路:

  1. 优先对85前及90后员工的普遍性格特性进行归纳、分析和对比。
  2. 针对不同的性格特征,阐述不同的培养方式。
  3. 依据上述结论,结合本次员工离职分析工作中的得失。

性格分析对比:这里不提及性格优势是为了引出后面的培养方式,不是否认90后的性格优势。




85前员工性格特点90后员工性格特点形成原因
思想独立依赖他人家长过分的溺爱,让孩子缺乏自己决策、思考的机会
行为有目标行为无目标从家庭到教育都是随波逐流,造成无意识的盲从,急于看中眼前成效
内心强大内心脆弱家长过分的溺爱,顺境的生长环境,让孩子没有机会犯错与承担
成就感来自内在成就感来自外在思想独立决定了85前的成就感源自内心的成长,90后更渴望来自他人的承认与赞美
团队意识弱更强的团队意识90后员工之间私下交流沟通比较多,工作中可以进行更有效的合作,帮助。
Mar 30
最近又用到XML,发现也有必要聊聊XML的几种方式。

1、如果只是简单生成或者解析,自己写一个帮助类就行,下面这个是我前段时间用递归写的,优势方便可以扩展

import java.util.ArrayList;
import java.util.List;

/**
*
*
*
*         TODO manage node and value.and format the node to xml file
*
*/
public class XMLSimpleNode implements SimpleNode {
    private String nodeName;
    private String value;
    List<SimpleNode> childs;
    private String header;

    public XMLSimpleNode(String nodeName) {
        this.nodeName = nodeName;
        childs = new ArrayList<SimpleNode>(2);
    }

    public String getNodeName() {
        return nodeName;
    }
Tags: ,
Mar 30

为什么项目会变得紧急?


其实在我们的现实项目中有很多时候,项目会被要求在一个看上去似乎不现实的条件下完成,因素很多,总结一下:



1、为了争夺或抢占市场。
2、为了向客户或领导演示汇报。
3、向重要的客户承诺在较短的时间进行交付。

如何处理紧急项目?


1. 明确目标



用户需求:项目总要有产出,在着手列计划开始工作之前,请先与客户沟通,明确客户想要的是什么?




1、系统功能完整,质量良好,并投入使用。
2、完成核心功能的开发,并投入使用。
3、了解项目进度,系统界面和功能设计,或向上级领导汇报。

我想我们更多的情况是后两者。

Mar 30
一、JVM内存模型概括

点击在新窗口中浏览此图片
还有一个寄存器,线程运行于其上面

1.程序计数器
记录线程的执行位置,线程私有内存,唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
2.线程栈(VM stack)
点击在新窗口中浏览此图片
栈的默认大小是1M

-Xss2m 这样设置成2M

异常 :Fatal: Stack size too small

异常的引起一般是线程数目太多
Tags: , , ,
Mar 30
如果是内存调优,请看我以前一篇博文 http://www.hecks.tk/post/427/

调优演示

1. 先写一个死锁小程序,如下

复制代码
package tk.hecks.jin.bin;

/**
*
*
* 线程死锁演示调优
*
*/
public class Test4DeadLock extends Thread {
    public static Object obj1 = new Object();
    public static Object obj2 = new Object();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                synchronized (obj1) {
                    System.out.println("have in obj1 lock");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("wait for obj2 lock");
                    synchronized (obj2) {
                        System.out.println("lock2 have been done");
                    }
                }
            }
        }).start();
Mar 30
ServletContextListener的用法:这个事件类作为Web应用服务的一部分,处理Web应用的 servlet上下文(context)的变化的通知。这可以解释为,好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。
因此,在通知上下文(context)初始化和销毁的时候,ServletContextListner非常有用。


分页: 5/47 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]