WEBLOGIC
1. WEBLOGIC域里面的服务器分那几种,他们之间的关系是什么? 管理服务器和托管服务器; 管理服务器管理托管服务器. 2. WEBLOGIC部署业务应用时,需要修改哪几个关键配置文件? web模块:扩展名.war,配置文件web.xml, ejb模块:扩展名.jar,配置文件ejb-jar.xml, ear模块:扩展名.ear,配置文件application.xml 3. WEBLOGIC中如何配置DataSource?DataSource来自什么资源? weblogic中通过配置数据库连接池得到连接池资源,然后通过连接池资源可以配置出DataSource 4. WEBLOGIC中如何配置数据库连接池?主要设置哪些参数? 可以通过weblogic管理控制台进行配置,也可以手动修改配置文件实现. 主要设置: 数据库连接字符串(包括IP,端口,数据库名,访问数据库的用户/密码等), 数据库驱动程序类路径, 最大连接数, 最小连接数等 http://dev2dev.bea.com.cn/techdoc/2004120203.html J2EE 5. J2ee容器都有那些 1)、J2EE服务器:是J2EE产品的运行部分。一个J2EE服务器提供EJB容器和Web容器。Enterprise JavaBeans(EJB)容器:管理J2EE应用程序的enterprise bean的执行。Enterprise bean和它的容器运行在J2EE服务器中。 2)、Web容器:管理J2EE应用程序的JSP页面和servlet组件的执行。Web组件和它的容器也运行在J2EE服务器中。 3)、客户端应用程序容器:管理应用程序客户端组件的运行。应用程序客户端和它的容器运行在客户端中。 4)、Applet容器:管理applet的执行。由运行在客户端的一个Web浏览器和Java插件一同组成。 6. web容器有哪些 web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接跟容器中的环境变量接×××互,不必关注其它系统问题。主要由WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。 7. JNDI有什么作用?哪些资源可以通过JNDI查找到? 通过目录名称访问远程服务,JNDI可以访问数据库连接资源,EJB组件,JMS服务等等 8. CMT EJB中对数据库进行插入和更新操作,一般配置什么事物属性? Required 9. CMT EJB中对数据库进行查询操作,一般配置什么事物属性? Support 10. SessionBean组件中的Remote接口,Home接口主要作用是什么?各有哪些主要的抽象方法? Home接口中的主要方法是create方法,该方法返回remote接口对象,Home接口的主要作用就是创建remote接口对象; Remote接口主要定义业务抽象方法,在Bean类中实现了这些抽象方法. 11. 有状态SessionBean中的active方法和deactive方法有什么作用? active方法初始化有状态SessionBean中的全局资源,并激活EJB容器中有状态SessionBean对象,使得有状态SessionBean可以为外部提供服务. deactive方法去激活EJB容器中有状态SessionBean对象,释放有状态SessionBean中初始化的全局资源. 12. 如何实现事务控制? JDBC事务管理方式 和 JTA事务管理方式 13. 事务的概念 事务处理是由以一个单一的逻辑单位完成的一系列操作,它可以由一系列的操作组成,如果在该单位包含的操作执行完毕后没有发生错误,那么它所作的改变就是永久的了。如果一旦有错误发生,它就会滚回,不会作任何修改或改变。 14. 事务的特点 Atomicity, Consistency, Isolation, and Durability 1,原子性(Atomicity) 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 2,一致性 (Consistency) 事务在完成时,必须使所有的数据都保持一致状态。 3,隔离性 (Isolation) 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。 4,持久性 (Durability) 事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。 15. EJB中的事务 (一) EJB中事务处理的属性有:Required,RequiresNew,Mandatory,NotSupported,Supports,Never. 1、Required:当客户端运行一个事务处理并调用EJB的一个方法,这个方法执行客户端的事务处理;当客户端没有启动一个事务处理,则EJB容器在执行这个方法之前启动一个新的事务处理. 2、RequiresNew:当客户端运行一个事务处理并调用EJB的一个方法时,容器管理器做如下操作: (1) 悬挂客户端的事务处理; (2) 开始一个新的事务处理; (3) 调用方法; (4) 当方法结束,恢复客户端的事物处理. 当客户端没有启动一个事务处理,容器管理器在执行这个方法之前启动一个新的事务处理. 3、Mandatory: 当客户端运行一个事务处理并调用EJB的一个方法,这个方法在客户端的事务处理范围内被执行; 当客户端没有启动一个事务处理,容器管理器将会抛错(TransactionRequiredException); 4、NotSupported: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器在调用方法之前终止客户端的事务处理,当方法执行完,再恢复客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理. 5、Supports: 当客户端运行一个事务处理并调用EJB的一个方法,在运行方法时执行客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理. 6、Never: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器将抛出一个错误(RemoteException); 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理. (二) EJB事务的操作 如果声明一个bean的事务控制为TX_BEAN_MANAGED,则这个bean可以访问事务服务。当事务控制应用于单个的方法时这个控制只能应用于整个的bean. bean访问事务服务的能力不能只对某个方法起作用。因此一个方法声明事务控制为TX_BEAN_MANAGED,而另一个方法声明为其它不同的事务控制是错误的。厂商的安装工具应该能检测到并报告这个错误。Bean分别通过初始化时setSessionContext()或 setEntityContext()方法的参数 SessionContext或EntityContext来访问事务服务。这些接口都是EJBContext的子类。 EJBContext的定义如下: Public interface javax.ejb.EJBContext { public Identity getCallerIdentity(); public boolean isCallerInRole(Identity other); public EJBHome getEJBHome(); public Properties getEnvironment(); public UserTransaction getUserTransaction() throwsIllegalStateException; public boolean getRollbackOnly(); public void set RollbackOnly(); } 一旦bean获得了一个UserTransaction的引用,就可以用这个引用管理自己的事务。有状态的会话bean的方法可以创建一个事务,而且不用终止事务就可以返回。如果还有线程调用bean的方法,容器检测是否有bean创建的活动的事务,如果被调用的事务是同一个事务,容器会允许该线程重新进入这个bean.如果bean在事务中且执行不同事务上下文的线程试图进入bean,容器会阻塞这个线程直到bean的事务终止。如果线程试图进入事务时 bean不在事务中,线程会执行一个自己的事务,容器会挂起线程当前的事务以允许线程进入。一旦线程离开方法就会恢复线程以前的事务,容器不会终止任何方法创建的事务。 对于无状态会话bean和实体bean,当事务活动时bean的方法不允许返回。容器会为此抛出一个例外。 会话同步接口 有状态和无状态的会话bean都可以访问数据库,并且参与一个事务。为了让bean在事务中执行它的任务,bean开发者可以实现在bean中实现 javax.ejb.SessionSynchronization接口。容器能自动检测这个接口,容器会使用这个接口中的方法以使bean得到事务的状态信息。实体bean不支持这个接口。因为实体bean are implicitly transaction aware,所以容器使用不同的方法控制一个事务中的实体 bean. SessionSynchronization接口定义如下: public interface javax.ejb.SessionSynchronization { public void afterBegin() throws RemoteException; public void beforeCompletion() throws RemoteException; public void afterCompletion(boolean yn) throws RemoteException; } 实际上一个事务不属于一个特殊的bean的实例。一个客户端或容器中执行的线程创建一个事务,在执行bean中的代码时执行该事务。如果一个有事务上下文的线程将要进入一个会话bean,容器首先调用它的afterBegin()方法。Bean可以记录所有的商业方法运行在事务中,随后执行事务操作。如果一个操作的内部标志显示这个线程在事务外运行,则会拒绝执行事务操作的请求。直到调用afterCompletion()方法,bean会继续认为商业方法的调用都在事务中执行。Bean将推断性地清除内部标志,以表示随后到来的事务请求将被拒绝。 如果一个事务上下文的线程试图进入一个已经是另一个事务的一部分的Bean时, .Container将封锁入口,直到前一个事务提交或回滚,并且afterCompletion()方法被调用,此时,允许Bean 恢复它的状态。Container负责提供这些行为。当Container发现它将要提交一个事务时,将在这个事务的所有的session Bean上调用beforeCompletion()方法。这就给Bean足够的机会来结束事务的操作,如在提交前将数据写入数据库。反之,当 Container 发现,将要回滚一个事务撕,BeforeCompletion()方法将不会被调用,因为将一个将被回滚的事务所产生的数据写入数据库是没有意义的。 AfterCompletion()是在一个事务即将提交或回滚时被调用,来通知Bean事务操作的最终结果。Bean可以用这个信息来修正自己的内部状态,但它不能用这个信息来维持任何它将要保存的事务。尽管session Bean可以创建,提交和回滚它自己的事务,但通常不推荐这样做。 SessionSynchronization接口不提供整合外部和内部事务的能力。如果一个session bean实现了这个接口,则意味着它在方法调用之间要保持事务的状态。特别地,这也暗示在afterBegin()和afterCompletion() 调用之间bean是处于一个事务中。这样,如果一个bean实现了SessionSynchronization接口并且在装配符中声明是无状态的就是一个错误。厂商提供的安装工具应该可以捕捉到并报告这个错误。无状态的session bean可以加入一个事务,但它们不能实现这个接口。事务可以是TX_BEAN_MANAGED,或者container可以在方法入口和从方法的返回上来开始和提交这个事务。Container不可允许在一个现存的事务中有一个线程进入方法,因为无状态的Bean的方法将无法知道正在运行的线程是否正在一个事务中。 解决这个问题的一个方法是使container挂起现存的事务,强迫方法总是认为线程没有在一个事务性的上下文中运行。有状态的Bran可以不实现这个接口而介入事务。但是,装配符必须要认真地配置以使得商务方法总能在正确的事务状态中运行。Bean自己没有通过这个接口来获得自己的事务的状态的权利。 加入事务 EJBContext接口在前面的一节中已经介绍了。其中有两个方法: public boolean getRollbackOnly(); public void setRoolbackOnly(); 这些方法可以有任何bean来使用,而不仅仅是那些声明了其事务控制为bean-managed的bean。事实上,那些处理自己的事务的bean将不会用到这些方法,因为这些方法不是用来和外界的事务管理器进行交流事务状态的。 当一个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语句作的全部修改,利用相应的回滚段被撤消。 所有数据的事务封锁被释放。 事务结束。 当事务回滚到一保留点(具有SAVEPOINT)时,有下列情况: 仅在该保留点之后执行的语句被撤消。 该指定的保留点仍然被保留,该保留点之后所建立的保留点被删除。 自该保留点之后所获取的全部表封锁和行封锁被释放,但指定的保留点以前所获取的全部数据封锁继续保持。 该事务仍可继续。 (3) 保留点 保留点(savepoint)是在一事务范围内的中间标志,经常用于将一个长的事务划分为小的部分。保留点可标志长事务中的任何点,允许可回滚该点之后的工作。在应用程序中经常使用保留点;例如一过程包含几个函数,在每个函数前可建立一个保留点,如果函数失败,很容易返回到每一个函数开始的情况。在回滚到一个保留点之后,该保持点之后所获得的数据封锁被释放。 26. 视图在什么情况下可以对其,删除,修改操作: DML操作应遵循的原则: 1).简单视图可以执行DML操作; 2). 在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行; 3).在视图不出现下列情况时可通过视图修改基表数据或插入数据: a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字; b.使用表达式定义的列; c.ROWNUM伪列。 d.基表中未在视图中选择的其他列定义为非空且无默认值。 WITH CHECK OPTION 子句限定: 通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行, 因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。 视图的删除: DROP VIEW VIEW_NAME语句删除视图。 删除视图的定义不影响基表中的数据。 只有视图所有者和具备DROP VIEW权限的用户可以删除视图。 视图被删除后,基于被删除视图的其他视图或应用将无效。 27. oracle中各种连接的写法: 内连接,外连接 ,左外连接,右外连接 以上几种连接一般用于多表之间复杂的查询, 下面先说说内连接,也即相等连接,如右两张表 dept ,employee, dept里有字段deptid,deptname,employee有字段empno,deptid,ename,sal,age等 那连接查询语句如下:select A.* ,B.* from dept A,employee B where A.deptid=B.deptid 一般出现这种情况的是一张是主表,另一张是子表,主表的主键作为子表的外键,显示结果按照子表的显示,内连接简单,这里就不多说了 外连接在oralce里用(+)表示,先看例子 select empno,ename,sal,emp.deptno,dept.deptno from emp,dept where emp.deptno(+) =dept.deptno 这是一个右连接 看下面的例子 select empno,ename,sal,emp.deptno,dept.deptno from emp,dept where dept.no=emp.deptno(+) 这是一个左连接 两个查询显示的查询结果是一样的,刚开始学oracle的时候很多人都很难明白这个,现在有个笨办法, 大家不防记下来,(+)出现查询条件的左边即右连接,出现在右边即左连接。(+)可以放在左边也可以 放在右边,但是一定要放在缺少条件的那一边,如上面的例子中,如果公司最近准备成立一个新的部门, 测试部门,但现在还没有招新员工,而现在Boss想知道公司有知道公司的员工在那个部门并且想知道 没有员工的部门,我们可以用上面的查询语句实现。 左外连接(left outer join)和右外连接(reght outer join)如同上面的外连接,查询的结果是一样的。 左外连接:select empno,ename,sal,emp.deptno,dept.deptno from dept left outer join emp on (emp.deptno=dept.deptno) 右外连接:select empno,ename,sal,emp.deptno,dept.deptno from emp reight outer join dept on (emp.deptno=dept.deptno) 以上显示的结果和外连接查询出来的结果是一样的,只是写法不一样而已,实际工作中外连接用的比较多,没有必要都要去用它,但是概念大家一定要了解。 全外关联 :FULL OUTER JOIN SELECT e.last_name, e.department_id, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.department_id = d.department_id); 结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。 28. 查询的优化 1).根据查询条件建立合适的index 2).因为SQL是从右向左解析,多表查询时,记录数少的表放在右边 3).多个条件时,收敛快的条件放在右边。 4).避免使用复杂的集合函数,象not in等。 5).避免在条件中对字段进行函数操作 6).尽量避免使用select *,应该写出需要查询的字段 7).在java中尽量使用preparestatement执行sql,从而共享执行计划" 29. 怎么看执行计划 使用explain或者autotrace查看执行计划 30. 如何强制一个SQL语句使用索引? 使用index hints 31. Oracle中的PL/SQL块是否熟悉?Oracle中的内置函数是否熟悉? 内置函数:ASCII,CHR,CONCAT, decode,to_date,to_char,to_number等等 32. 如何取一个没有排序的查询结果中的前10条记录? select fielda from tablea where rownum<=10; 33. 问:如何取一个有排序的查询结果中的前10条记录? select fielda from (select fielda from tablea order by fieldb ) where rownum<=10; 错误写法:select fielda from tablea where rownum<=10 order by fieldb; 34. 如何取一个没有排序的查询结果中的第11条到第20条记录? select fielda from (select fielda,rownum rn from tablea where rownum<=20) where rn>=11; 35. 如何取一个有排序的查询结果中的第11条到第20条记录? select fielda from (select fielda ,rownum rn from (select fielda from tablea order by fieldb ) where rownum<=20 ) where rn>=11; 36. 数据库设计中,主键的作用? 主键的作用保持数据表记录的唯一性,建立主键索引和作为外键使用.使用主键与外键的配对来表示实体间的连接. 37. Oracle数据库设计中,建立外键的方法? (1)用Create table命令语句在设计数据库表时建立外键 Create table Depart ( DepNO Number(2), DepName varchar2(10), CONSTRAINT pk_dept PRIMARY KEY (DepNO) ); Create table Emp ( EmpNo Number(4), EmpName varchar2(20), DepNo CONSTRAINT fk_deptno References Depart(DepNo) ); (2)用Alter table命令语句,为一个存在的表添加外键 Create table Depart ( DepNO Number(2), DepName varchar2(10), CONSTRAINT pk_dept PRIMARY KEY (DepNO) ); Create table Emp( EmpNo Number(4), EmpName varchar2(20), DepNo Number(2) ); Alter table Emp ADD CONSTRAINT fk_deptno Foreign key(DepNo) References Depart(DepNo);