JAVA认证 百分网手机站

java程序员面试考试题及答案(2)

时间:2018-03-17 10:03:51 JAVA认证 我要投稿

java程序员面试考试题及答案

  当一个bean调用了setRollBackOnly()方法时,它是在向事务管理器询问何时结束将要回滚的当前事务。它将给它所参与的事务的结果一个选票。这些方法还存在于UserTransaction接口中,但由于大多数的bean都不访问这个接口,这些方法必须直接地在EJBContext中提供给bean。注意这个方法并不引发回滚操作,它只是简单地设置标志,表示事务在结束时应该回滚。不象JavaBan属性设置方法,这个方法不以 boolean值作为参数。这个方法是特意设计成这样,以使得一个bean不能够改变另一个bean的回滚请求。一个bean也许希望使用 getRoolBackOnly()方法,来检查当前的事务的状态。如果另一个bean已经标志这个事务为rollback,则正在调用的bean可以推测到并决定不能执行那些在、强制性达到操作,如数据库更新,而这些操作很有可能在事务结束时被反转过来。

  客户划分的事务

  尽管一个JEB厂商所必须的,大服务器厂商也许决定提供一个类,使得用户可以直接访问事务管理器。当需要在同一个上下文中在两个不同的服务器上调用 bean时,用户也许会希望这样做。当然,每个bean的装配符可以允许这样的行为。用户可以创建一个事务,然后在两个不同server上的两个不同的 bean上调用商务方法,而将事务的上下文也作为调用的一部分进行传递。一旦调用结束,用户将推测地结束事务。有container厂商产生的stub和 skeleton将支持事务上下文的隐式传递。

  这里是一个可能的例子:

  Current current = new Current();

  Current.setServiceProvider(txMgrURL);

  Current.create();

  Current.begin();

  Current.doSomeWork();

  RemRef1.doSomeWork();

  RemRef2.doMoreWork();

  Current.commit();

  数据库操作的事务管理

  bean当然希望使用JDBC来建立到数据库的连接,并在其上进行操作。但是,为了符合EJB这种container管理事务的模式,连接不能使用自动提交特性,并且不应该在连接上试图提交或回滚。

  Container的角色是决定在这个事务中执行的所有行为应该提交还是回滚。这里提这样一个问题很好:container如何看到并管理由bean方法内部创建的数据库连接。尽管在规范中没有明确地提到,EJB将只能使用JDBC驱动,而JDBC也正是用来和EJB配合使用的。在数据库连接的创建时,驱动程序透明地将连接注册到正在执行的线程的当前事务中。之后当container决定结束事务时,数据库连接将自动地结束它。用OTS的术语说,数据库连接是不可恢复的资源,有事务服务在container的协助下,隐式地管理。尽管可以在这种情况下使用非事务感知的JDBC Driver,但开发者必须清楚任何在数据库连接上所做的操作都不属于bean的事务,开发者还必须确保在从方法返回之前结束数据库连接事务。试图使用 SessionSynchronization接口来合并数据库连接事务和bean本身的事务是不可靠的,是不应该作的。

  分布事务的支持

  一个分布事务在下面的情况下是需要的:

  . 一个用户使用用户划分的在多个server上的多个bean中创建和调用方法的事务。

  . 一个在其他的server上调用其他EJB的方法的bean的方法。

  对于这些工作厂商必须为EJBObject生成stub和skeleton来隐式地获得当前事务的上下文,同时将其通过方法调用传到远程bean。当将商务方法调用委派给bean时,远程bean的EJBObject的skeleton必须请求这个事务的上下文

  16. JDBC控制事务

  在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个 SQL语句都被当作一个事务,即每次执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。在最近一次commit()方法调用之后的'所有SQL会在方法commit()调用时得到确认。出现异常时,rollback对事务进行回滚。

  17. JTA事务管理方式

  Java事务API(Java Transaction API,JTA)用于为EJB组件提供与数据库管理器无关的事务组件管理方式。JTA作为Java事务服务(Java Transaction Service,JTS)的高层应用编程接口,使得在组件程序设计过程中可以利用JTA中的相应方法控制组件的事务范围以及事务管理方式。请读者看下面的代码:

  public void doAnotherThing(){

  UserTransaction ut = context.getUserTransaction();

  try{

  ut.begin();

  demoBusinessMethod();

  ut.commit();

  }catch (Exception exp){

  try{

  ut.rollback();

  }catch(SystemException exp1){

  throw new EJBException("Rollback failed: " + exp1.getMessage());

  }

  throw new EJBException("Transaction failed: " + exp.getMessage());

  } }

  在上面的代码中,读者首先看到用户事务接口对象UserTransaction。在该接口中定义了用于确定组件事务范围以及控制组件事务过程的 begin、commit和rollback方法。在组件方法执行之前首先调用UserTransaction接口中的begin方法确定组件的事务过程开始,在组件商务方法执行过程中如果没有发生异常,则调用commit方法提交事务范围内方法的运行结果,否则调用rollback方法将方法运行结果回滚并抛出EJBException类型异常。

  事务管理方式总结

  对于不同类型的EJB组件,在组件开发和组装可以选择不同的组件事务管理方式。下表对不同类型EJB组件适用的事务管理方式进行了总结:

  表1 组件类型与可选事务管理方式汇总表

  组件类型 容器事务管理方式 组件事务管理方式

  JDBC JTA

  会话组件 Y Y Y

  实体组件 Y N N

  消息驱动组件 Y Y Y

  从上表可以看出:除了实体组件不能采用JDBC和JTA事务管理方式外,其它任何事务管理方式均适用于所有类型的EJB组件。

  18. 使用事务的技巧:

  (1) 一个事务不要涉及太多的操作.

  (2) 容器管理和bean管理的事务

  事务既耗费应用服务器中的资源,又耗费数据库资源,所以事务越短越好.

  尽量使用容器管理事务而不要采用bean管理事务的方式.

  (3) ejb遇到错误,需要强制事务回滚. 使用EJBObject.setRollbackOnly();

  (4) 不能让事务涉及web层和表示逻辑

  (5) 企业应用中不应当选用supports 事务属性,因为只有调用者开始一个事务后,ejb才能在事务中运行.

  19. J2ee的认识

  Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

  20. 简述EJB

  (1)企业JavaBean(Enterprise JavaBean,EJB)为开发服务器端企业应用程序组件提供了一个模型,利用这个模型开发用来创建可移植与分布式企业应用程序的服务器企业应用程序组件,比创建独立的企业应用程序所需使用的企业应用程序组件更为简单。

  (2)EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。

  (3) 开发EJB的主要步骤一般来说,整个的开发步骤(开发,配置,组装)包括如下几个方面。

  开发:首先要定义三个类:Bean类本身,Bean的本地和远程接口类。

  配置:配置包括产生配置描述器-这是一个XML文件、声明了Enterprise Bean的属性、绑定了bean的class文件(包括stub文件和skeleton文件)。最后将这些配置都放到一个jar文件中。还需要在配置器中定义环境属性。

  组装应用程序:包括将Enterprise beans安装到Server服务器中,测试各层的连接情况。程序组装器将若干个Enterprise Beans与其它的组件结合起来,组合成一个完整的应用程序;或者将若干个Enterprise beans组合成一个复杂的Enterprise Bean?管理Enterprise Bean

  21. jdbc的批处理流程

  两种

  (1) Connection con = db.getConn();

  con.setAutoCommit(false);

  Statement stmt = con.createStatement();

  stmt.addBatch("INSERT INTO test VALUES(’1’,’1’)");

  stmt.addBatch("INSERT INTO test VALUES(’2’,’2’)");

  int[] updateCounts = stmt.executeBatch();

  con.commit();

  (2)connection.setAutoCommit(false);

  PreparedStatement statement =

  connection.prepareStatement("INSERT INTO TABLEX VALUES(?, ?)");

  statement.setInt(1, 1);

  statement.setString(2, "Cujo");

  statement.addBatch();

  statement.setInt(1, 2);

  statement.setString(2, "Fred");

  statement.addBatch();

  statement.setInt(1, 3);

  statement.setString(2, "Mark");

  statement.addBatch();

  int [] counts = statement.executeBatch();

  connection.commit();

  JAVA框架

  22. transaction有那几种实现(事务处理)(Spring)

  在Spring中,事务处理主要有两种方式

  (1) 代码控制事务

  在程序中引入新的模版类,这个类封装了事务管理的功能

  (2) 参数配置控制事务

  在Application-Context.xml增加一个事务代理(UserDAOProxy)配置,

  23. IBATIS中的事物属性怎么配置

  SQL MAP XML配置文件中的transactionManager

  24. STRUTS的配置文件是什么?

  struts-config.xml

  ORACLE

  25. Oracle中的事务

  Oracle在缺省情况下任何一个DML语句都会开始一个事务,直到用户发出Commit或Rollback操作,这个事务才会结束。在Oracle中,执行DDL语句(如Create Table、Create View等)时,会在执行之前自动发出一个Commit命令,并在随后发出一个Commit或者Rollback命令。

  (1) 提交事务

  提交一事务,即将在事务中由SQL语句所执行的改变永久化。在提交前,ORACLE已有下列情况:

  在SGA的回滚段缓冲区已生成回滚段记录,回滚信息包含有所修改值的老值。

  在SGA的日志缓冲区已生成日志项。这些改变在事务提交前可进入磁盘。

  对SGA的数据库缓冲区已作修改,这些修改在事务真正提交之前可进入磁盘。

  在事务提交之后,有下列情况:

  对于与回滚段相关的内部事务表记录提交事务,并赋给一个相应的唯一系统修改号(SCN),记录在表中。

  在SGA的日志缓冲区中日志项由LGWR进程写入到在线日志文件,这是构成提交事务的原子事务。

  在行上和表上的封锁被释放。

  该事务标志为完成 。

  注意:对于提交事务的数据修改不必由DBWR后台进程立即写入数据文件,可继续存储在SGA的数据库缓冲区中,在最有效时将其写入数据文件。

  (2) 回滚事务

  回滚事务的含义是撤消未提交事务中的SQL语句所作的对数据修改。ORALCE允许撤消未提交的整个事务,也允许撤消部分。

  在回滚整个事务(没有引用保留点)时,有下列情况:

  在事务中所有SQL语句作的全部修改,利用相应的回滚段被撤消。

  所有数据的事务封锁被释放。