J2EE基础

企业开发需要解决方案是什么?

  • 企业级应用需要解决并发,交互,事务,集群,安全,分布式,web的一系列问题

什么是EJB

  • 由EJB(企业级javabean)服务主要提供生命周期管理,代码产生,持续性管理,安全,事务管理,锁和并发行管理等服务

什么是J2EE

  • J2EE是一天设计,开发,汇编和部署企业应用程序的规范
  • J2EE提供了企业级应用程序的开发平台,提供了多层结构,分布式,基于组件,松耦合,安全可靠,独立于平台且反应速度的应用程序环境

J2EE包含的组件技术

  1. JSP:J2EE的web层核心技术
  2. servlet:J2EE的文本层核心技术
  3. JDBC:数据库访问技术
  4. XML:跨平台的可扩展标记语言
  5. EJB:J2EE的业务层核心技术
  6. JNDI:java命名和目录接口
  7. JMS:java消息服务
  8. JTA和JTS:java事务管理
  9. javaMail:邮件收发
  10. RMI:远程方法调用
  11. 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应用范围

  1. 不适用范围

    批量对对象进行操作时

    使用数据库特定映射

    表间关系很复杂时,会照成性能问题

主键生成策略

  • 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。

一对一有两种方式

  1. 主键关联:从表的主键,同时又是主表的外键,从表没有单独的外键列
  2. 外键关联:从表中存在外键列,关联主表的主键列,但外键列是不重复
级联操作:当当前对象执行某操作的情况下,其关联的对象也执行cascade设置的同样操作

cascade和inverse的区别

  • cascade表示级联操作,当主表级联做操作时,从表记录做相应的操作,维护的是记录。
  • inverse表示控制反转,当该属性设置为真时,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键。一般来说,inverse设置在一方,外键由从表维护

什么是缓存

  1. 缓存是数据库数据在内存中的临时容器
  2. 位于数据库与数据库访问层中间
  3. ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需要的数据,则直接将此数据所为结果加以利用
  4. 避免了数据库调用性能的开销
  5. 相对内存操作而言,时刻调用是一个代价高昂的过程

缓存分类

  1. 一级缓存:即在当前事务范围内的数据缓存,就Hibernate来讲,(一级缓存)事务级缓存是基于session的什么周期来实现的,session一旦关闭,一级缓存就清除,一级缓存为Hibernate自带的缓存是必须的
  2. 应用级(二级)缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可以又多个事务共享,在Hibernate中,应用级缓存由sessionfactory实现
  3. 分布式缓存:即在多个应用实例,多个jvm间共享的缓存策略

Hibernate延迟加载

  1. 在有关联的持久类对象中,对一个对象进行的查询也会向另一对象进行查询
  2. 所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作
  3. 延迟加载类型(实体对象的延迟加载(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常见的优化策略

  1. 用高版本的Hibernate
  2. 制定合理的缓存策略
  3. 采用合理的session管理机制
  4. 尽量使用延迟加载
  5. 如有可能,采用UUID作为主键生成策略
  6. 如有可能选用乐观锁代替悲观锁
  7. 在开发中,显示Hibernate执行的sql语句,从而指定更好的实现策略
  8. 复杂查询和统计查询可以使用sql语句完成,甚至可以考虑使用存储过程完成

Spring有什么好处

  1. spring能有效的组织你的中间层对象
  2. spring能消除在许多工程中常见的对singleton的过多使用
  3. spring能消除各种各样自定义格式的属性文件的需要,是配置信息一元化
  4. spring能够帮助我们真正意义上实现针对接口编程
  5. spring应用中的大多数业务对象没有依赖于spring
  6. 使用spring构建的应用程序易于单元测试
  7. spring支持jdbc和o/r mapping产品(Hibernate)
  8. MVC web 框架,提供一种清晰,无侵略的MVC实现方式
  9. spring能使用aop提供声明性事务管理,可以不直接操作jta也能够对事务进行管理
  10. 简化访问数据库时的例外处理
  11. jndi抽象层,编译改变实现细节,可以方便的在远程服务和本地服务间切换
  12. 提供了javaMail或其他邮件系统的支持

spring的Ioc/DI

控制反转模式的基本概念是:不创建对象,但是描述创建他们的方式,在代码中不直接与对象和服务连接,但在配置文件中描述那一组件余姚那一项服务,容器(在spring框架中ioc容器)负责将这些连接在一起。

IOC组件注入的方式

  1. 接口注入
  2. set方法注入
  3. 够造方法注入

Bean工厂

Applicationcontext扩展bean工厂接口,

applicationcontext提供附加功能,

bean工厂延迟加载所有的bean,直到getBean被调用,

applicationcontext则在初始化自身时检验,为立即加载,这样有利于检查所依赖属性是否注入,所有通常情况下我们选择使用applicationcontext,

spring容器中bean缺省状态下是单态模式

应用上下文applicationcontext

常用实现

  1. classpathxmlapplicationcontext Spring配置文件必需放在src目录下
  2. filesystemxmlapplicationcontext 配置文件放在工程下
  3. 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术语

  1. 切面(Aspect):就是你要实现的交叉的非核心业务功能
  2. 连接点(Joinpoint):应用程序执行过程中插入切面的地可以是方法调用,异常抛出
  3. 通知(Advice):通知切面的实际现代码
  4. 切入点(Pointcut):定义通知应用在哪些连接点
  5. 目标对象(Target):被通知的对象
  6. 代理(Proxy):将通知应用到目标对象后创建的对象
  7. 织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程

通知类型

  • Around(环绕通知)
  • Before(前置通知)
  • After(后置通知)
  • Throws(抛出异常通知)

ProxyFactoryBean产生代理对象

target:代理的目标对象

@after为后通知,表示目标方法执行后,无论是否有异常都会执行

@afterTeturning我返回后通知,表示目标方法正常执行后,会执行该方法,但如果目标方法有异常抛出,则不执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值