企业开发需要解决方案是什么?
- 企业级应用需要解决并发,交互,事务,集群,安全,分布式,web的一系列问题
什么是EJB
- 由EJB(企业级javabean)服务主要提供生命周期管理,代码产生,持续性管理,安全,事务管理,锁和并发行管理等服务
什么是J2EE
- J2EE是一天设计,开发,汇编和部署企业应用程序的规范
- J2EE提供了企业级应用程序的开发平台,提供了多层结构,分布式,基于组件,松耦合,安全可靠,独立于平台且反应速度的应用程序环境
J2EE包含的组件技术
- JSP:J2EE的web层核心技术
- servlet:J2EE的文本层核心技术
- JDBC:数据库访问技术
- XML:跨平台的可扩展标记语言
- EJB:J2EE的业务层核心技术
- JNDI:java命名和目录接口
- JMS:java消息服务
- JTA和JTS:java事务管理
- javaMail:邮件收发
- RMI:远程方法调用
- IDL:接口定义语言,将java 与CORBA集成的一种技术
重量级框架
- 启动,测试,运行都不能离开容器单独进行,依赖性强。
轻量级框架
- sun提出容器提供服务,轻量级框架提供同样的服务,用来支持POJO,通过代理方式实行服务的附加,用轻量级框架,持久层和业务层可以单独测试。
表现层————业务层————持久层————DB
表现层:
struts1
struts2
webwork
springMVC
持久层:
hibernate
mybatis
jdo
ejb实体bean
什么是O/R Mapping?
对象-关系映射是一门非常实用的工程技术,它实现了java应用中的对象到关心数据库中的表的自动(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射
O/R Mapping的优点
- 提高生产率
- 可维护性
- 更好性能
Hibernate特点
- Hibernate是一种开放源代码的对象/关系映射持久层框架
- 事务处理,声明周期管理不依赖于J2EE容器
- 解决数据库的方言问题
- Hibernate只需要操作对象就可以完成数据库的增,删,改,查操作。使用Hibernate更面向对象
- 轻量级,无侵入性,移植性好
ssh:
struts:撑杆
Hibernate:冬眠
spring:春天
Hibernate应用范围
-
不适用范围
批量对对象进行操作时
使用数据库特定映射
表间关系很复杂时,会照成性能问题
主键生成策略
- increment(自动增长,其主键由Hibernate控制,数据库中响应的字段没有设置自动增长,不能用于集群)
-
identity(自动增长,对DB2,Mysql,sql server数据库中相应的字段设置自动增长)
-
sequence(对oracle)数据库中响应的字段设置自动增长
-
Oracle序列添加主键生成策略
<id name="custld">
<generator class="sequence">
S_CUST_ID为序列名称
<param name="sequence">S_CUST_ID</param>
</generator>
</id>
- UUID:采用UUID算法生成字符串唯一标示,UUID生成策略相对来说速度较快,不需要使用数据库相关的我还表的操作,单查找相对较慢
- native:(根据数据库底层的描述,决定采用identity,sequence中 的一个)
- assigned:手动分配主键,当generator没有设置时,采用这种方式
- select:使用触发器分配主键
- foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用
对象状态
- transient(瞬时状态):当生成PO对象是产生,数据库中没有相应的记录,没有session对其进行管理
- persistent(持久状态):当session对象调用saveorupdate()时,数据库中有与之对应的记录,有session对象对之进行管理,当PO对象的值发生变化时,session对象让数据库记录与之同步
- detached(游离状态):当session事务提交时,时刻中有与之对应的记录,从session一级缓存中清除,session对其不再进行管理
Hibernate中使用get方法和load方法的区别
1、get为立即加载,调用get方法时,会马上执行sql将记过查询出来。 load为延迟加载,调用load方法时,不会马上查询结果,而是当查询出来的对象在使用时,才发出sql语句查询结果2、当查询的主键不存在时,get方法返回null,load方法会抛出“对象未找到异常”。
对延迟加载而言,一旦查询的对象不使用,不会真正查询数据库,这时,如果session关闭,再使用查询的对象,那么会抛出org.hibernate.LazyInitializationExcepion。
一对一有两种方式
- 主键关联:从表的主键,同时又是主表的外键,从表没有单独的外键列
- 外键关联:从表中存在外键列,关联主表的主键列,但外键列是不重复
级联操作:当当前对象执行某操作的情况下,其关联的对象也执行cascade设置的同样操作
cascade和inverse的区别
- cascade表示级联操作,当主表级联做操作时,从表记录做相应的操作,维护的是记录。
- inverse表示控制反转,当该属性设置为真时,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键。一般来说,inverse设置在一方,外键由从表维护
什么是缓存
- 缓存是数据库数据在内存中的临时容器
- 位于数据库与数据库访问层中间
- ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需要的数据,则直接将此数据所为结果加以利用
- 避免了数据库调用性能的开销
- 相对内存操作而言,时刻调用是一个代价高昂的过程
缓存分类
- 一级缓存:即在当前事务范围内的数据缓存,就Hibernate来讲,(一级缓存)事务级缓存是基于session的什么周期来实现的,session一旦关闭,一级缓存就清除,一级缓存为Hibernate自带的缓存是必须的
- 应用级(二级)缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可以又多个事务共享,在Hibernate中,应用级缓存由sessionfactory实现
- 分布式缓存:即在多个应用实例,多个jvm间共享的缓存策略
Hibernate延迟加载
- 在有关联的持久类对象中,对一个对象进行的查询也会向另一对象进行查询
- 所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作
- 延迟加载类型(实体对象的延迟加载(load()),集合的延迟加载(一对多和多对多时,关联集合),属性的延迟加载(clob大数据类型时))
clob:存放大文本的类型
blob:存放二进制数据类型
Hibernate悲观和乐观锁
多个用户可能同时读取或者更新一个数据
需要一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法被其他程序修改
(乐观锁 --Optimistic Locking 悲观锁 --Pessimistic Locking)
数据库隔离级别
- read uncommited 没有提交,就能读到,比如发送insert,在没有提交时就能更新数据库。存在脏读,一个事务读取一行,另一个事务已经将改进更新但是没有提交。
- read commited提交读,提交之后,才可以更新数据库-不存在脏读,存在不可重复读,如果一个用户读出是张三,另一个用户将该用户改名为李四。存在虚读,用户查询数据库时,两次查询的内容不一致未提交的写事务将会禁止其他事务访问该行。
- repeatable read可重复读。读取的事务将禁止写事务,写事务则禁止任何其他事务不存在不可重复读,但不能避免虚读。
- serializable可序列化读。事务只能一个接一个执行,不能并发执行
悲观锁
实现依赖以数据库机制,在整个过程中,将数据锁定,其它任何用户不能对其读取和修改,一般适合于短事务,并发性不好
乐观锁
悲观锁保证操作独占性,性能开销巨大
乐观锁依赖数据版本记录机制实现。1.为数据增加一个版本标识,增加一个version字段。2.读取数据时,将版本号一同读出。3.更新时,版本号加一。4.将提交数据的版本与数据库表对应记录的当前版本信息进行比对。5.如果提交的数据版本号大于数据库表当前版本号,则于以更新,否则认为是过期数据
数据库连接池
- 每一次请求都要建立一次数据库连接
- 每一次数据库连接,使用完后都得断开
- 不能控制被创建的连接对象数
- 频繁的数据库连接操作势必占用很多的系统资源,响应速度必定下降,程序出现异常而未能关闭,将会导致数据库系统的内存泄漏,最终将不得不重启数据库,系统资源毫无顾忌的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。
连接池工作原理
为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去,通过设定连接池最大连接数来防止系统无休止的数据库连接,更为重要的事可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发,测试及性能调整提供依据
连接池的工作流程
持久层向连接池申请一个连接,连接池返回一个空闲连接,如果没有空闲连接,那么就检查连接池中的连接数量是否到达最大连接数。如果没有到达最大连接数,则建立新的连接对象放入连接池中,如果到达最大连接数,那么用户需要等待,这时可以设置最大等待时间来控制用户的等待状态,等待时间内,有别的连接对象被释放,那么就分配给等待用户,如果超时,那么返回null
Hibernate常见的优化策略
- 用高版本的Hibernate
- 制定合理的缓存策略
- 采用合理的session管理机制
- 尽量使用延迟加载
- 如有可能,采用UUID作为主键生成策略
- 如有可能选用乐观锁代替悲观锁
- 在开发中,显示Hibernate执行的sql语句,从而指定更好的实现策略
- 复杂查询和统计查询可以使用sql语句完成,甚至可以考虑使用存储过程完成
Spring有什么好处
- spring能有效的组织你的中间层对象
- spring能消除在许多工程中常见的对singleton的过多使用
- spring能消除各种各样自定义格式的属性文件的需要,是配置信息一元化
- spring能够帮助我们真正意义上实现针对接口编程
- spring应用中的大多数业务对象没有依赖于spring
- 使用spring构建的应用程序易于单元测试
- spring支持jdbc和o/r mapping产品(Hibernate)
- MVC web 框架,提供一种清晰,无侵略的MVC实现方式
- spring能使用aop提供声明性事务管理,可以不直接操作jta也能够对事务进行管理
- 简化访问数据库时的例外处理
- jndi抽象层,编译改变实现细节,可以方便的在远程服务和本地服务间切换
- 提供了javaMail或其他邮件系统的支持
spring的Ioc/DI
控制反转模式的基本概念是:不创建对象,但是描述创建他们的方式,在代码中不直接与对象和服务连接,但在配置文件中描述那一组件余姚那一项服务,容器(在spring框架中ioc容器)负责将这些连接在一起。
IOC组件注入的方式
- 接口注入
- set方法注入
- 够造方法注入
Bean工厂
Applicationcontext扩展bean工厂接口,
applicationcontext提供附加功能,
bean工厂延迟加载所有的bean,直到getBean被调用,
applicationcontext则在初始化自身时检验,为立即加载,这样有利于检查所依赖属性是否注入,所有通常情况下我们选择使用applicationcontext,
spring容器中bean缺省状态下是单态模式
应用上下文applicationcontext
常用实现
- classpathxmlapplicationcontext Spring配置文件必需放在src目录下
- filesystemxmlapplicationcontext 配置文件放在工程下
-
xmlwebapplicationcontext 根据部署路径寻找webroot:
例如:applicationcontext context = new classpathxmlapplicationcontext(“app.xml”)
bean中id和name的区别
- id是唯一标识bean不能用特殊字符:x@,不能用数字开头,在bean引用的时候只能有id指向你需要的bean
- name可以用特殊字符,并且一个bean可以用多个名称:name=“bean1,bean2,bean3”,用逗号隔开,如果没有id,则name的第一个名称默认是id
AOP术语
- 切面(Aspect):就是你要实现的交叉的非核心业务功能
- 连接点(Joinpoint):应用程序执行过程中插入切面的地可以是方法调用,异常抛出
- 通知(Advice):通知切面的实际现代码
- 切入点(Pointcut):定义通知应用在哪些连接点
- 目标对象(Target):被通知的对象
- 代理(Proxy):将通知应用到目标对象后创建的对象
- 织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程
通知类型
- Around(环绕通知)
- Before(前置通知)
- After(后置通知)
- Throws(抛出异常通知)
ProxyFactoryBean产生代理对象
target:代理的目标对象
@after为后通知,表示目标方法执行后,无论是否有异常都会执行
@afterTeturning我返回后通知,表示目标方法正常执行后,会执行该方法,但如果目标方法有异常抛出,则不执行