我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
线程三个基本状态:就绪、执行、阻塞
线程五个基本操作:创建、就绪、运行、阻塞、终止
进程四种形式:主从式、会话式、消息或邮箱机制、共享存储区方式
进程是具有一定功能的程序关于某次数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。一个进程包含多个线程。
线程是进程的一个实体,是CPU调度和分配的基本单元。
四大域对象:PageContext、request、session、servletContext
九大内置对象:request、response、application、config、Exception、page、out、pageContext、session
Final关键词修饰一个变量是指引用变量不能变。引用变量所指对象的内容是可以变化的。
private:
继承成员但没有访问权限。(可以通过此类中的protected成员函数和public成员函数访问。)
protected:
继承成员,有访问权限,类外没有访问权限,不可将继承的protected修改为private.
public:
继承成员,有访问权限,类外有访问权限。
静态代码块在JVM加载类的时候先执行,父类先于子类执行。
Before 在每个测试方法之前都会运行一次,只需要声明public
BeforeClass 在类中只运行一次,必须声明成public static
public class Singleton {
private static Singleton sl;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (sl== null) {
sl= new Singleton();
}
return sl;
}
}
String-字符串 Hash-字典 list-列表 set-集合 sorted set-有序集合
HashMap基于Map接口实现,线程非同步所以不安全。键是唯一不可重复的,但是value值可以重复且允许空值存在。
HashTable是基于Dictionary类实现,线程默认同步所以是安全的,键值唯一且不为空,value值不能为空值。
HashSet是基于set实现的,以对象作为元素,且拒绝重复对象。内部使用HashMap实现,其实就是HashMap的一个视图。
ArrayList是基于动态数组的数据结构,查询较快
LinkedList是基于链表的数据结构,因为不需要移动数据,所以增删较快。
Wait方法属于Object类,使线程放弃进入执行,进入线程等待池,只能使用notify或notifyAll方法才能唤醒此线程,线程会等待进入线程池。即使在执行此方法时,线程已进入线程池,依然会放弃执行,让出线程池,交出锁。即使线程被激活,也需要等待前方线程执行完毕后才可进入线程池执行。
Sleep方法属于Thread类,使线程在指定时间内暂停执行,让cup暂时执行其他线程,但这个线程的监控状态依然保持,当执行时间到了以后,该线程恢复到之前状态,继续执行,线程不会释放锁。
==是一个运算符,是逻辑上的判断,比较的是引用地址。
Equals是String的一个方法,是比较引用地址,在Object类时,Equals和==是一样的,对于其他类来说如果重新了Equals方法,则比较的两个对象的数据内容。
HashCode和Equals都是在Object类中定义的,是对两个对象地址的比较,如果重写了Equals方法就必须重写HashCode方法。
HashCode方法返回的是对象的散列码,返回值是int类型的散列码;Equals返回的是true和false。
如果两个对象相同,他们的HashCode值必须相同;如果两个对象的HashCode值相同,他们不一样相同。
方法重载:在同一个类中,方法名称相同,参数类型和个数不同,返回值也可以不同。
方法重写:父子类、接口和实现类之间的关系,子类可以重写父类方法,但是参数个数、类型、返回值必须相同。
Before是初始化方法,在每个程序运行之前都会执行一次。
Beforeclass在类中只运行一次。
Situation: 事情是在什么情况下发生
Task: 你是如何明确你的任务的
Action: 针对这样的情况分析,你采用了什么行动方式
Result: 结果怎样,在这样的情况下你学习到了什么
cookie数据存储在客户的浏览器上,cookie是不安全的,别人可以分析存放在本地cookie并进行cookie欺骗;
Session存储在服务器上,Session是安全的;当访问增多时,Session会占用服务器性能,可以考虑使用cookie
建议将登陆信息等重要信息保存在Session中,其他需要保留的信息可以存在cookie中。
ID选择器、类选择器、层次选择器、组合选择器、属性选择器、表单选择器等等
特性:原子性、一致性、隔离性、持久性。
隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
可分批处理 先行保存部分内容至数据库,再清空list集合,重新导入内容
在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。
GC.run
消除线性队列的“假溢出”,充分利用存储空间。
WebService是一个平台独立的、低耦合的,自包含的、基于可编程的web应用程序,可使用开放的xml标准来描述、发现、发布、协调和配置这些应用程序,是用户开发互操作的分布式系统。最基本的目的就是提供在各个不同平台的不同应用系统的系统工作能力。
1:Tomcat的Session复制。在一台Tomcat的Session发生变化时,将变更的数据分发给其它的Tomcat服务器。
2: 采用 memcached session manager 共享session。
1:git是分布式的版本控制系统,SVN不是。GIT和SVN都有自己的集中式版本库或服务器,但是GIT更倾向分布式使用。
2:GIT把内容按数据方式存储,而SVN是按文件存储的。
3:GIT可以很容易的发现未被合并的分支,SVN需要手动运行命令来确定代码是否被合并。
4:GIT没有一个全局的版本号,SVN有。但GIT内容完整性要优于SVN。
5:GIT在下载后即使在不联网状态也可以看到所有数据,但SVN必须要联网。
6:GIT的提交速度优于SVN,且GIT可以有无限个版本库,但SVN只有一个中央数据库,一旦这个中央库有问题,则所有代码都会全部瘫痪。
7:管理一个GIT库相对于管理一个SVN库更容易。
服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心(默认端口2181)注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
使用redis做缓存的原因:
redis是用C语言编写的,稳定性和性能更好。支持集群模式和持久化等特性,不会应为缓存量太多而导致虚拟机崩溃。Redis是独立部署的,即使网站更新,redis缓存的数据也不会消失。
集群搭建(redis需要3台主机,3台从机,则配置6台,需要6个端口):
1:安装ruby环境,上传接口工程,安装接口程序,拷贝脚本到指定位置
2:创建6个redis实例,修改配置文件 ,然后启动所有redis实例(为简化启动步骤,可编写启动脚本)。
3:执行创建集群的命令,连接测试
Redis的事务是一组命令的集合,Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。
程序bug或人为误操作
· 因客户端缓冲区内存使用过大,导致大量键被LRU淘汰
· 主库故障后自动重启,可能导致数据丢失
· 网络分区的问题,可能导致短时间的写入数据丢失
· 主从复制数据不一致,发生故障切换后,出现数据丢失
· 大量过期键,同时被淘汰清理
作用:acitveMQ就是消息队列,activemq安装之后,会有一个broker(经纪人)。
消息的生产者将消息发送到broker中,它不关心谁消费该消息。
消息的消费者去broker中获取信息,它不关心谁提供消息
$.ajax({
async:false // 为false 时 为同步, 默认 为true , 为异步
})
fastDFS有两个角色:跟踪器(tracker)和存储节点(storage);
存储数据:
跟踪器负责记录图片地址,和响应java接口访问。java接口要想储存图片地址需向跟踪器发送请求,然后由跟踪器查找图片仓库地址发给java接口,同时记录储存过程,
Java接口配IP是配2个的,因为有2个跟踪器,而java接口连接IP时并不是智能的,如果连接第一个跟踪器没反应(第一个没反应不是忙就是挂了),它就会连接第二个跟踪器,不管连哪个跟踪器,最终都会返回一个地址给java接口。而两个跟踪器之间是有通信的,它们会把信息同步的,这个信息也就是meta信息,也就是管理的帐本。
跟踪器和存储节点有通信间隔时间,这个时间由我们决定。而存储节点之间也是有通信的,如果有一天存储节点和存储节点的仓库都满了,就扩张仓库,创建下一组存储节点和存储仓库。
取数据:
取数据的时候可以用java接口取,也可以用页面里的”取,但是src属性会在页面加载后发出2次请求。Src会根据地址去找跟踪器,而跟踪器会告诉它这地址图片在哪个存储节点身上,跟踪器这台机器上搭建是nginx服务器(反向代理服务器)这个服务器是用来解决高并发用的。Nginx服务器会根据你的路径找到存储节点身上的图片。然后再将存储节点的图片拿回来,再加载给src,到img标签里。
启动:
先设置IP再修改IP,然后三个命令分别启动跟踪器,存储节点,Nginx服务器
热部署:就是maven管理的项目发布到测试服务器,省去以往发布时要不停的启动、关闭tomcat这些繁琐 的过程;热:就是tomcat一直保持开启状态,
1、设置tomcat用户名和密码,然后启动tomcat
2、在你所要发布的项目里的pom.xml里设置你要发布项目的路径同时把tomcat用户名和密码也设置上
3、发送发布命tomcat7:deploy
4、强硬发布命令:tomcat7:redeploy
DEBUG Level: 指出细粒度信息事件对调试应用程序是非常有帮助的,就是输出debug的信息.
INFO level: 表明消息在粗粒度级别上突出强调应用程序的运行过程,就是输出提示信息.
WARN level: 表明会出现潜在错误的情形,就是显示警告信息.
ERROR level: 指出虽然发生错误事件,但仍然不影响系统的继续运行.就是显示错误信息.
FATAL level: 指出每个严重的错误事件将会导致应用程序的退出.
ALL level: 是最低等级的,用于打开所有日志记录.
OFF level: 是最高等级的,用于关闭所有日志记录.
本身不是为高可用性设计,撑不住高流量容易导致系统崩溃。还有对网络隔离的敏感也导致Zookeeper的脆弱
1) 继承thread类 重新run函数 对象。start开启
2) 实现runnnable接口 重写run函数
3) 实现callable
1)接口是公开的,不能有私有方法和变量,但是抽象类可以
2)实现一个接口必须实现接口的方法,抽象类可以重写也可以不重写
3)接口可以实现多重继承,抽象类只能实现多个接口
重写是指子类继承父类,重写父类的方法。重载是多态的一种表现形式,是指在同一类中方法名相同参数列表不同的同命名方法。
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
1:通过@PathVariable获取路径中传递的参数 在方法参数前
2:通过@ModelAttribute获取post请求中的form表单数据 在方法参数前
3:通过HttpServletRequest获取
3:用@RequestParam
Web.xml:初始化spring容器 加载配置文件 contextConfigLocation
配置前端控制器 加载SpringMVC.Xml 设定startup为1,启动时加载 过滤所有请求
统一编码方式 CharacterEncodingFilter 过滤所有请求
Spring.xml:配置包扫描器 context:component-scan
配置注解驱动 mvc:annotation-driven
配置视图解析器 InternalResourceViewResolver
加载静态资源 mvc:resources
配置多部件解析器 CommonsMultipartResolver 设定默认编码和文件上传的最大值
加载Java的其余配置文件 context:property-placeholder
SSH通常指Struts2做控制器,Spring管理各种组件,Hibernate负责持久化层。
SSM通常指SpringMVC做控制器,Spring管理各层组件,Mybatis负责持久化层。
相同点:1:Spring依赖注入来管理各层组件
2:使用面向切面的AOP编程思想管理事务、日志、权限等。
不同点:Struts2和SpringMVC控制器控制视图和交互机制不同。
1:SpringMVC开发效率高于Struts2,且SpringMVC以基本实现0配置。
2:SpringMVC实现依赖Servlet,是单例的,参数基于方法进行封装。
3:SpringMVC是方法级别的拦截,一个方法对应一个request上下文,方法对应URL。方法之间的变量是不共享的,方法是独立的,可以使用注解方式接收参数。
4:Struts2是类级别的拦截,一个类对应一个request的上下文,配置文件较复杂,架构比较费时费力。虽然每个方法之间也是独立的,但所有类变量都是共享的,虽然不影响运行,但是编码、读程序却比较麻烦。
5:Struts2实现依赖过滤器,是多例的,参数是基于属性进行封装。
6:Struts2需要封装每一个Request,把每个生命周期变量封装成一个个的MAP集合,并要保证线程的安全,比较耗费内存。
相同点:Hibernate和Mybatis都是通过SessionFactoryBuider由xml文件生成SessionFactory,然后生成Session,由Session开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。都支持JDBC和JTA事务处理。
不同点:
Mybatis:Mybatis可以进行更为细致的SQL优化,可以减少查询字段。
Mybatis相对于Hibernate更容易掌握,门栏较低。
Hibernate:Hibernate的DAO层开发比Mybatis更简单,因为Mybatis需要维 护SQL和映射结果。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
Hibernate的一级缓存指的是Session缓存,因为Session缓存是内置的,是Hibernate的默认配置;二级缓存指的是SessionFactory的外置缓存,因为外置缓存是数据库数据的拷贝,介质可以是内存或硬盘,需要手动开启。
Spring的事务管理分为声明式和编程式。声明式事务可以使用tx标签方式、使用代理方式以及拦截器方式。编程式事务需要在配置中配置Session工厂,配置事务管理器,开启注解扫描,使用@Service
@Controller @requestMapping @PathVariable @RequestParam@RequestBody @ResponseBody @RestController @ModelAttribute
1:数据库设计时要降低关联的复杂性,尽量不使用联合主键,适用冗余数据,不过分追求高范式
2:使用延迟加载
Configuration,sessionfactory,Session,query接口,transaction接口
优点:
方便解耦,简化开发---Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
AOP编程的支持---Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
声明式事务的支持---只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试---Spring对Junit4支持,可以通过注解方便的测试Spring程序
方便集成各种优秀框架---Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
降低JavaEE API的使用难度---Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
缺点:
jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器
工作机制:Spring的核心就是IOC和AOP所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制。
原因:借助于Spring AOP,Spring IOC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置
Springmvc是spring一部分
IOC:控制反转,生产对象用。控制权由应用代码中转到了外部容器,控制权的转移,是所谓的反转。
AOP:面向切面编程,底层使用动态代理,作用:管理事务和安全监控,事务 只需要配置一次就不用再配置。
Mvc是一个架构设计思想:
用户发送请求至控制器(Controller),控制层把用户请求转发给模型Model层进行数据处理,Model层内包含javabean组件、领域模型、业务层、持久层,Model层处理完数据层响应给控制层,控制层再次把数据发送给视图View进行视图编译,然后由View层把视图页面返回给控制层,控制层再响应给用户。
返回给前端控制器
POJO是mybatis中的返回值的参数类型,它和bean一样意思。Bean是指类,而POJO把类看成对象。Mybatis是在JDBC上做的封装,为了使SQL语句不再是硬编码和不用再按顺序执行,为了在框架里获取sql语句而设定的一种概念,得到的是动态SQL。
实现过程:
在商品添加服务中发送商品ID消息,接收消息中的商品ID。
从spring上下文中获取Freemarker的配置文件(configuration)对象。
通过configuration创建模板(template对象),模板的名称在java配置文件中配置。
创建模板数据:根据商品ID查询出商品信息,如果没有数据,抛出异常。
指定输出文本。文本的路径在java配置文件中配置,文本的名称是商品ID,文本的后缀在java配置文件中配置。
调用template的process方法,生成输出文件。
可以发送异步请求,使用Nginx访问
临时状态(transient):刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象称为临时对象。
持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象称为持久化对象。
游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。
Java对象:开始生命周期——》临时状态——》持久化状态——》游离状态——》结束生命周期
1,实例化阶段 调用init()方法
2,服务阶段 调用service()方法
3,销毁阶段 调用destroy()方法
首先客户发送一个请求,Servlet是调用service()方法对请求进行响应,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doPost,doGet等这些方法。
对象关系映射,也就是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
JVM执行程序的过程 :
I.加载.class文件
II.管理并分配内存
III.执行垃圾收集
JDBC(java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6、返回HTTP响应到客户端浏览器
原理:
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
1:表的设计要符合三范式。
2:添加适当存储过程,触发器,事务等。
3:添加适当的索引,索引对查询速度影响很大,必须添加索引。主键索引,唯一索引,普通索引,全文索引
4:读写分离(主从数据库,主数据库进行写的操作,从数据库惊醒读的操作,主数据库将数据更新到从数据库)
5:对sql语句的一些优化,(查询执行速度比较慢的sql语句)
a:查询中避免使用通配符,尽量使用索引。选择联合查询的联合次序
b:在子查询中避免使用in 或 not in 语句,使用where (NOT) exists的效果要好的多;避免使用BY RAND随机显示结果。
c:使用联合(UNION)代替手动创建的临时表,拆分表格。
d:尽可能的使用NOT NULL(非空),对MySQL的配置进行优化
6:分表分区
分表:把一张大表分成多张表。分区:把一张表里面的分配到不同的区域存储,
对mysql服务器硬件的升级操作。
alter table ~ add ~ 添加列
mysql的最大连接数默认是100, 最大可以达到16384
limit关键字:LIMIT 可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
优点:通过创建唯一性索引,可以保证数据库中每一行数据的唯一性,2,可以大大加快数据的检索速度,这也是创建索引的最主要的原因,3.可以加速表与表之间的连接,特别是在实现数据的参考完整性。
缺点:创建索引和维护索引需要消耗时间,这种时间随着数据的增加而增加,2.索引占用物理空间,需要的空间变大,3.当对数据库中的数据进行增删改的时候,索引也需要动态的维护,此时降低了维护速度。
集合去重:
a:转化为Set集合,因为HashSet集合不允许重复值存在。
b:使用双重循环删除重复的值或者用null代替
c:用contains方法
数据库去重:
a:使用嵌套的查询 得到所有的不重复数据的Id,使用 not in 关键字删除所有ID不在以上范围中的数据。
b:使用嵌套的查询 得到所有的不重复数据的Id,将所有数据存储到一个临时表中,删除原表,重新构建原表,将临时表数据导入原表,删除临时表
普通索引:添加index
Alter table user add index_name(name),括号内为字段名称
主键索引
Alert table user add primary key(id)
唯一索引:添加unique
Alert table user add unique (creattime)
全文索引:添加fulltext
Alert table user add fulltext(name)
Mysql存储过程就是为完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时,用户只需要通过指定存储过程的名字并给定参数就可以调用。
存储过程是一个可编程的函数,在数据库中创建并保存。可以有SQL语句和一些特殊的控制结构组成。可以看做是对编程中面向对象的模拟。
1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源免费的而Oracle价格非常高。
2. Oracle支持大并发,大访问量,是OLTP最好的工具。
3. 安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
4.Oracle也Mysql操作上的一些区别
①主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
②单引号的处理 MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
③翻页的SQL语句的处理 MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80
④ 长字符串的处理 长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 ⑤空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
⑥字符串的模糊比较 MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快。
⑦Oracle实现了ANSII SQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较的若
线程三个基本状态:就绪、执行、阻塞
线程五个基本操作:创建、就绪、运行、阻塞、终止
进程四种形式:主从式、会话式、消息或邮箱机制、共享存储区方式
进程是具有一定功能的程序关于某次数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。一个进程包含多个线程。
线程是进程的一个实体,是CPU调度和分配的基本单元。
四大域对象:PageContext、request、session、servletContext
九大内置对象:request、response、application、config、Exception、page、out、pageContext、session
Final关键词修饰一个变量是指引用变量不能变。引用变量所指对象的内容是可以变化的。
private:
继承成员但没有访问权限。(可以通过此类中的protected成员函数和public成员函数访问。)
protected:
继承成员,有访问权限,类外没有访问权限,不可将继承的protected修改为private.
public:
继承成员,有访问权限,类外有访问权限。
静态代码块在JVM加载类的时候先执行,父类先于子类执行。
Before 在每个测试方法之前都会运行一次,只需要声明public
BeforeClass 在类中只运行一次,必须声明成public static
public class Singleton {
private static Singleton sl;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (sl== null) {
sl= new Singleton();
}
return sl;
}
}
String-字符串 Hash-字典 list-列表 set-集合 sorted set-有序集合
HashMap基于Map接口实现,线程非同步所以不安全。键是唯一不可重复的,但是value值可以重复且允许空值存在。
HashTable是基于Dictionary类实现,线程默认同步所以是安全的,键值唯一且不为空,value值不能为空值。
HashSet是基于set实现的,以对象作为元素,且拒绝重复对象。内部使用HashMap实现,其实就是HashMap的一个视图。
ArrayList是基于动态数组的数据结构,查询较快
LinkedList是基于链表的数据结构,因为不需要移动数据,所以增删较快。
Wait方法属于Object类,使线程放弃进入执行,进入线程等待池,只能使用notify或notifyAll方法才能唤醒此线程,线程会等待进入线程池。即使在执行此方法时,线程已进入线程池,依然会放弃执行,让出线程池,交出锁。即使线程被激活,也需要等待前方线程执行完毕后才可进入线程池执行。
Sleep方法属于Thread类,使线程在指定时间内暂停执行,让cup暂时执行其他线程,但这个线程的监控状态依然保持,当执行时间到了以后,该线程恢复到之前状态,继续执行,线程不会释放锁。
==是一个运算符,是逻辑上的判断,比较的是引用地址。
Equals是String的一个方法,是比较引用地址,在Object类时,Equals和==是一样的,对于其他类来说如果重新了Equals方法,则比较的两个对象的数据内容。
HashCode和Equals都是在Object类中定义的,是对两个对象地址的比较,如果重写了Equals方法就必须重写HashCode方法。
HashCode方法返回的是对象的散列码,返回值是int类型的散列码;Equals返回的是true和false。
如果两个对象相同,他们的HashCode值必须相同;如果两个对象的HashCode值相同,他们不一样相同。
方法重载:在同一个类中,方法名称相同,参数类型和个数不同,返回值也可以不同。
方法重写:父子类、接口和实现类之间的关系,子类可以重写父类方法,但是参数个数、类型、返回值必须相同。
Before是初始化方法,在每个程序运行之前都会执行一次。
Beforeclass在类中只运行一次。
Situation: 事情是在什么情况下发生
Task: 你是如何明确你的任务的
Action: 针对这样的情况分析,你采用了什么行动方式
Result: 结果怎样,在这样的情况下你学习到了什么
cookie数据存储在客户的浏览器上,cookie是不安全的,别人可以分析存放在本地cookie并进行cookie欺骗;
Session存储在服务器上,Session是安全的;当访问增多时,Session会占用服务器性能,可以考虑使用cookie
建议将登陆信息等重要信息保存在Session中,其他需要保留的信息可以存在cookie中。
ID选择器、类选择器、层次选择器、组合选择器、属性选择器、表单选择器等等
特性:原子性、一致性、隔离性、持久性。
隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
可分批处理 先行保存部分内容至数据库,再清空list集合,重新导入内容
在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。
GC.run
消除线性队列的“假溢出”,充分利用存储空间。
WebService是一个平台独立的、低耦合的,自包含的、基于可编程的web应用程序,可使用开放的xml标准来描述、发现、发布、协调和配置这些应用程序,是用户开发互操作的分布式系统。最基本的目的就是提供在各个不同平台的不同应用系统的系统工作能力。
1:Tomcat的Session复制。在一台Tomcat的Session发生变化时,将变更的数据分发给其它的Tomcat服务器。
2: 采用 memcached session manager 共享session。
1:git是分布式的版本控制系统,SVN不是。GIT和SVN都有自己的集中式版本库或服务器,但是GIT更倾向分布式使用。
2:GIT把内容按数据方式存储,而SVN是按文件存储的。
3:GIT可以很容易的发现未被合并的分支,SVN需要手动运行命令来确定代码是否被合并。
4:GIT没有一个全局的版本号,SVN有。但GIT内容完整性要优于SVN。
5:GIT在下载后即使在不联网状态也可以看到所有数据,但SVN必须要联网。
6:GIT的提交速度优于SVN,且GIT可以有无限个版本库,但SVN只有一个中央数据库,一旦这个中央库有问题,则所有代码都会全部瘫痪。
7:管理一个GIT库相对于管理一个SVN库更容易。
服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心(默认端口2181)注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
使用redis做缓存的原因:
redis是用C语言编写的,稳定性和性能更好。支持集群模式和持久化等特性,不会应为缓存量太多而导致虚拟机崩溃。Redis是独立部署的,即使网站更新,redis缓存的数据也不会消失。
集群搭建(redis需要3台主机,3台从机,则配置6台,需要6个端口):
1:安装ruby环境,上传接口工程,安装接口程序,拷贝脚本到指定位置
2:创建6个redis实例,修改配置文件 ,然后启动所有redis实例(为简化启动步骤,可编写启动脚本)。
3:执行创建集群的命令,连接测试
Redis的事务是一组命令的集合,Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。
程序bug或人为误操作
· 因客户端缓冲区内存使用过大,导致大量键被LRU淘汰
· 主库故障后自动重启,可能导致数据丢失
· 网络分区的问题,可能导致短时间的写入数据丢失
· 主从复制数据不一致,发生故障切换后,出现数据丢失
· 大量过期键,同时被淘汰清理
作用:acitveMQ就是消息队列,activemq安装之后,会有一个broker(经纪人)。
消息的生产者将消息发送到broker中,它不关心谁消费该消息。
消息的消费者去broker中获取信息,它不关心谁提供消息
$.ajax({
async:false // 为false 时 为同步, 默认 为true , 为异步
})
fastDFS有两个角色:跟踪器(tracker)和存储节点(storage);
存储数据:
跟踪器负责记录图片地址,和响应java接口访问。java接口要想储存图片地址需向跟踪器发送请求,然后由跟踪器查找图片仓库地址发给java接口,同时记录储存过程,
Java接口配IP是配2个的,因为有2个跟踪器,而java接口连接IP时并不是智能的,如果连接第一个跟踪器没反应(第一个没反应不是忙就是挂了),它就会连接第二个跟踪器,不管连哪个跟踪器,最终都会返回一个地址给java接口。而两个跟踪器之间是有通信的,它们会把信息同步的,这个信息也就是meta信息,也就是管理的帐本。
跟踪器和存储节点有通信间隔时间,这个时间由我们决定。而存储节点之间也是有通信的,如果有一天存储节点和存储节点的仓库都满了,就扩张仓库,创建下一组存储节点和存储仓库。
取数据:
取数据的时候可以用java接口取,也可以用页面里的”取,但是src属性会在页面加载后发出2次请求。Src会根据地址去找跟踪器,而跟踪器会告诉它这地址图片在哪个存储节点身上,跟踪器这台机器上搭建是nginx服务器(反向代理服务器)这个服务器是用来解决高并发用的。Nginx服务器会根据你的路径找到存储节点身上的图片。然后再将存储节点的图片拿回来,再加载给src,到img标签里。
启动:
先设置IP再修改IP,然后三个命令分别启动跟踪器,存储节点,Nginx服务器
热部署:就是maven管理的项目发布到测试服务器,省去以往发布时要不停的启动、关闭tomcat这些繁琐 的过程;热:就是tomcat一直保持开启状态,
1、设置tomcat用户名和密码,然后启动tomcat
2、在你所要发布的项目里的pom.xml里设置你要发布项目的路径同时把tomcat用户名和密码也设置上
3、发送发布命tomcat7:deploy
4、强硬发布命令:tomcat7:redeploy
DEBUG Level: 指出细粒度信息事件对调试应用程序是非常有帮助的,就是输出debug的信息.
INFO level: 表明消息在粗粒度级别上突出强调应用程序的运行过程,就是输出提示信息.
WARN level: 表明会出现潜在错误的情形,就是显示警告信息.
ERROR level: 指出虽然发生错误事件,但仍然不影响系统的继续运行.就是显示错误信息.
FATAL level: 指出每个严重的错误事件将会导致应用程序的退出.
ALL level: 是最低等级的,用于打开所有日志记录.
OFF level: 是最高等级的,用于关闭所有日志记录.
本身不是为高可用性设计,撑不住高流量容易导致系统崩溃。还有对网络隔离的敏感也导致Zookeeper的脆弱
1) 继承thread类 重新run函数 对象。start开启
2) 实现runnnable接口 重写run函数
3) 实现callable
1)接口是公开的,不能有私有方法和变量,但是抽象类可以
2)实现一个接口必须实现接口的方法,抽象类可以重写也可以不重写
3)接口可以实现多重继承,抽象类只能实现多个接口
重写是指子类继承父类,重写父类的方法。重载是多态的一种表现形式,是指在同一类中方法名相同参数列表不同的同命名方法。
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
1:通过@PathVariable获取路径中传递的参数 在方法参数前
2:通过@ModelAttribute获取post请求中的form表单数据 在方法参数前
3:通过HttpServletRequest获取
3:用@RequestParam
Web.xml:初始化spring容器 加载配置文件 contextConfigLocation
配置前端控制器 加载SpringMVC.Xml 设定startup为1,启动时加载 过滤所有请求
统一编码方式 CharacterEncodingFilter 过滤所有请求
Spring.xml:配置包扫描器 context:component-scan
配置注解驱动 mvc:annotation-driven
配置视图解析器 InternalResourceViewResolver
加载静态资源 mvc:resources
配置多部件解析器 CommonsMultipartResolver 设定默认编码和文件上传的最大值
加载Java的其余配置文件 context:property-placeholder
SSH通常指Struts2做控制器,Spring管理各种组件,Hibernate负责持久化层。
SSM通常指SpringMVC做控制器,Spring管理各层组件,Mybatis负责持久化层。
相同点:1:Spring依赖注入来管理各层组件
2:使用面向切面的AOP编程思想管理事务、日志、权限等。
不同点:Struts2和SpringMVC控制器控制视图和交互机制不同。
1:SpringMVC开发效率高于Struts2,且SpringMVC以基本实现0配置。
2:SpringMVC实现依赖Servlet,是单例的,参数基于方法进行封装。
3:SpringMVC是方法级别的拦截,一个方法对应一个request上下文,方法对应URL。方法之间的变量是不共享的,方法是独立的,可以使用注解方式接收参数。
4:Struts2是类级别的拦截,一个类对应一个request的上下文,配置文件较复杂,架构比较费时费力。虽然每个方法之间也是独立的,但所有类变量都是共享的,虽然不影响运行,但是编码、读程序却比较麻烦。
5:Struts2实现依赖过滤器,是多例的,参数是基于属性进行封装。
6:Struts2需要封装每一个Request,把每个生命周期变量封装成一个个的MAP集合,并要保证线程的安全,比较耗费内存。
相同点:Hibernate和Mybatis都是通过SessionFactoryBuider由xml文件生成SessionFactory,然后生成Session,由Session开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。都支持JDBC和JTA事务处理。
不同点:
Mybatis:Mybatis可以进行更为细致的SQL优化,可以减少查询字段。
Mybatis相对于Hibernate更容易掌握,门栏较低。
Hibernate:Hibernate的DAO层开发比Mybatis更简单,因为Mybatis需要维 护SQL和映射结果。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
Hibernate的一级缓存指的是Session缓存,因为Session缓存是内置的,是Hibernate的默认配置;二级缓存指的是SessionFactory的外置缓存,因为外置缓存是数据库数据的拷贝,介质可以是内存或硬盘,需要手动开启。
Spring的事务管理分为声明式和编程式。声明式事务可以使用tx标签方式、使用代理方式以及拦截器方式。编程式事务需要在配置中配置Session工厂,配置事务管理器,开启注解扫描,使用@Service
@Controller @requestMapping @PathVariable @RequestParam@RequestBody @ResponseBody @RestController @ModelAttribute
1:数据库设计时要降低关联的复杂性,尽量不使用联合主键,适用冗余数据,不过分追求高范式
2:使用延迟加载
Configuration,sessionfactory,Session,query接口,transaction接口
优点:
方便解耦,简化开发---Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
AOP编程的支持---Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
声明式事务的支持---只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试---Spring对Junit4支持,可以通过注解方便的测试Spring程序
方便集成各种优秀框架---Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
降低JavaEE API的使用难度---Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
缺点:
jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器
工作机制:Spring的核心就是IOC和AOP所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制。
原因:借助于Spring AOP,Spring IOC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置
Springmvc是spring一部分
IOC:控制反转,生产对象用。控制权由应用代码中转到了外部容器,控制权的转移,是所谓的反转。
AOP:面向切面编程,底层使用动态代理,作用:管理事务和安全监控,事务 只需要配置一次就不用再配置。
Mvc是一个架构设计思想:
用户发送请求至控制器(Controller),控制层把用户请求转发给模型Model层进行数据处理,Model层内包含javabean组件、领域模型、业务层、持久层,Model层处理完数据层响应给控制层,控制层再次把数据发送给视图View进行视图编译,然后由View层把视图页面返回给控制层,控制层再响应给用户。
返回给前端控制器
POJO是mybatis中的返回值的参数类型,它和bean一样意思。Bean是指类,而POJO把类看成对象。Mybatis是在JDBC上做的封装,为了使SQL语句不再是硬编码和不用再按顺序执行,为了在框架里获取sql语句而设定的一种概念,得到的是动态SQL。
实现过程:
在商品添加服务中发送商品ID消息,接收消息中的商品ID。
从spring上下文中获取Freemarker的配置文件(configuration)对象。
通过configuration创建模板(template对象),模板的名称在java配置文件中配置。
创建模板数据:根据商品ID查询出商品信息,如果没有数据,抛出异常。
指定输出文本。文本的路径在java配置文件中配置,文本的名称是商品ID,文本的后缀在java配置文件中配置。
调用template的process方法,生成输出文件。
可以发送异步请求,使用Nginx访问
临时状态(transient):刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象称为临时对象。
持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象称为持久化对象。
游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。
Java对象:开始生命周期——》临时状态——》持久化状态——》游离状态——》结束生命周期
1,实例化阶段 调用init()方法
2,服务阶段 调用service()方法
3,销毁阶段 调用destroy()方法
首先客户发送一个请求,Servlet是调用service()方法对请求进行响应,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doPost,doGet等这些方法。
对象关系映射,也就是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
JVM执行程序的过程 :
I.加载.class文件
II.管理并分配内存
III.执行垃圾收集
JDBC(java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6、返回HTTP响应到客户端浏览器
原理:
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
1:表的设计要符合三范式。
2:添加适当存储过程,触发器,事务等。
3:添加适当的索引,索引对查询速度影响很大,必须添加索引。主键索引,唯一索引,普通索引,全文索引
4:读写分离(主从数据库,主数据库进行写的操作,从数据库惊醒读的操作,主数据库将数据更新到从数据库)
5:对sql语句的一些优化,(查询执行速度比较慢的sql语句)
a:查询中避免使用通配符,尽量使用索引。选择联合查询的联合次序
b:在子查询中避免使用in 或 not in 语句,使用where (NOT) exists的效果要好的多;避免使用BY RAND随机显示结果。
c:使用联合(UNION)代替手动创建的临时表,拆分表格。
d:尽可能的使用NOT NULL(非空),对MySQL的配置进行优化
6:分表分区
分表:把一张大表分成多张表。分区:把一张表里面的分配到不同的区域存储,
对mysql服务器硬件的升级操作。
alter table ~ add ~ 添加列
mysql的最大连接数默认是100, 最大可以达到16384
limit关键字:LIMIT 可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
优点:通过创建唯一性索引,可以保证数据库中每一行数据的唯一性,2,可以大大加快数据的检索速度,这也是创建索引的最主要的原因,3.可以加速表与表之间的连接,特别是在实现数据的参考完整性。
缺点:创建索引和维护索引需要消耗时间,这种时间随着数据的增加而增加,2.索引占用物理空间,需要的空间变大,3.当对数据库中的数据进行增删改的时候,索引也需要动态的维护,此时降低了维护速度。
集合去重:
a:转化为Set集合,因为HashSet集合不允许重复值存在。
b:使用双重循环删除重复的值或者用null代替
c:用contains方法
数据库去重:
a:使用嵌套的查询 得到所有的不重复数据的Id,使用 not in 关键字删除所有ID不在以上范围中的数据。
b:使用嵌套的查询 得到所有的不重复数据的Id,将所有数据存储到一个临时表中,删除原表,重新构建原表,将临时表数据导入原表,删除临时表
普通索引:添加index
Alter table user add index_name(name),括号内为字段名称
主键索引
Alert table user add primary key(id)
唯一索引:添加unique
Alert table user add unique (creattime)
全文索引:添加fulltext
Alert table user add fulltext(name)
Mysql存储过程就是为完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时,用户只需要通过指定存储过程的名字并给定参数就可以调用。
存储过程是一个可编程的函数,在数据库中创建并保存。可以有SQL语句和一些特殊的控制结构组成。可以看做是对编程中面向对象的模拟。
1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源免费的而Oracle价格非常高。
2. Oracle支持大并发,大访问量,是OLTP最好的工具。
3. 安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
4.Oracle也Mysql操作上的一些区别
①主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
②单引号的处理 MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
③翻页的SQL语句的处理 MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80
④ 长字符串的处理 长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 ⑤空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
⑥字符串的模糊比较 MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快。
⑦Oracle实现了ANSII SQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较的若
转载:https://www.cnblogs.com/779084229yyt/p/8405352.html
推荐内容:
【JAVA面试】java面试题整理(4)
Java的深拷贝和浅拷贝
Java面试通关要点汇总集
java 面试题总结01
Java枚举类型的用法
Java面试总结
《阿里巴巴 Java 开发手册》读书笔记
Java面试集合(一)
2019最新初级JAVA面试问题
Java面试知识点总结