Loading...
My Blog 我的工作和学习笔记

在Spring MVC的拦截器里面获取上传和下载的文件大小

Spring专题 2018/03/08

在Spring MVC拦截器里面获取到文件的大小:

上传:在拦截器的方法preHandle里面获取方式:

        if(request != null && ServletFileUpload.isMultipartContent(request)){
            ServletRequestContext ctx = new ServletRequestContext(request);
            //获取上传文件尺寸大小
            long contentLength = ctx.contentLength();
            System.out.println("***********upload**************contentLength="+contentLength);
        }



下载:在拦截器的方法postHandle里面获取方式:

        if(request.getRequestURI().contains("/download")){
            String contentLength = response.getHeader("Content-Length");
            System.out.println("***********download**************contentLength="+contentLength);
        }



关于mongoDB的一些常用查询语句

mongoDB笔记 2017/08/31 MongoDB

模糊查询:

db.collectionsName.find({"tname": {$regex: '测试', $options:'i'}}) 

db.collectionsName.find({"tname": {$regex:/测试.*/i}}) 


降序排序:

db.collectionsName.find({}}).sort({"createAt":-1})


升序排序:

db.collectionsName.find({}}).sort({"createAt":1})


MySQL存储引擎中的MyISAM和InnoDB区别详解

程序员笔记 2017/03/06 MySQL

MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

MyISAM与InnoDB的区别是什么?

1、 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

2、 存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

4、 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

5、 AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

7、 全文索引

MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8、 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9、 表的具体行数

MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、 CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

11、 外键

MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。


文章来自:

http://www.jb51.net/article/62457.htm

产品经理面试题

团队建设 2017/02/14

1、介绍一下你自己

2、做过的项目有哪些,简单的介绍一下

3、你觉得产品经理需要具备那些能力?

逻辑能力、沟通能力、文档能力、学习能力、项目管理能力、自我管理能力、抗压能力

4、什么算作成功的产品?

一个好的产品,首先要解决用户的需求;一个好的产品,其次是要有黏性;一个好的产品,要拥有不错的体验。

5、产品经理工作有哪些?

需求收集、产品的定义与设计、项目管理、产品生命周期管理

6 你平时的工作流程是什么样子的?

收集产品需求(需求池)→  评审需求→ 竞品分析 产品原型设计  Demo评审→ UI评审→ 开发跟踪→上线前的测试  产品上线后的bug收集  对客服的培训,可根据实际情况酌情进行调整。

7、产品需求的来源有那些?

8、遇到不可沟通的人怎么办?

9、为何想做产品经理?

10、为什么选择我们公司?

11、说一款比较好的APP,并说好在什么地方?

12、有许多需求,你是如何划分优先级的?

13、你未来的职业规划是什么?

14、如何将用户需求转换为产品需求?

15、离职原因(永恒的难题)?


Mysql提示Can’t connect to local MySQL server through socket的解决方法

程序员笔记 2017/01/12

mysql使用mysql -u root -p登录时提示如下信息:

Can’t connect to local MySQL server through socket

解决办法如下:

http://www.aiezu.com/db/mysql_cant_connect_through_socket.html


附带MySQL修改root密码的方法:

http://www.cnblogs.com/cuikang/p/5977800.html


参考资料来源网上,此处仅做记录

Mysql 会导致锁表的语法

程序员笔记 2016/09/13 MySQL

测试环境:Mysql 5.5 基于innodb 引擎


[sql] plain copy

  1. insert into  table1 values select  … from table2 …. 

    此种方法,会锁table2

[sql] view plain copy

  1. delete table1  from table1 inner join table2  on table1.id=table2.id  …  

      此种方法,会锁table2

[sql] view plain copy

  1. update tabel1,table2 set table1.name=’feie’ where table1.id=table2.id  

    此种方法,会锁table2

[sql] view plain copy

  1. update tabel1,table2 set table1.name=’feie’ where table1.id=table2.id and table1.id=1;  

    此种方法,会锁table2.id=1的记录

-----------------------------------------第二次编辑分割线--------------------------------------

假设kid 是表table 的 一个索引字段 且值不唯一
1.如果kid 有多个值为12的记录那么:
update table  set name=’feie’ where kid=12;  
会锁表


2.如果kid有唯一的值为1的记录那么:
update table  set name=’feie’ where kid=1;  
不会锁


总结:用索引字段做为条件进行修改时, 是否表锁的取决于这个索引字段能否确定记录唯一,当索引值对应记录不唯一,会进行锁表,相反则行锁。


