ALTER语句的坑

alter modify 字段

ALTER 对于默认的Null值是不会修改的, 如果sex存在null的情况, 下面的语句会报错

1
2
3
ALTER TABLE customer
MODIFY `sex` int(11) NOT NULL DEFAULT '-1' COMMENT '性别. -1,未知; 0,女; 1,男';

必须先执行update

1
UPDATE customer SET  sex = -1 WHERE sex is NULL ;

alter 加字段

超过10W 的数据不能直接加字段, 需要创建临时表

参考 https://zhidao.baidu.com/question/917987491401145099.html

https://help.aliyun.com/document_detail/26132.html

alter加索引

30W 条数据, 2340ms, 大概10W条数据 800ms

1
2
3
4
5
6

alter table customer_device_info
add key idx_customer_id_is_use(customer_id, is_use),
add key idx_customer_id_registration_id(customer_id, registration_id(4)),
add key idx_device_id(device_id(15)),
drop key index_customer_id;

配置maven私服deploy

在项目配置地址, 务必是release. public不行

1
2
3
4
5
6
7
8
9
10
11
<distributionManagement>
<repository>
<id>Release</id>
<url>***</url>
</repository>
<snapshotRepository>
<id>Snapshot</id>
<url>***</url>
</snapshotRepository>
</distributionManagement>

在 setting.xml配置账户

1
2
3
4
5
6
7
8
9
10
11
12
<servers>
<server>
<id>Release</id>
<username>admin</username>
<password>***</password>
</server>
<server>
<id>Snapshot</id>
<username>admin</username>
<password>***</password>
</server>

开启deploy

浏览器登录nexus管理界面–>设置图标–>Repository–>Repositories–>maven-releases–>Hosted–>请选择‘Allow redeploy’策略,默认是disable策略,然后保存。 请注意,不同版本的nexus,进入的路径可能有细微区别

deploy

mvn clean install deploy -DskipTests

其他

一般host配在项目里面, 密码配置在settings.xml里面比较合适, host有的公司也配置在settings.xml里面

sudo chattr -i /home/q/www/ims-task/webapps/ROOT/WEB-INF/classes/database.properties

估算数据量

在java 堆内存中

以key : value = 1:1000的比例, value 大小适中, 1000W value大概占用 400M heap

1
2
Map<String, List<String>>

线程池调度 100W runnable, 每个runneble 包含一个 有三个属性的简单对象, 大概占用 400M heap

在 redis中.

1W 个大概 md5生成的key, value 为有三个属性的简单对象。 1W 个key, 大概占用 1.2M

常用java命令

命令简介

对象信息

jmap -histo:live ${pid} |sort -k2 -nr |less

jmap命令在使用前会报Can't attach to the process: ptrace(PTRACE_ATTACH, ..), 参见该篇文章解决即可

jstat -gcutil pid 600 10

jvm 总览

https://my.oschina.net/feichexia/blog/196575

系统资源

系统资源 http://www.cnblogs.com/ggjucheng/archive/2012/01/05/2312625.html

vmstat 2

top

参考

https://my.oschina.net/goldwave/blog/168516

运用实例

java线程突然内存占用 90% 找出问题所在

  • 找到java进程
    1
    pid=`ps -elf |grep appname |grep -v grep`
  • 找到进程中最耗时间的线程

pid2=top -Hp ${pid}

  • 将对应的线程pid转化为 16进制
    nid=printf "%x \n " ${pid2}

  • jstack生成进程的线程快照
    jstack ${pid}

  • 从线程快照中定位对应的 java类 和对应方法
    jstack ${pid} |grep ${nid}

  • 最后查看指定类的代码

部署java应用后的事情

key: 负载均衡, nginx内部转发, 日志收集

公网调用

公网调用需要申请弹性ip, 或者内网转发

负载均衡

内网的http调用需要修改负载均衡地址

日志收集

注意redis 的安全组

注意 logstash的配置文件中的 type不能有 ‘-‘

注意日志文件的路径不要写错

注意nginx的日志配置要打印 用户唯一id