一、代码优化
代码结构层次的优化(目的:更加方便代码的维护–可维护性,可读性)1.代码注释(代码规范)2.工具类的封装(方便代码的维护,使代码结构更加清晰不臃肿,保证团队里代码 质量一致性)3.公共部分的提取
代码性能的优化(目的:使程序的性能最优化)1.使用一些性能比较高的类(bufferInputStream)2.缓冲区块的大小(4k或者8k)3.公共部分的提取4.通常要用stringbuffer替代string加号拼接
二、业务优化
我们做项目的时候业务优化这方面最主要是从用户体验度角度进行考虑,减少用户操 作的步骤提高工作效率,通常有以下几种:1.可以通过tabindex属性来改变tab键盘的操作顺序2.可以通过回车键来进行搜索或者提交操作3.对于单选按钮和复选按钮可以通过操作后面的文本来选择前面的单选按钮以及复选 按钮4.添加的信息要按照id倒序进行排列5.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而 且防止用户多次点击提交操作)6.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认。7.根据returnURL在用户登录成功后直接跳到想要访问的资源。8.进行删除操作时通过confirm提示用户是否确认删除操作,操作完后提示操作是否 成功。9.减少用户操作的步骤10.使用autocomplete插件快速进行搜索
必背,必做:1.可以通过回车键来进行搜索或者提交操作2.添加的信息要按照id倒序进行排列3.进行搜索操作时加入js loading操作(不仅告诉用户所进行的请求正在被处理,而且防止用户多次点击提交操作)4.当进行删除操作的时候要弹出提示框,警告用户要进行删除操作,是否确认,如果删除成功则弹出提示框告诉用户。5.减少用户操作的步骤6.通过ztree,以及kindeiditor来提高用户的体验度
三、sql优化
1、SELECT子句中避免使用 *, 尽量应该根据业务需求按字段进行查询
2、尽量多使用COMMIT如对大数据量的分段批量提交释放了资源,减轻了服务器压力
3、在写sql语句的话,尽量保持每次查询的sql语句字段用大写,因为oracle总是先解析 sql语句,把小写的字母转换成大写的再执行
4、用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据,所执行效率 要快于UNION,并且UNION可以自动排序,而UNION-ALL不会
5、避免在索引列上使用计算和函数,这样索引就不能使用
Sql优化精简版:
1.(重点)(必须说) SELECT语句中避免使用 *,尽量应该根据业务需求按字段进行查询
举例:如果表中有个字段用的是clob或者是blob这种大数据字段的话,他们的查询应该根据业务需要来进行指定字段的查询,切记勿直接用*
2.(重点) 删除重复记录(oracle):最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
用>=替换>
如一个表有100万记录,一个数值型字段A,A=0时,有30万条;A=1时,有30万条;A=2时,有39万条;A=3时,有1万记录。那么执行 A>2 与 A>=3 的效果就有很大的区别了,因为 A>2 时,ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。
4.(重点)尽量多使用COMMIT如对大数据量的分段批量提交
(重点)用NOT EXISTS 或(外连接+判断为空)方案 替换 NOT IN操作符
此操作是强列推荐不使用的,因为它不能应用表的索引。推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替
6.(重点 必须说)LIKE操作符(大数据的全文检索使用luncene)(solr)因为使用like不当,会导致性能问题,原因是like在左右两边都有%的时候,不会使用索引。
如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’ 则会引用范围索引。
一个实际例子:查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成 YY_BH LIKE ‘X5400%’ OR YY_BH LIKE ‘B5400%’则会利用 YY_BH 的索引进行两个范围的查询,性能肯定大大提高。
7.(重点,必须说)避免在索引列上使用计算和函数,这样索引就不能使用举例:低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;高效:SELECT … FROM DEPT WHERE SAL > 25000/12;
8.(重点 必须说)用UNION-ALL 替换UNION,因为UNION-ALL不会过滤重复数据而且不会自动排序,所执行效率要快于UNION。
(优化,重点,3个方面 a.缓存 b.分段批量 c.存储过程)减少访问数据库的次数举例:如果批量删除多条数据,可以用 delete from tableName where idin (1,2,3)而不要用多条delete语句进行删除
10.(重点 必须说)用TRUNCATE替代DELETE TRUNCATE不记录日志,DELETE记录日志,所以TRUNCATE要快于DELETE但是一旦用TRUNCATE进行删除就不能进行恢复,TRUNCATE是删除整张表的数据不能加where条件。
mysql,sqlserver中如果id为自增类型,那么如果用TRUNCATE删除,则id字段再插入数据时从1开始,如果delete删除的话,则从删除之前的id的值继续增长。
四、防sql注入
针对防sql注入,我们通常是这样做的:首先在前台页面对用户输入信息进行js验证,对一些特殊字符进行屏蔽,比如:or ,单引号,–,= ,还有就是限制用户名输入的长度,我们一般将其限制在6—13位。另外,对于用户的敏感信息我们进行Md5加密,还有,为了增加用户体验度和用户友好度,为了不使用户看到一些详细的异常信息我们会进行错误信息页面的定制,像404,500错误。另一个我层面讲,这样做也是为了保护我们的一些重要信息。此外,我们会给特定的人分配定定的权限,而不是给其分配管理员权限!sql注入
所谓SQL注入,就是通过一些含有特殊字符的sql语句发送到服务器欺骗服务器并进行攻击。(特殊字符:or, 单引号,–,空格)Sql注入的防护1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式(js正则或者java后台正则),或限制长度;对单引号和双"-"进行转换等。2.永远不要使用动态拼装sql,使用参数化的sql。(永远不要使用+号拼接sql字符串,而是使用?传参的方式进行)3.不要给用户太高的权限而根据需求进行赋权4.对敏感信息进行加密 如md5(单向加密不可逆转)。5.自定义错误页面。目的是为了不把我们的程序的bug暴露在别有用心的人的面前。而去不会让用户看到报错的页面,也提高了用户的体验度。
SQL注入防范使用参数化的过滤性语句要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。输入验证
检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端(java代码)都执行之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如Regular Expression Validator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过Custom Validator自己创建一个。错误消息处理
防范SQL注入,还要避免出现一些详细的错误消息,因为黑客们可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。加密处理将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。存储过程来执行所有的查询SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。使用专业的漏洞扫描工具 攻击者们目前正在自动搜索攻击目标并实施攻击,其技术甚至可以轻易地被应用于其它的Web架构中的漏洞。企业应当投资于一些专业的漏洞扫描工具,如大名鼎鼎的Acunetix的Web漏洞扫描程序等。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找网站上的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。确保数据库安全 锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限,撤销不必要的公共许可,使用强大的加密技术来保护敏感数据并维护审查跟踪。如果web应用不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限,那么就禁止它对此表的 drop 、insert、update、delete 的权限,并确保数据库打了最新补丁。安全审评在部署应用系统前,始终要做安全审评。建立一个正式的安全过程,并且每次做更新时,要对所有的编码做审评。开发队伍在正式上线前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关, “就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评。
五、数据库中常用术语:
ddl:数据定义语言 Create Drop Alterdml:数据操纵语言 insert update delete selectdcl:数据控制语言 grant revoketcl:事务控制语言 commit rollback深入java虚拟机以及大数据
1.jvm的相关概念当List放了大量的数据超过jvm中所能容纳的内存后,就会发生堆溢出。当递归调用没有临界退出条件就会出现 栈溢出。
当批量导入大量数据或者用dom4j解析大的xml文件的时候,会出现 堆溢出,这个时候可以通过分段批量提交以及用sax代替dom4j来解决问题。
heap(堆),stack(栈)
jvm的结构细分及其概述?
Java 虚拟机有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的。
jvm 内存结构?堆: 逻辑上是连续,物理上可以处于不连续的内存空间中,里面存储的是对象实例以及数组。可以细分为新生代,老生代。通过-Xmx和-Xms控制大小。
虚拟机栈:基本数据类型,对象引用(地址,指针)。
本地方法栈(了解):它与虚拟机栈发挥的作用差不多,区别在于虚拟机栈为java方法的执行提供服务,而本地方法栈为虚拟机使用到的Native(本地)方法服务。
方法区:放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小
在服务器启动的时候报内存溢出是因为方法区太小,也就相当于持久代的内存太小。通过-XX:PermSize以及-XX:MaxPermSize来指定其大小,可以解决这个问题。
常量池是方法区的一部分,用来存储常量信息。如String就存储在常量池中。
计数器(了解):通过该计数器的值来选取下一条要执行的字节码指令。
GC是什么,为什么要有GC?GC就是垃圾回收,java这种语言是动态分配内存大小的,并且依靠垃圾回收机制来完成对分配内存空间的回收,从而来避免内存溢出的问题,也在一定程度上降低了程序员工作的复杂度。
jvm中的GC采用了generation(分代回收)算法,因为大多数的对象存活的时间比较短,而少部分的对象才能够长时间存活。因此,jvm将堆内存划分为年轻代(young generation)和年老代(old generation)。年轻代中的对象通常建立时间不久,且大部分生命周期也很短;年老代中的对象则已经创建比较久了,其声明周期也相对年轻代比较长。按照上面的划分,jvm在做GC时也进行了区别对待,对年轻代GC会相对比较频繁,且采用了copying(复制)算法;年老代的GC相对比较少,且采用的是tracing算法的一种,是标记-清除-压缩。
JVM内存限制(最大值)
JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然 可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统 下为2G-3G),而64bit以上的处理器就不会有限制了。
Java 监视和管理控制台:JConsole 使您能够在运行时监视各种 JVM 资源统计信息。这种特性特别适用于检测死锁、内存泄漏。它可以连接到一个本地或远程 JVM 并可用来进行监视:线程状态(包括相关的锁)内存使用情况垃圾收集运行时信息JVM 信息
jvm的调优?
开启-Server模式,增大堆的大小,以及持久代的大小,从而提高程序的运行效率,并且将初始堆大小和最大堆大小设置为一样的值从而避免了堆增长会带来额外压力。持久代大小的设置同理,也设置为初始大小和最大大小一样大。
jvm的类加载机制? jvm中类的生命周期?
生命周期:加载、连接、初始化,使用,卸载
对象基本上都是在jvm的堆区中创建,在创建对象之前,会触发类加载(加载、连接、初始化),当类初始化完成后,根据类信息在堆中实例化类对象,初始化非静态变量、非静态代码以及默认构造方法,当对象使用完之后会在合适的时候被jvm垃圾收集器回收。
要经过三步:加载(Load),链接(Link),初始化(Initializ)。其中链接又可分为校验(Verify),准备(Prepare),解析(Resolve)三步。ClassLoader就是用来装载的。通过指定的className,找到二进制码,生成Class实例,放到JVM中。
ClassLoader从顶向下分为 :
Bootstrap ClassLoader:引导类加载器,它负责加载Java的核心类(如rt.jar)
Extension ClassLoader:扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext)中的JAR包
System ClassLoader:系统(也称为应用)类加载器,它负责在JVM被启动时加载来自在命令java中的-classpath中的JAR包
User-Defined ClassLoader:用户自定义的类加载器
linux中的命令:
ps -ef | grep :查看进程信息vi:文件编辑命令more:分页查看命令top:常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况ifconfig:显示或配置网络设备的命令ping:它通常用来测试与目标主机的连通性rsync、scp:文件同步命令
2.云计算+大数据的具体技术实现方案:
Hadoop是一个能够对大量数据进行分布式处理的软件框架。它以并行的方式工作,通过并行处理加快处理速度,维护多个工作数据副本,具有可伸缩性,能够处理 PB 级数据.
hadoop 由许多元素构成。其最底部是HDFS,它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎.
hadoop下的子项目:HDFS:Hadoop分布式文件系统MapReduce:并行计算框架(建立在HDFS上的)HBase: 类似Google BigTable的分布式NoSQL 列数据库Hive:数据仓库工具Zookeeper:分布式锁设施Pig: 大数据分析平台,为用户提供多种接口
行业知识(了解):存储容量:是该存储设备上可以存储数据的最大数量,通常使用千字节(kb kilobyte)、兆字节(MB megabyte)、吉字节(GB, gigabyte)、太字节(TB ,terabyte)和PB(Petabyte)、EB(Exabyte)等来衡量。1KB=2(10)B=1024B; 括号中的数字为2的指数(即多少次方)1MB=2(10)KB=1024KB=2(20)B;1GB=2(10)MB=1024MB=2(30)B。1TB=2(10) GB=1024GB=2(40)B1PB=2(10) TB=1024TB=2(50)B1EB=2(10) PB=1024PB=2(60)B1Byte(相當於一個英文字母,您的名字相當6Bytes(6B)。Kilobyte(KB)=1024B相當於一則短篇故事的內容。Megabyte(MB)=l024KB相當於一則短篇小說的文字內容。Gigabyte(GB)=1024MB相當於貝多芬第五樂章交響曲的樂譜內容。Terabyte(TB)=1024GB相當於一家大型醫院中所有的X光圖片資訊量。Petabyte(PB)=l024TB相當於50%的全美學術研究圖書館藏書資訊內容。Exabyte (EB)=1024PB;5EB相當於至今全世界人類所講過的話語。Zettabyte(ZB)=1024EB如同全世界海灘上的沙子數量總和。Yottabyte(YB)=1024ZB相當於7000位人類體內的微細胞總和。