如果有两个delete

kid1 与 kid2是索引字段
语句1 delete from table where  kid1=1 and kid2=2;
语句2 delete from table where  kid1=1 and kid2=3;
这样的两个delete 是不会锁表的


语句1 delete from table where  kid1=1 and kid2=2;
语句2 delete from table where  kid1=1 ;
这样的两个delete 会锁表
总结:同一个表,如果进行删除操作时,尽量让删除条件统一,否则会相互影响造成锁表


参考文档

http://blog.csdn.net/yonghumingbuzhidao/article/details/8330795


JAVA企业级项目开发约定

程序员笔记 2016/08/23

在现有的软件开发方法中,我们通常使用的是敏捷的软件开发方法,对团队在开发过程中整体协调性要求很高, 在开发过程中约定好开发规则,有利于项目统一性、持续性、扩张性,本着约定优于开发的原则,项目开发需要遵循如下开发规则:

1、类的命名:大写字母开头,遵循驼峰标示

模块名称

Article、RabbitmqLog

 

包约定

实体:entity

数据传输类:dto

持久层:dao

业务层:service

视图层:web

WEB服务:webservice

工具utils

通用common

其他:rabbitmq、mina、quartz

 

类约定

持久类:ArticleDao、ArticleDaoImpl、RabbitmqLogDao

业务类:ArticleService、ArticleServiceImpl

视图类:ArticleController、RabbitmqLogController

方法约定

getById();

getByNameAndId(String name,Long id)

getList();

getPage()

save();

update();

checkUsername();

isUnique(Sring name);

 

文件夹约定

以模块名称来命名:

cms

article

channel

index

login


 

页面约定

rabbitmq-log.jsp

rabbitmq-log-detail.jsp

article.jsp

article-input.jsp

article-detail.jsp

article-update.jsp

数据库表名称:系统名称_模块名称_实体名称

ticket_product

ticket_order_product

ticket_order_product_parent

ticket_product

 

 

类注释:

/**

 * TicketInventorReceiveService.java

 *

 * @author Ethan Wong

 * @since JDK 1.7

 * @datetime 2016年3月17日下午1:56:11

 */


方法注释:

    /**

     * 

     * @param entity

     * @param inventoryId

     * @return

     *

     * @author Ethan Wong

     * @datetime 2016年3月17日下午1:56:28

     */


内部属性注释:

public class Article{

    private String title;//标题

    private String content;//名称

    ...

    getter and setter

}

 

静态属性注释:

public class Constant{

  /**

     * 是否发送短信

     */

    public static final Boolean IS_SEND_SMS = true;

}

 

代码编程约定,在保证业务逻辑的前提下,提高代码可读性

1、变量名称的名称可以通过字面意思理解,不可简写

2、尽量缩短变量的作用域

3、需要使用变量是才声明

4、优先处理错误情况,并且返回错误信息

5、if  else 嵌套尽量不超过3层,超过部分抽象封装独立方法

6、相同业务的代码不可多处编写,封装通用业务代码

7、保证代码的阅读顺序为由上至下,而不是上下跳着阅读

8、代码需要持续重构,实现代码最优,不可以完成业务功能为结束目标


ImEthan CMS练习项目

ImEthan项目 2016/08/15

有一段时间没有坐下来认真的写一个功能模块了,深深的陷入了项目管理的泥潭,作为一名优秀的软件工程师怎么能不写代码呢?所以起了一个CMS练习项目,规划设计下功能,进行UI选型,着手做架构设计,练练手并且完成它。


第一步:UI选型

基于bootstrap开源UI

https://www.almsaeedstudio.com/blog/new-and-free-bootstrap-admin-template-2016


未完待续~


Centos修改root密码

Linux操作笔记 2016/07/13 Linux

[root@localhost ~]# passwd

Changing password for user root.

New password:

Retype new password:

passwd: all authentication tokens updated successfully.


nginx 禁止非法url访问

Linux操作笔记 2016/06/29 Nginx

$request_uri 这个变量等于包含一些客户端请求参数的原始URI,我们可以通过if判断,限制非授权用户使用关键字访问我们的页面

 

  if  ($request_uri  ~* "/abc.html\?test") {

            return 403   "I've recorded your ip Wait to check the water meter";

}

如果正常访问abc.html 是正常的,如果添加了?test  这个参数,可能是要非法访问,就会提示  "I've recorded your ip Wait to check the water meter"

 

添加参数测试

 

参考文档

http://blog.chinaunix.net/uid-26719405-id-4777586.html