[转载]MySQL 5.6 中 TIMESTAMP 的变化

注:阿里云现行使用的 MySQL RDS 版本为 5.6,小版本未知,且未开放 explicit_defaults_for_timestamp 参数的设置

本文转载自:http://www.williamsang.com/archives/818.html

在MySQL 5.6.6之前,TIMESTAMP的默认行为:

  • TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)设置TIMESTAMP的列值为NULL,会自动存储为当前timestamp。
  • 表中的第一个TIMESTAMP列,如果没有声明NULL属性、DEFAULT或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。
  • 表中第二个TIMESTAMP列,如果没有声明为NULL或者DEFAULT子句,默认自动分配’0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认分配’0000-00-00 00:00:00′,且没有警告。

MySQL5.6-MyISAM-timestamp

MySQL5.6-MyISAM-2timestamp
2列TIMESTAMP未声明为NULL的默认行为

从MySQL5.6.6开始这种默认设置的方法被废弃了。在MySQL启动时会出现以下警告:

1
2
3
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option
(seedocumentation for more details).

关闭警告,在my.cnf中加入

1
2
[mysqld]
explicit_defaults_for_timestamp=true

重启MySQL后错误消失,这时TIMESTAMP的行为如下:

  • TIMESTAMP如果没有显示声明NOT NULL,是允许NULL值的,可以直接设置改列为NULL,而没有默认填充行为。
  • TIMESTAMP不会默认分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP属性。

MySQL5.6-INNODB-timestampTIMESTAMP 不设置是否为NULL

  • 声明为NOT NULL且没有默认子句的TIMESTAMP列是没有默认值的。往数据表中插入列,又没有给TIMESTAMP列赋值时,如果是严格SQL模式,会抛出一个错误,如果严格SQL模式没有启用,该列会赋值为’0000-00-00 00:00:00′,同时出现一个警告。(这和MySQL处理其他时间类型数据一样,如DATETIME)

MySQL5.6-INNODB-timestamp-NOT-NULL
TIMESTAMP 默认设置为NOT NULL

Note:

以上内容和存储引擎选择无关。

Apache CXF 客户端开发

通过 WSDL 生成 Java 代码

在 IDEA 配置 CXF Engine 时各种不让我选择目录,不知道什么原因,因此通过命令行来生成:

  • apache-cxf-home: CXF 目录
  • output-dir: 生成的代码输出目录
  • package-name: 生成的 Java 代码的包路径
  • wsdl-url: 远端的调用地址( ?wsdl )

添加 Maven 依赖

Java Config 方式与 Spring 整合

网上包括官方文档都比较老,单独写个实例:

WordPress 4.0

虽然已经基本处在无内容更新的状态,还是升级了,想想也活了好多年了……且行且珍惜……

Maven Tips

Nexus

使用本地代理仓库

Nexus配置好后会默认有一个Maven Central仓库的Proxy,将自己的项目配置成使用代理

将插件仓库也配置成使用本地代理

调整Nexus缓存时间

由于国内访问Maven仓库很卡,容易发生网络故障导致Nexus缓存了未找到记录,可在Nexus后台将对应仓库的Not Found Cache TTL改成一个较短的值(例如5分钟)

为不同的开发环境创建不同的仓库

通常一个项目在不同的环境下存在不同的版本,本文创建dev、qa、production三个仓库并演示如何通过变量来选择使用哪个仓库

使用变量

使用不同的profile定制变量

以下配置声明了dev、qa、production三个profile,并分别定义了branch和skipTest两个变量,且将dev置为默认激活的profile:

命令行可通过-P参数来指定使用不同的profile,例如:

通过变量声明仓库

在Central仓库基础上加入

禁用仓库中Snapshot版本的唯一版本号

发布

配置deploy仓库

以配置snapshotRepository为例:

配置deploy账号

编辑文件:

文件内容如下:

常规发布

通过前两处配置,已经可以正常发布:

跳过发布

通常对于J2EE的WAR项目,只需要编译打包,而不需要将WAR文件发布到仓库中,通过配置maven-deploy-plugin跳过发布环节:

打包额外的jar

通过maven-jar-plugin可以在项目中打包出更多的自定义jar包:

可通过配置多个execution并为其指定不同的id来打出更多的jar

注意:此方式打出的jar不会在deploy时发布到仓库中,而通过classfier方式打出的jar会发布,请注意此区别

以上两种方式在编译期都可以做到在target目录输出jar包的效果

发布额外打包的jar并指定自定义POM

以下配置将当前构建跳过发布,并打包额外的jar,然后为这个jar指定自定义的POM信息后上传至指定仓库:

包含空目录

Maven构建时会自动忽略空目录,以下插件配置可将空目录保留:

nginx反向代理配置keepalive

有个项目上的Keep-Alive配置一直不起作用,检查了很久代码找不到问题,然后灵光一现想到应该是反向代理配置的问题

即:client—–nginx proxy—–real server

client配置了使用keepalive,real server也支持,问题就在于nginx代理没配置对

配置方式如下:

1、配置upstream,keepalive需要在upstream里配置


upstream http_backend {
server 127.0.0.1:8080;

keepalive 16;
}

2、修改proxy设置,proxy_http_version必须设置为“1.1”,且需要清空Connection头


server {

location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection “”;

}
}

参考资料:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive