总目录

JAVA面试题集合（项目11部V1.0版）

     JAVA面试题集合的内容来源于网络和郎沃师兄的提供,在这里向为
我提供资料的师兄们道谢。

     特别感谢：项目6部 老谭  (QQ:397713694)

     希望这套电子书能给即将找工作的同学带来帮助。

向郎沃所有辛勤工作的老师们致敬!!!

电子书制作：项目11部 爪哇的鱼

版本号:V1.0

Email:cnsofmit@163.com

QQ:312536369


JAVA面试题集（1）
作者：unknown 更新时间：2005-04-07

JAVA面试题集
基础知识：
1.C++或Java中的异常处理机制的简单原理和应用。

当JAVA程序违反了JAVA的语义规则时，JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查，程序员可以创建自己的异常，并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

2. Java的接口和C++的虚类的相同和不同处。

由于Java不支持多继承，而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性，现有的单继承机制就不能满足要求。与继承相比，接口有更高的灵活性，因为接口中没有任何实现代码。当一个类实现了接口以后，该类要实现接口里面所有的方法和属性，并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。

3. 垃圾回收的优点和原理。并考虑2种回收机制。

Java语言中一个显著的特点就是引入了垃圾回收机制，使c++程序员最头疼的内存管理的问题迎刃而解，它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制，Java中的对象不再有“作用域”的概念，只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露，有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行，不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收，程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收，增量垃圾回收。

4. 请说出你所知道的线程同步的方法。

wait():使一个线程处于等待状态，并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态，是一个静态方法，调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程，注意的是在调用此方法的时候，并不能确切的唤醒某一个等待状态的线程，而是由JVM确定唤醒哪个线程，而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程，注意并不是给所有唤醒线程一个对象的锁，而是让它们竞争。

5. 请讲一讲析构函数和虚函数的用法和作用。

6. Error与Exception有什么区别？

Error表示系统级的错误和程序不必处理的异常，

Exception表示需要捕捉或者需要程序进行处理的异常。

7. 在java中一个类被声明为final类型，表示了什么意思？

表示该类不能被继承，是顶级类。

8. 描述一下你最常用的编程风格。

9. heap和stack有什么区别。

栈是一种线形集合，其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。

堆是栈的一个组成元素

10. 如果系统要使用超大整数（超过long长度范围），请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算）。

public class BigInt()

{

int[] ArrOne = new ArrOne[1000];

String intString="";

public int[] Arr(String s)

{

intString = s;

for(int i=0;i<ArrOne.leght;i++)

{

11. 如果要设计一个图形系统，请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现

12，谈谈final, finally, finalize的区别。

    final?修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载。

    finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。

    finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

13，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?

    匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。

14，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。

    Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1

    注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象

第四，&和&&的区别。

    &是位运算符。&&是布尔逻辑运算符。

15，HashMap和Hashtable的区别。

    都属于Map接口的类，实现了将惟一键映射到特定的值上。

    HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。

    Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。

16，Collection 和 Collections的区别。

    Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。

    Collection是个java.util下的接口，它是各种集合结构的父接口。

17，什么时候用assert。

    断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 Assertionerror。它用于调试目的：

assert(a > 0); // throws an Assertionerror if a <= 0

断言可以有两种形式：

assert Expression1 ;

assert Expression1 : Expression2 ;

    Expression1 应该总是产生一个布尔值。

    Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。

    断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记：

    javac -source 1.4 Test.java

    要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。

    要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。

    要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。

    可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。

18，GC是什么? 为什么要有GC? (基础)。

    GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一：

System.gc()

Runtime.getRuntime().gc()

19，String s = new String("xyz");创建了几个String Object?

    两个对象，一个是“xyx”,一个是指向“xyx”的引用对象s。

20，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

    Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11;

21，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

    short s1 = 1; s1 = s1 + 1;有错，s1是short型，s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

22，sleep() 和 wait() 有什么区别? 搞线程的最爱

    sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非(a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。

    wait()是线程交互时，如果线程对一个同步对象x 发出一个wait()调用，该线程会暂停执行，被调对象进入等待状态，直到被唤醒或等待时间到。

23，Java有没有goto?

    Goto?java中的保留字，现在没有在java中使用。

24，数组有没有length()这个方法? String有没有length()这个方法？

    数组没有length()这个方法，有length的属性。

    String有有length()这个方法。

25，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

    方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

26，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

    Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

    equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。


JAVA面试题集（2）
作者：unknown 更新时间：2005-04-07

27，给我一个你最常见到的runtime exception。

ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,

ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

28，error和exception有什么区别?

    error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

    exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。

29，List, Set, Map是否继承自Collection接口?

List，Set是

Map不是

30，abstract class和interface有什么区别?

    声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

    接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。

31，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?

    都不能

32，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

    接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。

33，启动一个线程是用run()还是start()?

    启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

34，构造器Constructor是否可被override?

    构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。

35，是否可以继承String类?

    String类是final类故不可以继承。

36，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?

    不能，一个对象的一个synchronized方法只能由一个线程访问。

37，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?

    会执行，在return前执行。

38，编程题: 用最有效率的方法算出2乘以8等於几?

    有C背景的程序员特别喜欢问这种问题。

    2 << 3

39，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?

    不对，有相同的hash code。

40，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递?

    是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。

41，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?

    switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

42，编程题: 写一个Singleton出来。

    Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。

    一般Singleton模式通常有几种种形式：

    第一种形式：定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {

    private Singleton(){}

    //在自己内部定义自己一个实例，是不是很奇怪？

    //注意这是private 只供内部调用

    private static Singleton instance = new Singleton();

    //这里提供了一个供外部访问本class的静态方法，可以直接访问

    public static Singleton getInstance() {

        return instance;

     }

}

    第二种形式：

public class Singleton {

    private static Singleton instance = null;

    public static synchronized Singleton getInstance() {

    //这个方法比上面有所改进，不用每次都进行生成对象，只是第一次

    //使用时生成实例，提高了效率！

    if (instance==null)

        instance＝new Singleton();

return instance; 　　}

}

其他形式：

    定义一个类，它的构造函数为private的，所有方法为static的。

    一般认为第一种形式要更加安全些

    Hashtable和HashMap

    Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现

    HashMap允许将null作为一个entry的key或者value，而Hashtable不允许

    还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。

    最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在

多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap

就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。

43.描述一下JVM加载class文件的原理机制?
    JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

44.试举例说明一个典型的垃圾回收算法？
Java语言规范没有明确地说明JVM使用哪种垃圾回收算法，但是任何一种垃圾收集算法一般要做2件基本的事情：（1）发现无用信息对象；（2）回收被无用对象占用的内存空间，使该空间可被程序再次使用。
大多数垃圾回收算法使用了根集(root set)这个概念；所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量)，程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的，从根集可达的对象都是活动对象，它们不能作为垃圾被回收，这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件，应该被回收。下面介绍几个常用的算法。
引用计数法(Reference Counting Collector)
引用计数法是唯一没有使用根集的垃圾回收算法，该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说，堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时，引用计数器置为1。当对象被赋给任意变量时，引用计数器每次加1。当对象出了作用域后(该对象丢弃不再使用)，引用计数器减1，一旦引用计数器为0，对象就满足了垃圾收集的条件。
基于引用计数器的垃圾收集器运行较快，不会长时间中断程序执行，适宜地必须 实时运行的程序。但引用计数器增加了程序执行的开销，因为每次对象赋给新的变量 ，计数器加1，而每次现有对象出了作用域生，计数器减1。

45.请用java写二叉树算法，实现添加数据形成二叉树功能，并以先序的方式打印出来.

46.请写一个java程序实现线程连接池功能？

47.给定一个C语言函数，要求实现在java类中进行调用。

48、编一段代码，实现在控制台输入一组数字后，排序后在控制台输出；

49、列出某文件夹下的所有文件；
public static void displayFile(String path){
        File file = new File(path);
        if(file.isFile()){
            System.out.println(file.getName());
        }
        else{
            System.out.println("<DIR> "+file.getName());
            String [] fileList = file.list();
            String pathName = file.getAbsolutePath();
            for(int i = 0;i<fileList.length;i++){
                displayFile(pathName+File.separator+fileList[i]);
            }
        }

    }
50、调用系统命令实现删除文件的操作；
public static void deleteFile(String path){
        File file = new File(path);
        file.delete();
    }
51、实现从文件中一次读出一个字符的操作；

52、列出一些控制流程的方法；

53、多线程有哪些状态？
新建、就绪(start方法调用后)、运行、睡眠(sleep方法)、等待(wait方法)、挂起、恢复、阻塞、死亡

54、编写了一个服务器端的程序实现在客户端输入字符然后在控制台上显示，直到输入"END"为止，让你写出客户端的程序；

55、作用域public,private,protected,以及不写时的区别
答：区别如下：

作用域 当前类 同一package 子孙类 其他package

public √ √ √ √

protected √ √ √ ×

friendly √ √ × ×

private √ × × ×


JAVA面试题集（3）
作者：unknown 更新时间：2005-04-07

答：区别如下：

作用域 当前类 同一package 子孙类 其他package

public √ √ √ √

protected √ √ √ ×

friendly √ √ × ×

private √ × × ×

不写时默认为friendly

56、ArrayList和Vector的区别,HashMap和Hashtable的区别

答：就ArrayList与Vector主要从二方面来说.

一.同步性:Vector是线程安全的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的

二.数据增长:当需要增长时,Vector默认增长为原来一培，而ArrayList却是原来的一半

就HashMap与HashTable主要从三方面来说。

一.历史原因:Hashtable是基于陈旧的Dictionary类的，HashMap是Java 1.2引进的Map接口的一个实现

二.同步性:Hashtable是线程安全的，也就是说是同步的，而HashMap是线程序不安全的，不是同步的

三.值：只有HashMap可以让你将空值作为一个表的条目的key或value

57、char型变量中能不能存贮一个中文汉字?为什么?

答：是能够定义成为一个中文的，因为java中以unicode编码，一个char占16个字节，所以放一个中文是没问题的

58、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

答：多线程有两种实现方法，分别是继承Thread类与实现Runnable接口

同步的实现方面有两种，分别是synchronized,wait与notify

59、垃圾回收机制,如何优化程序?

希望大家补上，谢谢

60、float型float f=3.4是否正确?

答:不正确。精度不准确,应该用强制类型转换，如下所示：float f=(float)3.4

61、介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)?

答：Collection FrameWork如下：

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│　└Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）

Map提供key到value的映射

62、Java中异常处理机制，事件机制？

11、JAVA中的多形与继承？

希望大家补上，谢谢

63、抽象类与接口？

答：抽象类与接口都用于抽象，但是抽象类(JAVA中)可以有自己的部分实现，而接口则完全是一个标识(同时有多重继承的功能)。

编程题：

1．现在输入n个数字，以逗号，分开；

然后可选择升或者降序排序；

按提交键就在另一页面显示

按什么 排序，结果为， ，

提供reset

答案（1） public static String[] splitStringByComma(String source){

if(source==null||source.trim().equals(""))

return null;

StringTokenizer commaToker = new StringTokenizer(source,",");

String[] result = new String[commaToker.countTokens()];

int i=0;

while(commaToker.hasMoreTokens()){

result[i] = commaToker.nextToken();

i++;

}

return result;

}

循环遍历String数组

Integer.parseInt(String s)变成int类型

组成int数组

Arrays.sort(int[] a),

a数组升序

降序可以从尾部开始输出

2．金额转换，阿拉伯数字的金额转换成中国传统的形式如：

（￥1011）－>（一千零一拾一元整）输出。

3、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?

答:父类：

package test;

public class FatherClass

{

public FatherClass()

{

System.out.println("FatherClass Create");

}

}

子类:

package test;

import test.FatherClass;

public class ChildClass extends FatherClass

{

public ChildClass()

{

System.out.println("ChildClass Create");

}

public static void main(String[] args)

{

FatherClass fc = new FatherClass();

ChildClass cc = new ChildClass();

}

}

输出结果：

C:>java test.ChildClass

FatherClass Create

FatherClass Create

ChildClass Create

4、内部类的实现方式?

答：示例代码如下：

package test;

public class OuterClass

{

private class InterClass

{

public InterClass()

{

System.out.println("InterClass Create");

}

}

public OuterClass()

{

InterClass ic = new InterClass();

System.out.println("OuterClass Create");

}

public static void main(String[] args)

{

OuterClass oc = new OuterClass();

}

}

输出结果:

C:>java test/OuterClass

InterClass Create

OuterClass Create

再一个例题：

public class OuterClass {

private double d1 = 1.0;

//insert code here

}

You need to insert an inner class declaration at line 3. Which two inner class declarations are

valid?(Choose two.)

A. class InnerOne{

public static double methoda() {return d1;}

}

B. public class InnerOne{

static double methoda() {return d1;}

}

C. private class InnerOne{

double methoda() {return d1;}

}

D. static class InnerOne{

protected double methoda() {return d1;}

}

E. abstract class InnerOne{

public abstract double methoda();

}

说明如下：

一.静态内部类可以有静态成员，而非静态内部类则不能有静态成员。 故 A、B 错

二.静态内部类的非静态成员可以访问外部类的静态变量，而不可访问外部类的非静态变量；return d1 出错。

故 D 错

三.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确

四.答案为C、E

5、Java 的通信编程，编程题(或问答)，用JAVA SOCKET编程，读服务器几个字符，再写入本地显示？

答:Server端程序:

package test;

import java.net.*;

import java.io.*;

public class Server

{

private ServerSocket ss;

private Socket socket;

private BufferedReader in;

private PrintWriter out;

public Server()

{

try

{

ss=new ServerSocket(10000);

while(true)

{

socket = ss.accept();

String RemoteIP = socket.getInetAddress().getHostAddress();

String RemotePort = ":"+socket.getLocalPort();

System.out.println("A client come in!IP:"+RemoteIP+RemotePort);

in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));

String line = in.readLine();

System.out.println("Cleint send is :" + line);

out = new PrintWriter(socket.getOutputStream(),true);

out.println("Your Message Received!");

out.close();

in.close();

socket.close();

}

}catch (IOException e)

{

out.println("wrong");

}

}

public static void main(String[] args)

{

new Server();

}

};

Client端程序:

package test;

import java.io.*;

import java.net.*;

public class Client

{

Socket socket;

BufferedReader in;

PrintWriter out;

public Client()

{

try

{

System.out.println("Try to Connect to 127.0.0.1:10000");

socket = new Socket("127.0.0.1",10000);

System.out.println("The Server Connected!");

System.out.println("Please enter some Character:");

BufferedReader line = new BufferedReader(new

InputStreamReader(System.in));

out = new PrintWriter(socket.getOutputStream(),true);

out.println(line.readLine());

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

System.out.println(in.readLine());

out.close();

in.close();

socket.close();

}catch(IOException e)

{

out.println("Wrong");

}

}

public static void main(String[] args)

{

new Client();

}

};


JAVA面试题集（4）
作者：unknown 更新时间：2005-04-07

6、用JAVA实现一种排序，JAVA类实现序列化的方法(二种)？ 如在COLLECTION框架中，实现比较要实现什么样的接口？

答:用插入法进行排序代码如下

package test;

import java.util.*;

class InsertSort

{

ArrayList al;

public InsertSort(int num,int mod)

{

al = new ArrayList(num);

Random rand = new Random();

System.out.println("The ArrayList Sort Before:");

for (int i=0;i<num ;i++ )

{

al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));

System.out.println("al["+i+"]="+al.get(i));

}

}

public void SortIt()

{

Integer tempInt;

int MaxSize=1;

for(int i=1;i<al.size();i++)

{

tempInt = (Integer)al.remove(i);

if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue())

{

al.add(MaxSize,tempInt);

MaxSize++;

System.out.println(al.toString());

} else {

for (int j=0;j<MaxSize ;j++ )

{

if

(((Integer)al.get(j)).intValue()>=tempInt.intValue())

{

al.add(j,tempInt);

MaxSize++;

System.out.println(al.toString());

break;

}

}

}

}

System.out.println("The ArrayList Sort After:");

for(int i=0;i<al.size();i++)

{

System.out.println("al["+i+"]="+al.get(i));

}

}

public static void main(String[] args)

{

InsertSort is = new InsertSort(10,100);

is.SortIt();

}

}

JAVA类实现序例化的方法是实现java.io.Serializable接口

Collection框架中实现比较要实现Comparable 接口和 Comparator 接口

7、编程：编写一个截取字符串的函数，输入为一个字符串和字节数，输出为按字节截取的字符串。 但是要保证汉字不被截半个，如“我ABC”4，应该截为“我AB”，输入“我ABC汉DEF”，6，应该输出为“我ABC”而不是“我ABC+汉的半个”。

答：代码如下：

package test;

class SplitString

{

String SplitStr;

int SplitByte;

public SplitString(String str,int bytes)

{

SplitStr=str;

SplitByte=bytes;

System.out.println("The String is:′"+SplitStr+"′;SplitBytes="+SplitByte);

}

public void SplitIt()

{

int loopCount;

loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/Split

Byte+1);

System.out.println("Will Split into "+loopCount);

for (int i=1;i<=loopCount ;i++ )

{

if (i==loopCount){

System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));

} else {

System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));

}

}

}

public static void main(String[] args)

{

SplitString ss = new SplitString("test中dd文dsaf中男大3443n中国43中国人

0ewldfls=103",4);

ss.SplitIt();

}

}

8、JAVA多线程编程。 用JAVA写一个多线程程序，如写四个线程，二个加1，二个对一个变量减一，输出。

希望大家补上，谢谢

9、STRING与STRINGBUFFER的区别。

答：STRING的长度是不可变的，STRINGBUFFER的长度是可变的。如果你对字符串中的内容经常进行操作，特别是内容要修改时，那么使用StringBuffer，如果最后需要String，那么使用StringBuffer的toString()方法

Jsp方面

1、jsp有哪些内置对象?作用分别是什么?

答:JSP共有以下9种基本内置组件（可与ASP的6种内部组件相对应）：

  request 用户端请求，此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

exception 针对错误网页，未捕捉的例外

2、jsp有哪些动作?作用分别是什么?

答:JSP共有以下6种基本动作

jsp:include：在页面被请求的时候引入一个文件。

jsp:useBean：寻找或者实例化一个JavaBean。

jsp:setProperty：设置JavaBean的属性。

jsp:getProperty：输出某个JavaBean的属性。

jsp:forward：把请求转到一个新的页面。

jsp:plugin：根据浏览器类型为Java插件生成OBJECT或EMBED标记

3、JSP中动态INCLUDE与静态INCLUDE的区别？

答：动态INCLUDE用jsp:include动作实现

<jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化，适合用于包含动态页面，并且可以带参数

静态INCLUDE用include伪码实现,定不会检查所含文件的变化，适用于包含静态页面

<%@ include file="included.htm" %>

4、两种跳转方式分别是什么?有什么区别?

答：有两种，分别为：

<jsp:include page="included.jsp" flush="true">

<jsp:forward page= "nextpage.jsp"/>

前者页面不会转向include所指的页面，只是显示该页的结果，主页面还是原来的页面。执行完后还会回来，相当于函数调用。并且可以带参数.后者完全转向新页面，不会再回来。相当于go to 语句。

Servlet方面

1、说一说Servlet的生命周期?

答:servlet有良好的生存期的定义，包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。

2、Servlet版本间(忘了问的是哪两个版本了)的不同?

希望大家补上，谢谢

3、JAVA SERVLET API中forward() 与redirect()的区别？

答:前者仅是容器中控制权的转向，在客户端浏览器地址栏中不会显示出转向后的地址；后者则是完全的跳转，浏览器将会得到跳转的地址，并重新发送请求链接。这样，从浏览器的地址栏中可以看到跳转后的链接地址。所以，前者更加高效，在前者可以满足需要时，尽量使用forward()方法，并且，这样也有助于隐藏实际的链接。在有些情况下，比如，需要跳转到一个其它服务器上的资源，则必须使用sendRedirect()方法。

4、Servlet的基本架构

public class ServletName extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

}

}


JAVA面试题集（5）
作者：unknown 更新时间：2005-04-07

Jdbc、Jdo方面

1、可能会让你写一段Jdbc连Oracle的程序,并实现数据查询.

答:程序如下：

package hello.ant;

import java.sql.*;

public class jdbc

{

String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";

String theUser="admin";

String thePw="manager";

Connection c=null;

Statement conn;

ResultSet rs=null;

public jdbc()

{

try{

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

c = DriverManager.getConnection(dbUrl,theUser,thePw);

conn=c.createStatement();

}catch(Exception e){

e.printStackTrace();

}

}

public boolean executeUpdate(String sql)

{

try

{

conn.executeUpdate(sql);

return true;

}

catch (SQLException e)

{

e.printStackTrace();

return false;

}

}

public ResultSet executeQuery(String sql)

{

rs=null;

try

{

rs=conn.executeQuery(sql);

}

catch (SQLException e)

{

e.printStackTrace();

}

return rs;

}

public void close()

{

try

{

conn.close();

c.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

public static void main(String[] args)

{

ResultSet rs;

jdbc conn = new jdbc();

rs=conn.executeQuery("select * from test");

try{

while (rs.next())

{

System.out.println(rs.getString("id"));

System.out.println(rs.getString("name"));

}

}catch(Exception e)

{

e.printStackTrace();

}

}

}

2、Class.forName的作用?为什么要用?

答：调用该访问返回一个以字符串指定类名的类的对象。

3、Jdo是什么?

答:JDO是Java对象持久化的新的规范，为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储，因此对开发人员来说，存储数据对象完全不需要额外的代码（如JDBC API的使用）。这些繁琐的例行工作已经转移到JDO产品提供商身上，使开发人员解脱出来，从而集中时间和精力在业务逻辑上。另外，JDO很灵活，因为它可以在任何数据底层上运行。JDBC只是面向关系数据库（RDBMS)JDO更通用，提供到任何数据底层的存储功能，比如关系数据库、文件、XML以及对象数据库（ODBMS）等等，使得应用可移植性更强。

4、在ORACLE大数据量下的分页解决方法。一般用截取ID方法，还有是三层嵌套方法。

答:一种分页方法

<%

int i=1;

int numPages=14;

String pages = request.getParameter("page") ;

int currentPage = 1;

currentPage=(pages==null)?(1):{Integer.parseInt(pages)}

sql = "select count(*) from tables";

ResultSet rs = DBLink.executeQuery(sql) ;

while(rs.next()) i = rs.getInt(1) ;

int intPageCount=1;

intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);

int nextPage ;

int upPage;

nextPage = currentPage+1;

if (nextPage>=intPageCount) nextPage=intPageCount;

upPage = currentPage-1;

if (upPage<=1) upPage=1;

rs.close();

sql="select * from tables";

rs=DBLink.executeQuery(sql);

i=0;

while((i<numPages*(currentPage-1))&&rs.next()){i++;}

%>

//输出内容

//输出翻页连接

合计:<%=currentPage%>/<%=intPageCount%><a href="List.jsp?page=1">第一页</a><a

href="List.jsp?page=<%=upPage%>">上一页</a>

<%

for(int j=1;j<=intPageCount;j++){

if(currentPage!=j){

%>

<a href="list.jsp?page=<%=j%>">[<%=j%>]</a>

<%

}else{

out.println(j);

}

}

%>

<a href="List.jsp?page=<%=nextPage%>">下一页</a><a href="List.jsp?page=<%=intPageCount%>">最后页

</a>

Xml方面

1、xml有哪些解析技术?区别是什么?

答:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的，这种结构占用的内存较多，而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件，不需要一次全部装载整个文件。当遇到像文件开头，文档结束，或者标签开头与标签结束时，它会触发一个事件，用户通过在其回调事件中写入处理代码来处理XML文件，适合对XML的顺序访问

STAX:Streaming API for XML (StAX)

2、你在项目中用到了xml技术的哪些方面?如何实现的?

答:用到了数据存贮，信息配置两方面。在做数据交换平台时，将不能数据源的数据组装成XML文件，然后将XML文件压缩打包加密后通过网络传送给接收者，接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时，利用XML可以很方便的进行，软件的各种配置参数都存贮在XML文件中。

3、用jdom解析xml文件时如何解决中文问题?如何解析?

答:看如下代码,用编码方式加以解决

package test;

import java.io.*;

public class DOMTest

{

private String inFile = "c:\people.xml";

private String outFile = "c:\people.xml";

public static void main(String args[])

{

new DOMTest();

}

public DOMTest()

{

try

{

javax.xml.parsers.DocumentBuilder builder =

javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();

org.w3c.dom.Document doc = builder.newDocument();

org.w3c.dom.Element root = doc.createElement("老师");

org.w3c.dom.Element wang = doc.createElement("王");

org.w3c.dom.Element liu = doc.createElement("刘");

wang.appendChild(doc.createTextNode("我是王老师"));

root.appendChild(wang);

doc.appendChild(root);

javax.xml.transform.Transformer transformer =

javax.xml.transform.TransformerFactory.newInstance().newTransformer();

transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");

transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");

transformer.transform(new javax.xml.transform.dom.DOMSource(doc),

new

javax.xml.transform.stream.StreamResult(outFile));

}

catch (Exception e)

{

System.out.println (e.getMessage());

}

}

}


JAVA面试题集（7）
作者：unknown 更新时间：2005-04-07

CORBA方面

1、CORBA是什么?用途是什么?

答：CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture)，由对象管理组织 (Object Management Group，缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为：

用不同的程序设计语言书写

在不同的进程中运行

为不同的操作系统开发

LINUX方面

1、LINUX下线程，GDI类的解释。

答：LINUX实现的就是基于核心轻量级进程的"一对一"线程模型，一个线程实体对应一个核心轻量级进程，而线程之间的管理在核外函数库中实现。

GDI类为图像设备编程接口类库。

JAVA华为面试题

JAVA方面

1 面向对象的特征有哪些方面

2 String是最基本的数据类型吗?

3 int 和 Integer 有什么区别

4 String 和StringBuffer的区别

5运行时异常与一般异常有何异同？

异常表示程序运行过程中可能出现的非正常状态，运行时异常表示虚拟机的通常操作中可能遇到的异常，是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常，但是并不要求必须声明抛出未被捕获的运行时异常。

6 说出一些常用的类，包,接口，请各举5个

7 说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据，此数组元素数大于实际存储的数据以便增加和插入元素，它们都允许直接按序号索引元素，但是插入元素要涉及数组元素移动等内存操作，所以索引数据快而插入数据慢，Vector由于使用了synchronized方法（线程安全），通常性能上较ArrayList差，而LinkedList使用双向链表实现存储，按序号索引数据需要进行前向或后向遍历，但是插入数据时只需要记录本项的前后项即可，所以插入速度较快。

8设计4个线程，其中两个线程每次对j增加1，另外两个线程对j每次减少1。写出程序。

以下程序使用内部类实现线程，对j增减的时候没有考虑顺序问题。

public class ThreadTest1{

private int j;

public static void main(String args[]){

ThreadTest1 tt=new ThreadTest1();

Inc inc=tt.new Inc();

Dec dec=tt.new Dec();

for(int i=0;i<2;i++){

Thread t=new Thread(inc);

t.start();

t=new Thread(dec);

t.start();

}

}

private synchronized void inc(){

j++;

System.out.println(Thread.currentThread().getName()+"-inc:"+j);

}

private synchronized void dec(){

j--;

System.out.println(Thread.currentThread().getName()+"-dec:"+j);

}

class Inc implements Runnable{

public void run(){

for(int i=0;i<100;i++){

inc();

}

}

}

class Dec implements Runnable{

public void run(){

for(int i=0;i<100;i++){

dec();

}

}

}

}

9． JSP的内置对象及方法。

request request表示HttpServletRequest对象。它包含了有关浏览器请求的信息，并且提供了几个用于获取cookie, header, 和session数据的有用的方法。

response response表示HttpServletResponse对象，并提供了几个用于设置送回 浏览器的响应的方法（如cookies,头信息等）

out out 对象是javax.jsp.JspWriter的一个实例，并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API，并且包装了通用的servlet相关功能的方法。

session session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

application applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

config config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

page page表示从该页面产生的一个servlet实例

10.用socket通讯写出客户端和服务器端的通讯，要求客户发送数据后能够回显相同的数据。

参见课程中socket通讯例子。

11说出Servlet的生命周期，并说出Servlet和CGI的区别。

Servlet被服务器实例化后，容器运行其init方法，请求到达时运行其service方法，service方法自动派遣运行与请求对应的doXXX方法（doGet，doPost）等，当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中，它通过多线程方式运行其service方法，一个实例可以服务于多个请求，并且其实例一般不会销毁，而CGI对每个请求都产生新的进程，服务完成后就销毁，所以效率上低于servlet。

12.EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区别。

13．EJB包括（SessionBean,EntityBean）说出他们的生命周期，及如何管理事务的？

14．说出数据连接池的工作机制是什么?

15同步和异步有和异同，在什么情况下分别使用他们？举例说明。


JAVA面试题集（8）
作者：unknown 更新时间：2005-04-07

16应用服务器有那些？
Weblogic、Tomcat、jboss

17你所知道的集合类都有哪些？主要方法？
ArrayList、LinkedList、HashSet、HashMap、TreeMap、HashTable

18给你一个:驱动程序A,数据源名称为B,用户名称为C,密码为D,数据库表为T，请用JDBC检索出表T的所有数据。
Class.forName("A");

19．说出在JSP页面里是怎么分页的?

页面需要保存以下参数：

总行数：根据sql语句得到总行数

每页显示行数：设定值

当前页数：请求参数

页面根据当前页数和每页行数计算出当前页第一行行数，定位结果集到此行，对结果集取出每页显示行数的行即可。

数据库方面：

1. 存储过程和函数的区别

存储过程是用户定义的一系列sql语句的集合，涉及特定表或其它对象的任务，用户可以调用存储过程，而函数通常是数据库已定义的方法，它接收参数并返回某种类型的值并且不涉及特定用户表。

2. 事务是什么？

事务是作为一个逻辑单元执行的一系列操作，一个逻辑工作单元必须有四个属性，称为 ACID（原子性、一致性、隔离性和持久性）属性，只有这样才能成为一个事务：

原子性

事务必须是原子工作单元；对于其数据修改，要么全都执行，要么全都不执行。

一致性

事务在完成时，必须使所有的数据都保持一致状态。在相关数据库中，所有规则都必须应用于事务的修改，以保持所有数据的完整性。事务结束时，所有的内部数据结构（如 B 树索引或双向链表）都必须是正确的。

隔离性

由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态，要么是另一并发事务修改它之前的状态，要么是另一事务修改它之后的状态，事务不会查看中间状态的数据。这称为可串行性，因为它能够重新装载起始数据，并且重播一系列事务，以使数据结束时的状态与原始事务执行的状态相同。

持久性

事务完成之后，它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

3. 游标的作用？如何知道游标已经到了最后？

游标用于定位结果集的行，通过判断全局变量@@FETCH_STATUS可以判断是否到了最后，通常此变量不等于0表示出错或到了最后。

4. 触发器分为事前触发和事后触发，这两种触发有和区别。语句级触发和行级触发有何区别。

事前触发器运行于触发事件发生之前，而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。

语句级触发器可以在语句执行前或后执行，而行级触发在触发器所影响的每一行触发一次。

中远面试题

1、面向对象的三个基本特征

2、方法重载和方法重写的概念和区别

3、接口和内部类、抽象类的特性

4、文件读写的基本类

**5、串行化的注意事项以及如何实现串行化

6、线程的基本概念、线程的基本状态以及状态之间的关系

7、线程的同步、如何实现线程的同步

8、几种常用的数据结构及内部实现原理。

9、Socket通信(TCP、UDP区别及Java实现方式)

**10、Java的事件委托机制和垃圾回收机制

11、JDBC调用数据库的基本步骤

**12、解析XML文件的几种方式和区别

13、Java四种基本权限的定义

14、Java的国际化

二、JSP
1、至少要能说出7个隐含对象以及他们的区别

** 2、forward 和redirect的区别

3、JSP的常用指令

三、servlet
1、什么情况下调用doGet()和doPost()？

2、servlet的init()方法和service()方法的区别

3、servlet的生命周期

4、如何现实servlet的单线程模式

5、servlet的配置

6、四种会话跟踪技术

四、EJB
**1、EJB容器提供的服务

主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。

2、EJB的角色和三个对象

EJB角色主要包括Bean开发者 应用组装者 部署者 系统管理员 EJB容器提供者 EJB服务器提供者

三个对象是Remote（Local）接口、Home（LocalHome）接口，Bean类

2、EJB的几种类型

会话（Session）Bean ，实体（Entity）Bean 消息驱动的（Message Driven）Bean

会话Bean又可分为有状态（Stateful）和无状态（Stateless）两种

实体Bean可分为Bean管理的持续性（BMP）和容器管理的持续性（CMP）两种

3、bean 实例的生命周期

对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理，而对于Entity Bean和Statefull Session Bean存在Cache管理，通常包含创建实例，设置上下文、创建EJB Object（create）、业务方法调用、remove等过程，对于存在缓冲池管理的Bean，在create之后实例并不从内存清除，而是采用缓冲池调度机制不断重用实例，而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。

4、激活机制

以Statefull Session Bean 为例：其Cache大小决定了内存中可以同时存在的Bean实例的数量，根据MRU或NRU算法，实例在激活和去激活状态之间迁移，激活机制是当客户端调用某个EJB实例业务方法时，如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中（通过序列化机制存储实例）回复（激活）此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。

5、remote接口和home接口主要作用

remote接口定义了业务方法，用于EJB客户端调用业务方法

home接口是EJB工厂用于创建和移除查找EJB实例

6、客服端调用EJB对象的几个基本步骤

一、 设置JNDI服务工厂以及JNDI服务地址系统属性

二、 查找Home接口

三、 从Home接口调用Create方法创建Remote接口

四、 通过Remote接口调用其业务方法

五、数据库
1、存储过程的编写

2、基本的SQL语句

六、weblogic
1、 如何给weblogic指定大小的内存?

在启动Weblogic的脚本中（位于所在Domian对应服务器目录下的startServerName），增加set MEM_ARGS=-Xms32m -Xmx200m，可以调整最小内存为32M，最大200M

2、 如何设定的weblogic的热启动模式(开发模式)与产品发布模式?

可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件，增加set PRODUCTION_MODE=true。

3、 如何启动时不需输入用户名与密码?

修改服务启动文件，增加 WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码.

4、 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中?

保存在此Domain的config.xml文件中，它是服务器的核心配置文件。

5、 说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办?

Domain目录\服务器目录\applications，将应用目录放在此目录下将可以作为应用访问，如果是Web应用，应用目录需要满足Web应用目录要求，jsp文件可以直接放在应用目录中，Javabean需要放在应用目录的WEB-INF目录的classes目录中，设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。

6、 如何查看在weblogic中已经发布的EJB?

可以使用管理控制台，在它的Deployment中可以查看所有已发布的EJB

7、 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置

缺省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL，需要配置服务器使用Enable SSL，配置其端口，在产品模式下需要从CA获取私有密钥和数字证书，创建identity和trust keystore，装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。

8、在weblogic中发布ejb需涉及到哪些配置文件

不同类型的EJB涉及的配置文件不同，都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml

9、EJB需直接实现它的业务接口或Home接口吗,请简述理由.

远程接口和Home接口不需要直接实现，他们的实现代码是由服务器产生的，程序运行中对应实现类会作为对应接口类型的实例被使用。

10、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别

persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来，而non－persistent方式的消息将被丢弃。

11、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法

Session Facade Pattern：使用SessionBean访问EntityBean

Message Facade Pattern：实现异步调用

EJB Command Pattern：使用Command JavaBeans取代SessionBean，实现轻量级访问

Data Transfer Object Factory：通过DTO Factory简化EntityBean数据提供特性

Generic Attribute Access：通过AttibuteAccess接口简化EntityBean数据提供特性

Business Interface：通过远程（本地）接口和Bean类实现相同接口规范业务逻辑一致性

ＥＪＢ架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂，项目队伍越庞大则越能体现良好设计的重要性


宝信公司的面试：
面试考官：技术人员
首先填写应聘人员登录表，表中信息很详细，家庭成员信息、以前的工资和期望的工资也要填写。
然后每人依次和技术部考官进行谈话。
考官一边看你的登录表，一边问问题，并把你所回答的问题记录下来。
考官发现我们都没有填写期望工资，他便说了一句：“工资方面你们不要担心，这个好谈！”

1.工作经验
2.会使用哪些图形处理工具？
3.会不会css？
4.会不会javascript？
5.是否熟悉sql语句？熟悉哪些数据库，会不会使用sql语句对数据记录进行增、删、改和查询？
6.你所做的项目是某个客户的需求，还是毕业设计，项目小组成员有多少？
7.虽然每天的工作时间是8个小时，但项目紧的时候，需要加班，能不能理解公司的这种做法？


                         创立科技面试
1.介绍项目经验中负责的模块
2.谈谈你对spring的理解
3.ejb是什么？
4.解析xml的方法以及区别？
5.javaScript的常用处？
6.j2ee的主要技术？
7.对struts工作流程的理解？
8.java是什么语言？
9.webservice是哪个公司开发的？
10.cvs是整啥子的？
11.你的爱好是啥？
12.对数据库建模的感受？

  注：考官是根据我的简历来问的，如果是单独面试的话最好是把简历上的整熟哦，人多可能才发题做。


成都金晨培训中心的面试过程简介：

第一天面试内容：（由中心王长江老师在教室进行面试，如果校长在，也可能参加）

1、命题试讲：多线程，自备PPT，30分钟左右，一般给一天准备时间
   注意：教室计算机中只装有jdk1.4.2（可能需要设置path变量）,没有安装任何的IDE，也没有doc帮助文档，如果需要显示编码，只能通过windows文本编辑器（如果需要讲解代码，最好将代码放在PPT中，显示结果也放在PPT中）编写，在DOS环境下编译运行。

2、提问：
（1）你认为作为一个老师应该具备什么样的素质，其中最应该具备的是什么？
（2）你觉得老师和学生之间应该是一种什么样的关系？
（3）你觉得自己适合当老师吗？
（4）你以前从事什么工作，工作几年了？
（5）有过培训经历吗？具体是做什么培训？培训多长时间，培训什么人？
（6）有过项目经历吗？有多长时间？用什么做过项目开发？主要用什么开发？
（7）除了java，你还对什么编程语言擅长？VB？C？HTML？JSP？ASP？
（8）java高级部分熟不熟？
（9）数据库方面掌握如何？
（10）家在成都吗？

第二天面试内容：（由李虹校长在校长室进行面试，一位经理旁听）

1、你曾经在哪儿工作过？工作了多长时间？具体负责什么工作？
2、有过教课的经历吗？是教的什么课？
3、你有多长时间的项目开发经历？
4、做过几个项目？
5、XXX项目开发用了多长时间？你在项目中具体做哪一部分？项目构架是由谁来做的？
6、整个项目开发用了多长时间？最后的系统测试与联调你参加没有？
7、你现在是否在职？
8、你认为自己做老师有什么优势？
9、你对北大青鸟的教育理念了解吗？知道北大青鸟老师要带给学生什么吗？
10、除了java，你还对什么编程语言熟悉？有用C语言做过项目没有？
11、你对.Net熟不熟？能不能教.Net?


第一部分：选择题
QUESTION NO: 1
1、public class Test {
    public static void changeStr(String str){
        str="welcome";
    }
    public static void main(String[] args) {
        String str="1234";
        changeStr(str);
        System.out.println(str);
    }
}
Please write the output result ：

QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime.

QUESTION NO: 3
1. class A {
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }

QUESTION NO: 4
1. public class Outer{
2. public void someOuterMethod() {
3. // Line 3

4. }
5. public class Inner{}
6. public static void main( String[]argv ) {
7. Outer o = new Outer();
8. // Line 8
9. }
10. }
Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8//new Outer().new Inner()

QUESTION NO: 5
Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?
A. The encodeURL method of the HttpServletRequest interface.
B. The encodeURL method of the HttpServletResponse interface.
C. The rewriteURL method of the HttpServletRequest interface.
D. The rewriteURL method of the HttpServletResponse interface.

QUESTION NO: 6
Which two are equivalent? (Choose two)
A. <%= YoshiBean.size%>
B. <%= YoshiBean.getSize()%>
C. <%= YoshiBean.getProperty("size")%>
D. <jsp:getProperty id="YoshiBean" param="size"/>
E. <jsp:getProperty name="YoshiBean" param="size"/>
F. <jsp:getProperty id="YoshiBean" property="size"/>
G. <jsp:getProperty name="YoshiBean" property="size"/>

QUESTION NO: 7
Which of the following statements regarding the lifecycle of a session bean are correct?
1.  java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated.
2.  SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated.
3.  An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions.
4.  JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation.
5.  Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.

第二部分：概念题
1．    描述Struts体系结构？对应各个部分的开发工作主要包括哪些？

2．    XML包括哪些解释技术，区别是什么？

3．    JSP有哪些内置对象和动作？它们的作用分别是什么？

4、SQL问答题
SELECT * FROM TABLE
和
SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同？

5、SQL问答题
表结构：
1、    表名：g_cardapply
字段(字段名/类型/长度)：
g_applyno        varchar   8；//申请单号（关键字）
g_applydate     bigint     8；//申请日期
g_state        varchar     2；//申请状态
2、    表名：g_cardapplydetail
字段(字段名/类型/长度)：
g_applyno        varchar     8；//申请单号（关键字）
g_name        varchar     30；//申请人姓名
g_idcard        varchar     18；//申请人身份证号
g_state        varchar     2；//申请状态
其中，两个表的关联字段为申请单号。
题目：
1、    查询身份证号码为440401430103082的申请日期
2、    查询同一个身份证号码有两条以上记录的身份证号码及记录个数
3、    将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
4、    删除g_cardapplydetail表中所有姓李的记录


主要内容：JS、5道Orecle(大部分)

1.假如一个页面index.htm需要弹出小窗口win.htm，如何使弹出的小窗口不会重复打开,以及如何关闭这个小窗口。
2.JSP在服务器端的转发方式
3.在两个JSP页面上同时用一个变量，不能用URL参数加FORM进行传递，怎样实现
4.读程序，写出执行结果

public class Test{
String para1;
StringBuffer para2;

public void method1(String param){
    para1 = param.replace('j','l');
}

public void method2(StringBuffer param){
    para2 = param.append('c');
}

public static void main(String[] args){
    Test obj = new Test();
    obj.method1(new String("java"));
    obj.method2(new StringBuffer("java"));
    System.out.println(obj.para1);
    System.out.println(obj.para2.toString());
}

}

5.有两张表A、B，A是主表，B是丛表，删除A表记录在B表中不存在的。


1js里如何给select增加一个option
我写的是用javascript 然后写的具体写法网上很多
2写一个css针对表格table
我写的是用工具直接选的 具体语法已经记不清楚了
3写个onchange()事件
function change(){
alter("aaaa");
}
4jsp杂个调servlet
超连接直接调
5AJAX怎么实现
XmlHttpRequest
6JSP怎么调EJB
写的是没做过EJB项目
7假如你是公司的系统分析师傅 请设计软件缺陷管理系统的数据字典 画出E-R图
忘了  这个随便怎么写 只要反映1-n 1-1 n-n 都来点就是了
8 cachedrowset  jdbrowset webrowset 是什么 区别是？
没做出来 不晓得是什么
9 什么是游标 举个例
遍历数据表 jdbc中的结果集对象
10 举例java的重载 运算符的重载在java里的替代方法是什么
写的是swing中的窗体  后面的不晓得
11用java实现一个链表
写的是linkedList 肯定错了撒 应该是喊你自己写
12写出合并2个数组的算法
这个很简单吧
13final finally finalize
这个不说老撒
14谈谈反射
用类名取类 用方法名调用方法  框架技术都要用
15怎么获得session对象 指servlet里
request.getSession()
16 说说站内消息处理和上传文件的思路
上传我说的用第三方包 或者框架自带 站内消息处理我写的是用监听器
17如果停用了cookie 怎么传session
重写URL 他一般看这会问那struts怎么做的  我说的是别个做的好啊 都封装好了 不晓得对不对
这问题没思考过

记的到的就这些 还有些题目全是给你张表  让你写sql语句的  多复习下sql问题不大
其实估计我没写对的 但是大概样子像  面试的也只是大概看了看 说sql语句用多了就熟了
大概就这些


笔试：
1.x=1,y=2,z=3;计算：y+=z--/++x
  答：y=3
2.int array = new int[10];以下哪种引用是正确的：
A. array  B. arrar[]  C. array[0]   D. array[1]
  答：题错，int array = new int[10]改为 int[] array = new int[10];
3.输入3个1-99的整数，显示当中的最大数
4.解释和编译的区别:
  答：解释:程序运行时，取一条指令，将其换化为机器指令， 再执行这条机器指令。
      编译：程序运行时之前，将程序的把有代码编译为机器代码，再运行这个程序。

面试：
1.Collection和Collections的区别
答：Collection是集合类的上级接口，继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类，他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

2.Struts框架中，MVC的体现，Action是什么
在Struts框架中，M模型由实现业务逻辑的JavaBean或EJB组件构成，C控制器由ActionServlet和Action实现，视图由一组JSP文件构成。

3.Hibernate中的单向关系和双向关系映射的区别,什么时候使用单向，什么时候使用双向？
一对多关系分为单向一对多关系和双向一对多关系。
单向一对多关系只能通过主控方对被动方进行级联更新。
双向一对多关系实际上是“一对多”与“多对一”关联的组合，也就是说我们必须在主控方配置单向一对多关系的基础上，在被控方配置与其对应的多对一关系。
双向一对多的关系除了避免约束违例和提高性能的好处之外，还带来另外一个优点，由于建立了双向关联，我们可以在关联双方中任意一方，访问关联的另一方。
4.什么时候使用EJB，什么时候使用JavaBean
 在架构J2EE企业级应用的时候，要根据项目的大小及业务的复杂情况来决定到底使用还是不使用EJB技术。在以下情况下考虑使用EJB：
（1）程序需要具有可伸缩性
为了适应用户的需要，要在不同的服务器间部署组件，多个组件协同作业，来完成分布式的计算，以及在资源紧张的时候进行负载平衡。EJB组件不但可以实现这些功能，而且还能兼容不同系统不同平台，从而真正做到一次编写，到处运行。
具体见：J2EE教材P147

5.Aector和ArrayList的区别

6.什么时候使用无状态会话Bean,什么时候使用有状态会话Bean
答：教程P161
7.什么是会话，什么是请求
HTTP协议是无状态的不持续连接，会话是用于在连接之间不同页面之间的数据信息传递。
请求是用户向服务器发出的一个动作，动作完成则请求结束，它不会持续一段时间。
8.Servlet的生命周期是什么
J2EE教程：P75
9.请求转发和重定向的区别
精通Struts书的：P8
10.多线程的实现方式

11.什么时候使用Thread,什么时候使用Runable

12.Hibernate的缺点是什么

13.HashMap实现什么接口，继承什么类
实现Map、Serializable接口，继承java.util.AbstractMap类

14.LinkList和ArrayList的区别，如果是在集合的开头插入一个对象，
   使用哪种效率高些，在集合的末尾插入一个对象，使用哪种效率高些，为什么
ArrayList随机访问的效率要比LinkList快，但是LinkList顺序访问的效率则高过ArrayList，另外LinkList在对元素进行插入和删除操作时要比ArrayList的效率高，二者的最佳选择方法是：首先选用ArrayList当发现“向元素中插入和删除操作太多时”引发性能问题时，换用LinkList，当然处理固定元素还是选用数组.
LinkedList基于链表实现,插入元素的性能会比ArrayList高.
ArrayList基于数组实现,遍历的性能高于LinkedList.

15.门面模式在项目中的具体实现，为什么该设计模式，为什么不用一个接口，其它类
   实现该接口来代替门面模式。

16.你在项目中充当什么角色。
17.怎样建立CVS服务器
18.什么是远程方法调用
远程方法调用是通过网络调其它服务器上的组件就像调用本地组件一样.详见J2EE教程P6

19.怎样理解分布式开发

20.Struts框架中的titles框架的描述，为什么不用include
精通Struts书的P383


1、作用域public、private、protected以及不写时的区别？

2、定义float f = 3.4，是否正确，如果错误，怎么修改？

3、

父类：
package test;
public class FatherClass  {
    public FatherClass() {
        System.out.println("FatherClass Create");
    }
}

子类:
package test;
import test.FatherClass;
public class ChildClass extends FatherClass {
    public ChildClass() {
        System.out.println("ChildClass Create");
    }

    public static void main(String[] args) {
        FatherClass fc = new FatherClass();
        ChildClass cc = new ChildClass();
    }
}

输出结果：
FatherClass Create
FatherClass Create
ChildClass Create

4、JSP有哪些内置对象？作用分别是什么？

5、谈一谈Servlet的生命周期？

6、写一段JDBC连ORACLE的程序，并实现数据查询。

7、描述ORACLE中的锁定机制和读取机制。

8、请描述Struts - Oracle中大数据量下的分页解决方案。

9、你在项目中用到了XML的哪些方面？如何实现的？

10、EJB2.0有哪些内容？分别用在什么场合？EJB2.0和EJB1.1的区别？

11、MVC的各个部分都能用哪些技术来实现？如何实现？请详细描述Struts架构，Struts怎样在各个子模块中进行切换？

12、你在项目中用到了哪些设计模式？分别用在什么场合？


1、public、protected、private和不写限定符有什么区别？

2、ArrayList和Vector的区别？HashMap和HashTable的区别？

3、多线程有几种表示方法，都是什么？同步有几种实现方法，都是什么？

4、JSP有哪些内置对象？作用分别是什么？

5、WEB应用中，提交表单时，method分别设为GET、POST有什么区别？

6、说一说Servlet的生命周期？

7、写一段JDBC连MS SQL SERVER的程序，执行存储过程sp_getdata，参数varchar(20)，返回一记录集。

8、Class.forName的作用？为什么使用？

9、开发中都用到了哪些设计模式？用在什么场合？

10、谈谈final、finally、finalize的区别。

11、sleep()和wait()有什么区别？

12、数组有没有length()这个方法？String有没有length()这个方法？

13、列出几个常见的runtime exception。

14、abstract class和interface有什么区别？

15、启动一个线程是用run()还是用start()？

16、try{}里有一个return 语句，那么紧跟在这个try后的finally{}里的code会不会执行？

17、WEB应用中，你都使用哪些技术或方法来改善系统的性能？

18、在以往的java项目中，你是否经常使用一些开源项目，如有，请举例说明。


四川银海软件有限责任公司（通信公司）

1、工程的说明
2、开发工具
3、开发的应用服务器
4、视图层怎样访问底层数据
5、数据层怎样实现
6、控制层怎样访问底层数据
7、Struts的执行全流程
8、视图层的数据过滤


Error与Exception有什么区别？
谈谈final, finally, finalize的区别。
HashMap和Hashtable的区别。
什么是web容器
什么是EJB容器
名词解释
jndi：
jms:
JTA:
RMI
面向对象的特点？
MVC各个部分是由什么实现？怎样实现？
ejb的home接口和remote接口的作用？
ejb与javabean的区别？
String s = new String("xyz");创建了几个String Object?
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?
用1,1,1,1组成24用你想到的办法？
怎样用一个7升的瓶子和一个5升的瓶子准确的量出6升水?


1.哪些关键字用于构造方法:(a)final,(b) static,(c)synchronised,(d)native,(e),全都不行

2.
  system.out.println(a+' '+b);
  system.out.println(a+" "+b);
会输出结果还是编译不通过

3.哪个不正确？
   a).Map中的元素能复用
   b).Map一个键可映射多个值。

4.
public class static stuff{
static int x=10;
static {x+=5;}
public static void main(String[] args){
  System.out.println("x="+x);
}
  static {x/=5;}
}
a)x=10, b)x=15, c)x=3，d)编译错。

5.interface myInterface{
int x=0;
int Mymethod(int x);
}
class myImplementation implements myInterface{
   public int myMethod(int x){
   return super.x;
}
}
public class MyTest{
  public static void Main(String[] args){
     myInterface mi=new myImplementation();
     System.out.println(mi.myMethod(10));
  }
}
a)0, b)10, c)运行错，d)编译错。

6.如何强迫垃圾回收机制去回收一个对象

7.public class threadTest implements Runnable{
    private int x;
    public  int  getData(){
     synchronised(x){
       x=123;
       x=x+12;
     }
     return x;
    }
    public void run(){
    system.out.println(getData()+" ");

    }
    public static void main(String[] args){
     ThreadTest test=new TheadTest();
     Thread th1= new Thread(test);
     Thread th2= new Thread(test);
      th1.start();
      th2.start();
     }
  }
A)输出123 135,B)输出123和135交替出现不知先后,C)输出135 135,D)编译错

8.接口内部声明方法,错误的有
   A.boolean set Flag(Boolean[] test)
   B.public float getVol(float x)
   C.public void main(String[] args)
   D.public static void main(String[] args)
9.java中finalize()方法有什么?
10.jsp中有哪些内置对象,分别有什么作用
11.jsp中访问数据库信息,怎样防止SQL注入
12.简述Servlet生命周期
13.什么是MVC设计模式,struts是怎样实现MVC设计模式的?
14.什么是O/R mapping,有什么作用,对持久层的设计有什么意义
15.jsp开发技术/EJB开发技术的不同点
16.用javaScript 写一段代码来验证电子邮件的格式,要求使用正则表达式
17.java中的访问MY SQL/Server 的数据库连接代码
18.统计任一目录下,所以目录和文件总数,(包括子目录和文件),要求用递归并在必要的地方注释


1.int和Integer的区别
2.String 和 StringBuffer的区别
3.运行时异常和一般异常的区别
4.例举5个常用的包、类、接口
5.ArrayList、Aector和linkList的存储性能和特性
6.设计4个线程，其中两个线程每次对j+1，其它两个线程是j-1
[参考答案]
public class Thread3 implements Runnable{
    static int j;
    static int index;
    Thread thread = null;
    int i;

    public Thread3(int intI) {
        thread = new Thread(this,"T" + index++);
        i = intI;
        thread.start();
    }

    public void run(){

            j = j + i;
            System.out.println(Thread.currentThread().getName() + "为：" + j);
            try{
                Thread.sleep(50);
            } catch(InterruptedException e) {

           }
    }

    public static void main(String[] args){
        Thread3 a = new Thread3(1);
        Thread3 b = new Thread3(1);
        Thread3 c = new Thread3(-1);
        Thread3 d = new Thread3(-1);
    }
}

7.jsp的内置对象和方法
8.用套接字编程，写客户端和服务器编程，要求客户端发出信息，能够回显相同数据
9.说出Servlet的生命周期，Servlet和CGI的区别
10.EJB是基于哪些技术实现的，会话Bean和实体BEAN的区别，无状态和有状态会话BEAN的区别
11.EJB的生命周期，会话和实体BEAN，如何管理事务
12.连接池的工作机制
13.应用服务器有哪些
14.集合有哪些,集合的方法有哪些？
15.写一段JDBC代码，驱动是A，数据源是B，用户名C，密码D,表是T，查询所有数据
16. JSP如何分页
17.MVC各部分有哪些技术实现，是如何实现
18.Struts的配置文件有哪些，解释globalForwards、ActionMapping、MessageResource
19.简述ActionForm和Action在Struts中扮演的角色
20.在Weblogic中部署EJB需要哪些配置文件
21.如何设定Weblogic的热启动模式（开发模式）与产品发布模式
22.你常用的J2EE设计模式,谈谈对设计模式的看法


New Document

文件构成： Access数据库名为 MyData.Mdb， 里面建了一个名为count的表，表由两个 字段组成： ID和COUNT，表里有一条数据： ('count','100')。 文本文件名为 count.txt，里面随便写入一个数字。 静态页面名为Cnt.htm。 以上3个文件都放在同一目录下。 由于采用Access数据库，而它采用非标准SQL语法，所以要注意在表名 和字段名上需要加方括号： [] 下面是页面里的代码： 其中getCountFromDB方法是对Access数据库进行操作，getCountFromTxt 方法是对txt纯文本进行操作，这两个方法都在本地执行通过。 New Document


JScript 运行时错误
JScript 运行时错误是指当 JScript 脚本试图执行一个系统不能运行的动作时导致的错误。当正在运行脚本、计算变量表
达式、或者正在动态分配内存时出现 JScript 运行时错误时。

错误号 描述
5029 数组长度必须为一有限正整数
5030 必须赋给数组长度一个有限正数
5028 需要 Array 或 arguments 对象
5010 需要 Boolean
5003 不能给函数返回值赋值
5000 不能给 'this' 赋值
5006 需要 Date 对象
5015 需要 Enumerator 对象
5022 异常抛出，但无法抓住
5020 正则表达式中缺少“)”
5019 正则表达式中缺少“]”
5023 函数没有合法的 Prototype 对象
5002 需要 Function 对象
5008 非法赋值
5021 字符集范围无效
5014 需要 JScript 对象
5001 需要 Number 类型
5007 需要 Object 类型
5012 需要对象的成员
5016 需要正则表达式对象
5005 需要 String
5017 正则表达式语法错误
5026 小数部分的位数越界
5027 精度越界
5025 待解码的 URI 编码非法
5024 待解码的 URI 包含有非法字符
5009 未定义标识符
5018 未预期的限定符
5013 需要 VBArray

JScript 语法错误
JScript 语法错误是指当 JScript 语句违反了 JScript 脚本语言的一条或多条语法规则时导致的错误。JScript 语法错
误发生在程序编译阶段，在开始运行该程序之前。

错误号 描述
1019 在循环外不能有“break”
1020 在循环外不能有“continue”
1030 条件编译已关闭
1027 一条 “switch” 语句中只能有一个 “default”
1005 需要“(”
1006 需要“)”
1012 需要“/”
1003 需要“:”
1004 需要“;”
1032 需要“@”
1029 需要“@end”
1007 需要“]”
1008 需要“{”
1009 需要“}”
1011 需要“=”
1033 需要“catch”
1031 需要常数
1023 需要十六进制数
1010 需要标识符
1028 需要标识符、字符串或者数字
1024 需要“while”
1014 非法字符
1026 未找到标签
1025 标签定义重复
1018 函数外有 'return' 语句
1002 语法错误
1035 “Throw”的后面必须跟有一个表达式，且在同一源代码行上
1016 注释未结束
1015 字符串常数未结束


        最近遇到这样一个问题：前一段时间网页查询ORACLE表正常，可最近一直页面无法显示。打印出SQL放到PL/SQL Devoloper 执行，报“无法通过8（在表空间XXX中）扩展 temp 段”，还有一个页面，可以查询出记录，但无法统计数据！
       经过分析产生原因可能是：ORACLE临时段表空间不足，因为ORACLE总是尽量分配连续空间，一但没有足够的可分配空间或者分配不连续就会出现上述的现象。

    解决方法：知道由于ORACLE将表空间作为逻辑结构-单元，而表空间的物理结构是数据文件，数据文件在磁盘上物理地创建，表空间的所有对象也存在于磁盘上，为了给表空间增加空间，就必须增加数据文件。先查看一下指定表空间的可用空间，使用视图SYS.DBA_FREE_SPACE，视图中每条记录代表可用空间的碎片大小：

SQL>Select file_id,block_id,blocks,bytes from sys.dba_free_space where tablespace_name=‘XXX’;

    返回的信息可初步确定可用空间的最大块，看一下它是否小于错误信息中提到的尺寸，再查看一下缺省的表空间参数：

SQL>SELECT INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASE FROM SYS.DBA_TABLESPACES WHERE TABLESPACE_NAME='XXX';

    通过下面的SQL命令修改临时段表空间的缺省存储值：

SQL>ALTER TABLESPACE name DEFAULT STORAGE (INITIAL 64K NEXT 64K);

    适当增大缺省值的大小有可能解决出现的错误问题，也可以通过修改用户的临时表空间大小来解决这个问题：

SQL>ALTER USER username TEMPORARY TABLESPACE new_tablespace_name;

    使用ALTER TABLESPACE命令，一但完成，所增加的空间就可使用，无需退出数据库或使表空间脱机，但要注意，一旦添加了数据文件，就不能再删除它，若要删除，就要删除表空间。

       不喜欢用命令的朋友，也可以通过ORACLE工具 DBA STUDIO 找到出问题库的表空间，具体位置在“存储”->“表空间”->”XXX”,右拦“一般信息”，可以看到，数据文件使用情况，选择存储，可适当修改，“初使大小”，和“下一个大小”，问题可能会解决，然后选种“XXX”点鼠标右键，选择“添加数据文件”，适当修改“一般信息”的“文件大小”和“存储”的“数据文件已满后自动扩展”的“增量”大小，问题也可以解决！


PL/SQL单行函数和组函数详解
  函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类：
     单行函数

     组函数

    本文将讨论如何利用单行函数以及使用规则。

    SQL中的单行函数

    SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)

    单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。

    NULL和单行函数

    在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数：NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。

    下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2

    不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：
update empset salary=(salary+bonus)*1.1

    这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。
所以正确的语句是：
update empset salary=(salary+nvl(bonus,0)*1.1
单行字符串函数

    单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串

    ASCII()
    c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122

    CHR(＜i＞)[NCHAR_CS]
    i是一个数字，函数返回十进制表示的字符
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B

    CONCAT(,)
    c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda

    INITCAP()
    c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici

    INSTR(,[,＜i＞[,]])
    c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1.
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2

    INSTRB(,[,i[,j])
    与INSTR（）函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()

    LENGTH()
    c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。
select LENGTH('Ipso Facto') ergo from dualergo10

    LENGTHb()
    与LENGTH()一样，返回字节。

    lower()
    返回c的小写字符，经常出现在where子串中
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite

    LPAD(,＜i＞[,])
    c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe

    LTRIM(,)
    把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。
select LTRIM('Mississippi','Mis') from dualLTRppi

    RPAD(,＜i＞[,])
    在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似

    RTRIM(,)
    把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。

    REPLACE(,[,])
    c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。
select REPLACE('uptown','up','down') from dualREPLACEdowntown

    STBSTR(,＜i＞[,])
    c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。
select SUBSTR('Message',1,4) from dualSUBSMess

    SUBSTRB(,＜i＞[,])
    与SUBSTR大致相同，只是I,J是以字节计算。

    SOUNDEX()
    返回与c1发音相似的词
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250

    TRANSLATE(,,)
    将c1中与c2相同的字符以c3代替
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble

    TRIM([[]] from c3)
    将c3串中的第一个，最后一个，或者都删除。
select TRIM(' space padded ') trim from dual TRIMspace padded

    UPPER()
    返回c1的大写，常出现where子串中
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
单行数字函数

    单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。

    ABS()
    返回n的绝对值

    ACOS()
    反余玄函数，返回-1到1之间的数。n表示弧度
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0

    ASIN()
    反正玄函数，返回-1到1，n表示弧度

    ATAN()
    反正切函数，返回n的反正切值，n表示弧度。

    CEIL()
    返回大于或等于n的最小整数。

    COS()
    返回n的余玄值，n为弧度

    COSH()
    返回n的双曲余玄值，n 为数字。
select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847

    EXP()
    返回e的n次幂，e=2.71828183.

    FLOOR()
    返回小于等于N的最大整数。

    LN()
    返回N的自然对数，N必须大于0

    LOG(,)
    返回以n1为底n2的对数

    MOD()
    返回n1除以n2的余数，

    POWER(,)
    返回n1的n2次方

    ROUND(,)
    返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54

    SIGN()
    如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0.

    SIN（)
    返回n的正玄值,n为弧度。

    SINH()
    返回n的双曲正玄值,n为弧度。

    SQRT()
    返回n的平方根,n为弧度

    TAN（)
    返回n的正切值,n为弧度

    TANH()
    返回n的双曲正切值,n为弧度

    TRUNC(,)
    返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。

    单行日期函数

    单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。

    ADD_MONTHS(,＜i＞)
    返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。

    LAST_DAY()
    函数返回包含日期d的月份的最后一天

    MONTHS_BETWEEN(,)
    返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。

    NEW_TIME(,,)
    d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。

    NEXT_DAY(,)
    返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004

    ROUND([,])
    将日期d按照fmt指定的格式舍入，fmt为字符串。

    SYADATE
    函数没有参数，返回当前日期和时间。

    TRUNC([,])
    返回由fmt指定的单位的日期d.
单行转换函数

    单行转换函数用于操作多数据类型，在数据类型之间进行转换。

    CHARTORWID()
    c 使一个字符串，函数将c转换为RWID数据类型。
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')

    CONVERT(,[,])
    c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。

    HEXTORAW()
    x为16进制的字符串，函数将16进制的x转换为RAW数据类型。

    RAWTOHEX()
    x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。

    ROWIDTOCHAR()
    函数将ROWID数据类型转换为CHAR数据类型。

    TO_CHAR([[,)
    x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"

    TO_DATE([,[,）
    c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。

    TO_MULTI_BYTE()
    c表示一个字符串，函数将c的担子截字符转换成多字节字符。

    TO_NUMBER([,[,)
    c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。

    TO_SINGLE_BYTE()
    将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用

    其它单行函数

    BFILENAME(
,)
    dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。

    DECODE(,,[,,,[])
    x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。

    DUMP(,[,[,[,]]])
    x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。

    EMPTY_BLOB()
    该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。

    EMPTY_CLOB()
    该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。

    GREATEST()
    exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。

    LEAST()
    exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。

    UID
    该函数没有参数，返回唯一标示当前数据库用户的整数。

    USER
    返回当前用户的用户名

    USERENV()
    基于opt返回包含当前会话信息。opt的可选值为：

    ISDBA　 　　会话中SYSDBA脚色响应，返回TRUE
    SESSIONID 　返回审计会话标示符

        ENTRYID 　　返回可用的审计项标示符
    INSTANCE　　在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。
    LANGUAGE　　返回语言、地域、数据库设置的字符集。
    LANG　　　　返回语言名称的ISO缩写。
    TERMINAL　　为当前会话使用的终端或计算机返回操作系统的标示符。

    VSIZE()
    x是一个表达式。返回x内部表示的字节数。
SQL中的组函数

    组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.

    组（多行）函数

    与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。

    AVG([{DISYINCT|ALL}])
    返回数值的平均值。缺省设置为ALL.
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413

    COUNT({*|DISTINCT|ALL} )
    返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。

    MAX([{DISTINCT|ALL}])
    返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。

    MIN([{DISTINCT|ALL}])
    返回选择列表项目的最小值。

    STDDEV([{DISTINCT|ALL}])
    返回选者的列表项目的标准差，所谓标准差是方差的平方根。

    SUM([{DISTINCT|ALL}])
    返回选择列表项目的数值的总和。

    VARIANCE([{DISTINCT|ALL}])
    返回选择列表项目的统计方差。

    用GROUP BY给数据分组

    正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982

    在这个例子中，我们用state字段分类；如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982

    用HAVING子句限制分组数据

    现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

    这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;

    嵌套函数

    函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。


1、不安装Oracle客户连接Oracle 8的方法
请将以下文件拷贝到运行文件所在目录

一、ODBC动态库 :

ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll

二、建立EXTRA子目录，将MSVCRT.DLL文件拷贝到该子目录下

EXTRA\MSVCRT.DLL

三、ORACLE动态库及配置文件

Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora Sqltnsnt.dll CORE35.DLL

四、PB动态库

pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll

Oracle的客户端不安装让pb连上，我记得以前有帖子的，你可以搜索一下。
具体步骤。
(1).先在某机器上安装好客户端（最好安装在c盘）；
(2).复制此客户端oracle目录下的所有文件作为独立的oracle安装文件；
(3).搜索注册表，找到 HKey_Local_machine\software\oracle,把此项目及分支全部导出。
(4).打包好你的pb程序，并独立打包好oracle客户端和注册表导出文件。
(5).到干净的客户端，解开两个包，导入注册表文件，然后加入路径支持：
  path=%path%;"c:\Ora817\bin"
这样处理，应该没有问题，因为我就是这样快速处理了几十个机器。

若不想搞注册表，你可以在程序中自己写注册表，构成Oracle客户端必要的注册表支持，至于路径，手工添加应该不难。

至于Oracle客户端那些文件不需要，这个不好说，你可以把那些bin目录下的所有exe删除，Oracle Document删除(7x兆)

至于定义Oracle服务，找到 Ora817\net80\admin\TnsName.ora,参照格式，程序中生成一个也不麻烦。

=======================================================
2、在ORACLE中返回游标结果集

你需要写到一个包中：
create or replace package pag_cs_power as

    type c_Type is ref cursor;

FUNCTION FUN_CS_GETDICTLIST(
  v_DictIndex in  varchar2) return c_Type;

end pag_cs_power;

函数代码：

FUNCTION FUN_CS_GETDICTLIST(
  v_DictIndex in  varchar2) return c_Type
     as
        c_cursor            c_Type;
begin
   open c_cursor for
      select DICTID,DICTNAME FROM SYS_DICT WHERE DICTINDEX = v_DictIndex;
   return c_cursor;
end FUN_CS_GETDICTLIST;
----------------------------------------------------------------------
3、P4机器安装ORACLE

(1)、将ORACLE安装软件拷贝到硬盘。
(2)、将  硬盘目录文件\stage\Components\oracle.swd.jre\1.1.7.30/1
\DataFiles\Expanded\jre\win32\bin\symcjit.dll的文件改名为symcjit.old
(3).再运行SETUP.exe  文件进行安装。

-----------------------------------------------------------------------
4、单引号的插入问题

SQL> insert into a values('i''m good');　　　　　　 --两个''可以表示一个'

SQL> insert into a values('i'||chr(39)||'m good');　--chr(39)代表字符'

SQL> insert into a values('a'||'&'||'b');

-----------------------------------------------------------------------
5、全数据库的导入与导出

exp username/password full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

6、exp与imp的具体用法

exp username/password@mzbs_61 full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

exp mzbs/mzbs@mzbs_61 file = c:\zzzzzzz.dmp grants = y rows = y
imp mzbs/mzbs@mzbs_61 file = c:\zzzzzzz.dmp grants = y ignore=y  FULL=Y

(1)

exp参数：
关键字   说明（默认）
----------------------------------------------
USERID   用户名/口令
FULL   导出整个文件 (N)
BUFFER   数据缓冲区的大小
OWNER   所有者用户名列表
FILE   输出文件 (EXPDAT.DMP)
TABLES   表名列表
COMPRESS  导入一个范围 (Y)
RECORDLENGTH  IO 记录的长度
GRANTS   导出权限 (Y)
INCTYPE   增量导出类型
INDEXES   导出索引 (Y)
RECORD   跟踪增量导出 (Y)
ROWS   导出数据行 (Y)
PARFILE   参数文件名
CONSTRAINTS  导出限制 (Y)
CONSISTENT  交叉表一致性
LOG   屏幕输出的日志文件
STATISTICS  分析对象 (ESTIMATE)
DIRECT   直接路径 (N)
TRIGGERS  导出触发器 (Y)
FEEDBACK  显示每 x 行 (0) 的进度
FILESIZE  各转储文件的最大尺寸
QUERY   选定导出表子集的子句

imp参数：
关键字   说明（默认）
----------------------------------------------
USERID   用户名/口令
FULL   导入整个文件 (N)
BUFFER   数据缓冲区大小
FROMUSER  所有人用户名列表
FILE   输入文件 (EXPDAT.DMP)
TOUSER   用户名列表
SHOW   只列出文件内容 (N)
TABLES   表名列表
IGNORE   忽略创建错误 (N)
RECORDLENGTH  IO 记录的长度
GRANTS   导入权限 (Y)
INCTYPE   增量导入类型
INDEXES   导入索引 (Y)
COMMIT   提交数组插入 (N)
ROWS   导入数据行 (Y)
PARFILE   参数文件名
LOG   屏幕输出的日志文件
CONSTRAINTS  导入限制 (Y)
DESTROY   覆盖表空间数据文件 (N)
INDEXFILE  将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
ANALYZE   执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK  显示每 x 行 (0) 的进度
TOID_NOVALIDATE  跳过指定类型 id 的校验
FILESIZE  各转储文件的最大尺寸
RECALCULATE_STATISTICS 重新计算统计值 (N)

(2)

一、建立一个expdata.sql文件

USERID=RMTAFIS/3       这里写你的用户名和密码
BUFFER=32768
OWNER=RMTAFIS         这里写导出的用户
FILE=E:\Exp\RMTAFIS.DMP      导出的文件,可以是相对路径
ROWs=Y
GRANTS=Y
COMPRESS=Y
CONSISTENT=Y

二、建立一个expdata.bat
exp parfile=expdata.sql
如果是805
exp80 parfile=expdata.sql
双击expdata.bat就导出数据了

7、如果在like的变量中，是以‘%’开头的话，是不会使用index的。反之，不是以‘%‘开头，而又有相应的index，是会使用index的。具体可以用plain plan来看一下。

8、复制空表结构
   create table new_table
as select * from old_table where 1=2;
   复制表(含记录)
   create table new_table
as select * from old_table ;

9、把一个用户下的表导入到另一个用户下，但需要改名

先用exp导出所有的表；
用imp将导出的表导入到新用户；
在新用户下，执行
  select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'
    from tab
   where tabtype='TABLE';
将上面的查询结果保存到一个sql文件中，处理后执行就可以了。

10、审计步骤

 修改参数文件init.ora，参数audit_trail值为true；
 重新启动数据库；
 打开审计audit session; (audit session by username)
 执行登录操作；
 察看审计结果：
   select * from dba_audit_session;
   select * from sys.aud$;
   select * from dba_audit_trail;
   select * from dba_audit_exists;
 关于审计：

   为了使oracle8i的审计功能可用，必须在数据库参数文件中修改audit_trail初始参数，而这个修改并不支配oracle8i把生成的审计记录记入审计痕迹中，
由于状态，特权和模式对象已被修改，因而审计的默认值不可用，其参数应设置为none.下面列出了audit_trail 可用的参数

db_使数据库审计和全部直属审计记录到数据库审计的痕迹中
os_是数据库审计依据直属审计记入到操作系统的审计很集中
none_不可用

11、BFILE的用法

(1)、create or replace directory
BFILE_TEST
as
'/oracle/oradata/bfiles';

(2)、grant read on directory BFILE_TEST to SCOTT;

(3)、host ls -l /oracle/oradata/bfiles/1.TXT

(4)、connect SCOTT/TIGER
create table BFILES (ID number, TEXT bfile );

(5)、insert into BFILES values ( 1,
bfilename ( 'BFILE_TEST', '1.TXT' ) );

12、如何在Windows 2000下将Oracle完全卸载？

一、系统环境：
(1)、操作系统：Windows 2000 Server，机器内存128M
(2)、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版
(3)、安装路径：D:\ORACLE

二、卸载步骤：
(1)、开始－＞设置－＞控制面板－＞管理工具－＞服务
   停止所有Oracle服务。

(2)、开始－＞程序－＞Oracle - OraHome81－＞Oracle Installation Products－＞Universal Installer
   卸装所有Oracle产品

(3)、运行regedit，选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE，按del键删除这个入口。

(4)、运行regedit，选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，滚动这个列表，删除所有Oracle入口

(5)、从桌面上、STARTUP（启动）组、程序菜单中，删除所有有关Oracle的组和图标

(6)、重新启动计算机，重起后才能完全删除Oracle所在目录

(7)、删除与Oracle有关的文件，选择Oracle所在的缺省目录C:\Oracle，删除这个入口目录及所有子目录，

   并从Windows 2000目录（一般为C:\WINNT）下删除以下文件

   ORACLE.INI、oradim80.INI

(8)、WIN.INI文件中若有[ORACLE]的标记段，删除该段

--------------------------------------------------------------------
13、如何使用SQLPLUS和SVRMGRL运行脚本

(1)、用sqlplus调用：

c:\script.txt的内容
startup;

命令行：sqlplus internal/oracle @c:\script.txt

(2)、用svrmgrl调用：
c:\script.txt的内容

connect internal/oracle;
startup;

命令行：svrmgrl @c:\script.txt

--------------------------------------------------------------------
14、ORACLE的临时表

CREATE GLOBAL TEMPORARY TABLE TABLENAME (
   COL1  VARCHAR2(10),
   COL2  NUMBER
) ON COMMIT PRESERVE(DELETE) ROWS ;
这种临时表不占用表空间，而且不同的SESSION之间互相看不到对方的数据
在会话结束后表中的数据自动清空，如果选了DELETE ROWS，则在提交的时候即清空数据，PRESERVE则一直到会话结束

----------------

在Oracle8i中，可以创建以下两种临时表：
(1)会话特有的临时表
   CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
   ON COMMIT PRESERVE ROWS；

(2)事务特有的临时表
   CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
   ON COMMIT DELETE ROWS；
  CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的临时表虽然是存在的，但是你试一下insert 一条记录然后用别的连接登上去select，记录是空的，明白了吧，我把下面两句话再贴一下：
--ON COMMIT DELETE ROWS 说明临时表是事务指定，每次提交后ORACLE将截断表（删除全部行）
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定，当中断会话时ORACLE将截断表。
冲突的问题更本不用考虑.

临时表只是保存当前会话(session)用到的数据，数据只在事务或会话期间存在。

通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表，对于事务类型的临时表，
数据只是在事务期间存在，对于会话类型的临时表，数据在会话期间存在。

会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到
临时表的数据上。下面的语句控制行的存在性。

● ON COMMIT DELETE ROWS 表名行只是在事务期间可见
● ON COMMIT PRESERVE ROWS 表名行在整个会话期间可见

可以对临时表创建索引，视图，出发器，可以用export和import工具导入导出表的
定义，但是不能导出数据。表的定义对所有的会话可见。

例如：
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT PRESERVE ROWS;

CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT DELETE ROWS;

15、如何使用OEM
先启数据库服务，再启oracle manager服务。
否则重建档案资料库
如果还不行就把ORACLEHOME\NETWORK\sqlnet.ora文件的内容
     sqlnet.authentication_services=(NTS)
     改成sqlnet.authentication_services=(NONE)

登录 sysman/oem_temp

16、TNS:没有监听器的问题。

(1)查一下监听服务是否启动，
   如果没有启动，则运行lsnrctrl start。
(2)查看一下 LISTENER.ORA内监听的服务器名、服务器IP、数据库名是否正确。
(3)查看一下 TNSNAMES.ORA内服务器名、服务器IP、数据库名是否正确。

17、LINUX、UNIX下自动启动ORACLE服务

(1)

 !/bin/sh

# chkconfig: 345 51 49
# description: starts the oracle dabase deamons
#

ORA_HOME=/u01/app/oracle/product/8.1.7
ORA_OWNER=oracle
case "$1" in
'start')
echo -n "Starting Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
touch /var/lock/subsys/oracle8i
echo
;;

'stop')

echo -n "Shutting down Oracle8i: "
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
rm -f /var/lock/subsys/oracle8i
echo
;;

'restart')

echo -n "Restarting Oracle8i: "
$0 stop
$0 start
echo
;;

*)
echo "Usage: oracle8i { start | stop | restart }"
exit 1

esac
exit 0

我仿照su - $ORA_OWNER -c $ORA_HOME/bin/dbshut 的形式
添加su - $ORA_OWNER -c $ORA_HOME/bin/lsnrctl start
但是在系统启动的时候listener启动不了

(2)

/etc/rc.local
改成如下就可以了
touch /var/lock/subsys/local
#echo 2147483648 > /proc/sys/kernel/shmmax
echo -n "Starting Oracle Database:"
date +"%D %T %a"
su - oracle -c "lsnrctl start"
#su - oracle -c "sqlplus /nolog @startmaster.sql"
echo -n "Oracle Database Started:"
date +"%D %T %a"
-------------
第一个#是改共享内存大小的
第二个#是启动数据库的。

(3)
ftp://ftp.rpmfind.net/linux/rhcontrib/7.1/i386/oraclerun9i-1.0-1.i386.rpm

下载这个软件包并安装。

里面每个文件都有一些要修改的地方。配置完成之后，就可以在系统服务配置中找到它，选中它就可能以自启动了。

18、回滚段不够的处理方法

(1)、先使回滚段脱机一个，
如果不好用，则再脱机一个。直至好用。
   ALTER rollback segment rollbackname offline;
(2)、增加回滚段数据文件的大小
   alter database datafile 'datafile' resize 200M;

19、WINNT向WIN2000移植

不用EXP和IMP的

停掉数据库的服务后，可以做一个数据库的全备份。

在WIN2000上建一个同名的数据库，随便建，越小越好，可以缩短时间。
把WINNT下的数据库备份恢复到WIN2000的数据库上就可以了。但建库的目录
必须一样。（也可以不一样，但需要更改数据文件的连接）

我曾多次为用户这样移植数据，万无一失的。
注意：因为数据很重要，所以建议你先EXP备份一下。这是我们的习惯。

20、ORACLE SQL PLUS Worksheet乱码问题。

dbappscfg.properties，修改该文件即可解决上述问题。$ORACLE_HOME\sysman\config目录下，修改
# SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
为SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。

对于Windows操作系统，还需要修改一项
#SQLPLUS_SYSTEMROOT=c:\\WINNT40
为SQLPLUS_SYSTEMROOT=C:\\WINNT

如操作系统的主目录在C盘的Winnt下

对于后面一项的修改只对Windows操作系统进行，对UNIX操作系统则不需要。如果在Windows操作系统中不修改该项，在Oracle Enterprise Manager中，连接系统时，会提示如下的错误：
ORA-12560 TNS:protocol adapter error
或者
ORA-12545 Connect failed because target host or object does not exist
重新连接SQL PLUS Worksheet

21、DROP掉名字是小写的表(用双引号括起来)。

    drop table "tablename"
    select * from "tablename"

22、日期的显示格式
注意：SIMPLIFIED CHINESE(简体中文需要" "括起来)
      别的国家不用" " 例如：ENGLISH
select to_char(sysdate,'DAY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual;
------------
星期四
------------

23、一个从ORACLE中读表信息的存储过程

可以在vc下调用存储过程来实现
例子:
先修改init.ora
例如：
utl_file_dir=/usr    //路径为 oracle所在的盘:/usr
此过程将用户TEMP的P1过程的代码保存到ORACLE安装盘下/USR/TEXT.TXT中
create or replace procedure TEST
is
  file_handle utl_file.file_type;
  STOR_TEXT VARCHAR2(4000);
  N NUMBER;
I NUMBER;
 begin
I:=1;
   SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';
file_handle:=utl_file.fopen('/usr','test.txt','a');
WHILE I<=N LOOP
   SELECT TEXT  INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;
   I:=I+1;
   utl_file.put_line(file_handle,stor_text);
END LOOP;
   utl_file.fclose(file_handle);
commit;
end TEST;
/

24、关于修改ORACLE的列宽
(1)、不论如何都要备份数据。
(2)、如果没有数据，则可以修改宽度。比如NUMBER，CHAR，VARCHAR2
(3)、如果有数据，则可以增加宽度。比如NUMBER，CHAR，VARCHAR2
   注意：不可以减小宽度。
(4)、语法：alter talbe tablename modify columnname columntype not null;

25、如何查看用户的存储过程和函数

select name,text from user_source where name= Procedurename and type = 'PROCEDURE' order by line;

26、在批处理中自动启动ORACLE服务(win2000)

编一个批处理文件
net start OracleServiceSID
OracleServiceSID是ORACLE的实例名称

27、对行加锁时，只对tb1加锁

select tb1.r1 from tb1, tb2  where tb1.r2 = tb2.r2 and tb2.r1 = xxx for update of tb1.r1 nowait

28、得到列的信息

desc tablename
select cname from col where tname='TABLENAME';
select column_name from user_tab_columns where table_name='TABLENAME';
select column_name from ALL_tab_columns where table_name='TABLENAME';
select column_name from dba_tab_columns where table_name='TABLENAME';
select column_name from user_col_comments where table_name='TABLENAME';
select column_name from all_col_comments where table_name='TABLENAME';
select column_name from dba_col_comments where table_name='TABLENAME';

29、使触发器无效(login_on)

svrmgrl
connect internal/oracle
alter trigger login_on disable;

使触发器为无效alter trigger yourtriggername disable

如果是对于某一个表的所有的触发器：
alter table yourtablename disable all triggers

30、如在SQLPLUS中何调用存储过程和函数。

    call只能调用存储过程后面加上括号就可以了
    call 存储过程名();
    exec procedurename;(可以不加())
    调用函数用sql语句
    select 函数名(参数) from dual;

31、函数中如果调用DML语句就不可以调用SELECT语句

32、REDO LOG BUFFER 什么时候写到REDO LOGFILE中
    (1)、在COMMIT的时候
    (2)、重做日志缓冲区1/3满的时候
    (3)、重做日志缓冲区大于1M的时候
    (4)、它写信息必须是在数据写进程前调用
    (5)、一般CHECKPOINT在日志组切换的时候进行或者由初始化参数设定
         在CHECKPOINT的时候需要调用数据写进程

33、ORACLE的http server 把原有的WEB server冲掉，如何解决？

    (1).如果你原来的http server是用IIS等其他发布工具做的,那么可以在服务中停掉         oracle http server服务,并且改为手动启动。
    (2).如果原来的http server是用apache发布,则可以改变http.conf中的参数

34、关于创建重建查看索引

创建索引：
CREATE INDEX IND_NAME ON TABLE_NAME(COL1,COL2,...);

重建索引：
ALTER INDEX IND_NAME REBUILD;

查看索引：

SELECT * FROM USER_INDEXES WHERE INDEX_NAME='IND_NAME';

35、ORACLE如何查杀用户的进程

   一|根据用户的应用程序和SQL语句，在DBA STUDIO找到用户的SESSION并断开其连接

   二、

   (1)、要杀掉一个session应先应知道其sid和serial#,假设你已经知道。
   (2)、select paddr from v$session where sid=v_sid and serial#=v_serial#
   select spid from v$process where addr=paddr(以上语句所查出的);

   (3)、使用ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate;　试一试如不行转

   三、LINUX和UNIX下
   转到操作系统下执行:kill -9 spid (以上语句所查出的)

36、ORACLE中检查表是否被锁的语句

    SELECT A.OWNER,
         A.OBJECT_NAME,
         B.XIDUSN,
         B.XIDSLOT,
         B.XIDSQN,
         B.SESSION_ID,
         B.ORACLE_USERNAME,
         B.OS_USER_NAME,
         B.PROCESS,
         B.LOCKED_MODE,
         C.MACHINE,
         C.STATUS,
         C.SERVER,
         C.SID,
         C.SERIAL#,
         C.PROGRAM
    FROM ALL_OBJECTS A,
         V$LOCKED_OBJECT B,
         SYS.GV_$SESSION C
   WHERE ( A.OBJECT_ID = B.OBJECT_ID )
     AND (B.PROCESS = C.PROCESS )
   ORDER BY 1,2
杀掉：alter system kill session 'sid, serial#'
37、ORACLE的登录问题，用户名和密码。

可以直接输入：
    internal/oracle@serivce_name
    sys/change_on_install@serivce_name
    system/manager@serivce_name
    scott/tiger@serivce_name
注意：
9i中没有internal/oracle
如果选择典型安装则有　scott用户
如果自定义可以不安装 　scott用户
如果是本机则可以省略@serivce_name

oem:（ORACLE ENTERPRISE MANAGER）
sysman/oem_temp

38、修改表的列名

Oracle9i:
alter table xxx rename column xx to yy;

Oracle8i & lower version
connect sys/passed;
update col$ set name=xx where obj#=对象id and name = 字段
(一般不要这样用，会造成意想不到的结果)
注：最好是删除再建立新的列

39、把用户模式对象所在的表空间移到新的表空间
(1). create the new tablesapce
(2). alter user test default tablespace test_data;
(3). alter user test quota unlimited on test_data;
(4). alter table the_table_name move tablespace test_data;
    生成脚本：
    select 'alter table'||tname||' move tablespace test_date;'
    from tab
   where tabtype='TABLE'
(5). rebuild the indexes;

40、使用OEM备份或者EXP的步骤
 WIN2000下：

(1). 控制面板――>管理工具―― >计算机管理――>本地用户和组――>用户――>新建用户sys和sysman(sys和sysman 的帐号要和登陆数据库的帐号相同)；
(2)．控制面板――>管理工具―― >本地安全策略――>本地策略――>用户权利指派――>
作为批处理作业登陆――>添加sys和sysman两个帐号。
(3)．使用Enterprise Manager配置辅助工具
开始→程序→Oracle - OraHome81→Enterprise Manager→Configuration Assistant
a、使用Configuration Assistant工具来创建一个新的资料档案库。

(4)．控制面板――>管理工具―― > 服务，查看OracleOraHome81ManagementServer是否启动，如果没有启动，则手动启动该服务。
(5)．以sysman/oem_temp（default）登陆DBA Studio
（第二个选项：登陆到Oracle Management Server）,立即修改密码为你刚才在NT下建的用户sysman的密码。
(6)． 以sysman/ *** (bluesky) 从开始→程序→Oracle - OraHome81→Console 登陆到 控制台。
在 系统→首选项→首选身份证明（我的首选身份设置如下：）
DEFAULT节点：name:sysman
DEFAULT数据库：name:sys
(7)． 在搜索/添加结点后，以sysman/ *** 登陆到该结点，以sys/ *** as sysdba登陆数据库（也就是在首选身份设置的结果）。
(8)． 在工具→备份管理→向导→预定义备份策略（自定义备份策略）→提交备份计划
(9)．从开始→程序→Oracle - OraHome81→Console 登陆到 控制台，查看活动（历史记录）可以看到你的备份是否成功，如果不成功，可以点击备份看明细。（我第一次也没成功，后来我修改系统的临时目录C:\WINNT\Temp→c:\temp\systmp,重新启动机器就ok了）

41、如何修改INTERNAL的口令

以下是oracle8的8i你可以仿照来做

(1)、进入DOS下

(2)、默认internal密码文件在c:\orant\database下，是隐藏属性，文件名称与数据库实例名有关

   如默认ORACLE实例名为ORCL，则internal密码文件名为pwdorcl.ora

(3)、建立新的internal密码文件，起个新名字为pwdora8.ora

   orapwd80 file=pwdora8.ora password=B entries=5　　　　　--注：password项一定要用大写，并且不要用单引号

(4)、拷贝pwdora8.ora文件到c:\orant\database目录下

(5)、运行regedit，修改口令文件指向

(6)、找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE项

   定位ORA_ORCL_PWFILE子项，改变其值为c:\orant\database\pwdora8.ora

(7)、关闭ORACLE数据库，重新启动

(8)、进入svrmgr30服务程序，测试internal密码是否更改成功

42、凭证检索失败的决绝方法。

原因: 由于Oracle不能应用OS认证而导致凭证检索失败

解决办法:

    (1).打开network/admin下的sqlnet.ora
        修改SQLNET.AUTHENTICATION _SERVICES=(NONE)。

    (2).启动Net8 configuration assistant-->选第三项本地网络服务名配置
    -->删除...(删除原来的本地网络服务名)

    (3).重复第二步
    -->添加.. (新建本地网络服务名)

    (4).restart oracle

    注意：NTS是WinNT的认证方式

43、命令行编译存储过程

    ALTER PROCEDURE procedure_name COMPILE;

44、关于如何建立数据库链接(DBlink)

可以通过建立客户机数据库网络服务名的办法,将服务器的名字或是IP地址设置为你需要连接的那个机器就行

如果你要在一个应用中连接它,现在做好上步工作,然后按如下处理

建立数据库连接
CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';
DBaseLinkName  是建立的数据连接名称
UserName       是可以连接到的用户名
Password        是可以连接到的用户的密码
NetServiceName  是可以连接的数据库网络服务名或是数据库名

查询建立数据连接的表实例
Select * From TableName@ DBaseLinkName;

注意：如果在CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';中NetServiceName  是数据库名修改init.ora中：global_names = true
否则global_names = false
init.ora中：global_names = false

45、Object Browser7.0中文版的破解方法

到OBJECT BROWSER的目录里，找到DeIsL1.isu文件，用记事本打开，看到的是乱码吧？没关系，将Stirling Technologies ,Inc 这个字符串前面的乱码去掉（如果有的话），让后在Stirling之前加一个空格（一定要加的），保存，退出，重新运行一下看看，虽然还有提示输入验证信息，但是不用管他，直接确定就行。是不是可以用了呢？保证好使。

46、错误号ORA-01536:space quota exceeded for table space 'ALCATEL'的解决办法

     三个解决办法，任你选择：
    (1) alter user USERNAME quota 100M on TABLESPACENAME;
    (2) alter user USERNAME quota unlimited on TABLESPACENAME;
    (3) grant unlimited tablespace to USERNAME;

47、如何在Oracle中捕获到SQL语句的全部操作内容

       SELECT osuser, username, sql_text from v$session a, v$sqltext b
       where a.sql_address =b.address order by address, piece;

48、ORACLE中如何实现自增字段：

(1)第一种方法
ORACLE一般的做法是同时使用序列和触发器来生成一个自增字段.
CREATE SEQUENCE SEQname
 INCREMENT BY  1
 START WITH  1
 MAXVALUE  99999999
/
CREATE TRIGGER TRGname
BEFORE  INSERT  ON table_name
REFERENCING
 NEW AS :NEW
FOR EACH ROW
Begin
   SELECT SEQname.NEXTVAL
     INTO :NEW.FIELDname
     FROM DUAL;
End;

(2)第二种方法：
CREATE OR REPLACE TRIGGER TR1
  BEFORE INSERT ON temp_table
  FOR EACH ROW
declare
com_num NUMBER;
BEGIN
SELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE;
:NEW.ID:=COM_NUM+1;
END TR1;

49、job的使用：

修改initsid.ora参数
job_queue_processes = 4            8i,9i  (允许同时执行的JOB数)
job_queue_interval = 10            8i
job_queue_keep_connections=true       8i

DBMS_JOB.SUBMIT(:jobno,//job号
                'your_procedure;',//要执行的过程
                trunc(sysdate)+1/24,//下次执行时间
                'trunc(sysdate)+1/24+1'//每次间隔时间
               );
删除job:dbms_job.remove(jobno);
修改要执行的操作:dbms_job.what(jobno,what);
修改下次执行时间：dbms_job.next_date(job,next_date);
修改间隔时间：dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);

注意：修改后一定要COMMIT；

例子：
VARIABLE jobno number;
begin
      DBMS_JOB.SUBMIT(:jobno,
              'Procdemo;',//Procdemo为过程名称
               SYSDATE, 'SYSDATE + 1/720');
         commit;
end;

50、如何配置mts

修改初始化参数文件
增加以下内容：
mts_dispatchers = "(protocol=TCP)(disp=2)(con=1000)"
mts_max_dispatchers = 50
mts_servers = 20
mts_max_servers = 50

51、取出一个表的最后一条记录

select * from (select rownum id,tname.* from tname) a where a.id=(select count(*) from a);

52、重做日志(Redolog)被删掉，通过什么方法才能恢复！

先mount数据库，然后再目录下建同名文件redo01.log、redo02.log、redo03.log
然后执行alter databse clear logfile group n
对于current的group，执行alter databse clear unarchived logfile group n
然后，再open，就ok了

53、Oracle常见服务

几个主要的：

OracleOraHome81TNSListener     监听服务
OracleServiceSID               ORACLE服务
OracleOraHome81Agent           智能代理服务
OracleOraHome81CMan            连接管理服务
OracleOraHome81HTTPServer      APACHE WEB 服务
OracleOraHome81ManagementServer ORACLE 企业管理器服务
OracleOraHome81Names            ORACLE命名服务

剩下的也不常用。

54、ORACLE的热备份

在不关闭数据库的时候进行ORACLE的备份。

原理停复杂的，你去找本书看看吧。

举个简单的例子：备份表空间USERS

ALTER TABLESPACE USERS BEGIN BACKUP
COPY USERS TABLESPACE 的数据文件到备份目录
ALTER TABLESPACE USERS END BACKUP

55、导致索引不起作用的解决办法

你的问题我刚处理过，是由optimizer_mode参数引起的，该参数的默认值为choose，即为如表有statis则查询走基于cost的方式，否则走基于rule的方式，因些你可以有以下几个解决方法。
(1)、简单的在init<sid>.ora中设optimizer_mode=rule,重起数据库。
(2)、使用analyze table table_name(索引基表) delete statistics;
(3)、最后一个万能办法,将表和索引drop掉，重建。

56、关于数据库进程的问题。

(1).查看相关进程在数据库中的会话
Select a.sid,a.serial#,a.program, a.status ,
substr(a.machine,1,20), a.terminal,b.spid
from v$session a, v$process b
where a.paddr=b.addr
and b.spid = &spid;

(2).查看数据库中被锁住的对象和相关会话
select a.sid,a.serial#,a.username,a.program,
c.owner, c.object_name
from v$session a, v$locked_object b, all_objects c
where a.sid=b.session_id and
c.object_id = b.object_id;

(3).查看相关会话正在执行的SQL
select sql_text from v$sqlarea where address =
( select sql_address from v$session where sid = &sid );

57、查看IP地址
select SYS_CONTEXT('USERENV','IP_ADDRESS')  from dual;

58、运行SQLPLUS时不用输入用户名和密码，进入之后使用CONNECT

        SQLPLUS /NOLOG
        SQL>CONNECT SCOTT/TIGER

59、查看当前会话

        userenv() 函数

        select userenv('language') from dual 字符集
        select userenv('isdba') from dual 是否DBA
        select userenv('sessionid') from dual sessionid
        select userenv('TERMINAL') from dual 客户端名字
        select userenv('INSTANCE') from dual 实例数

        SYS_CONTEXT() 函数

        select SYS_CONTEXT('USERENV','CURRENT_SCHEMA')  from dual;  当前模式
        select SYS_CONTEXT('USERENV','CURRENT_SCHEMAID')  from dual;  当前模式ID
        select SYS_CONTEXT('USERENV','CURRENT_USER')  from dual; 当前用户
        select SYS_CONTEXT('USERENV','DB_NAME')  from dual; 数据库
        select SYS_CONTEXT('USERENV','HOST')  from dual; 主机
        ..........

60、删除重复列的方法

(1) DELETE FROM table_name A WHERE ROWID > (
       SELECT min(rowid) FROM table_name B
        WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
     drop table1;
     rename table2 to table1;
(3) Delete from mytable where rowid not in(
       select max(rowid) from mytable
       group by column_name );
(4) delete from mytable t1
      where  exists (select 'x' from my_table t2
                   where t2.key_value1 = t1.key_value1
                     and t2.key_value2 = t1.key_value2
                     ...
                     and t2.rowid > t1.rowid);

61、ORA-12571: TNS:packet writer failure（包写入程序失败）

   (1) 这个错误在客户端遇到过，通常重新连接一下服务器就好了。
   服务器重新启动的时候，在client也会遇到该错误。
   这个错误你是在server还是client上遇到的？最常用的办法就是加上跟踪，查看一下    跟踪记录，分析分析错误的原因。
   网络问题也会出现该错误，比如网络路由没有配置好。
   (2) 安装的杀毒软件导致的
   (3) 服务器端的IP是否被改动
   (4) 最后不行的话，重新创建监听器

62、ORACLE服务不能自动启动的解决办法

   把ORACLEHOME\network\ADMIN\sqlnet.ora
   文件中的 sqlnet.authentication_service=(nts)
   注释掉就可以了

63、不完全的时间点恢复

shutdown immediate
copy 备份文件到需要恢复的目录下
startup mount
recover database until time '2002-12-26 09:00:00'

alter database open resetlogs

自己仔细检查一下，不会发生这样的问题的。

64、oracle如何设置查询超时

select  /*+  timeout  30*/  *  from  veryLargeTable

65、修改字符集

(1)、ALTER DATABAE CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK ;

(2)、update props$ set value$='ZHS16CGB231280'
where name='NLS_CHARACTERSET';
update props$ set value$='ZHS16CGB231280'
where  name='NLS_NCHAR_CHARACTERSET';

建议不使用(2)

注意：
(1)、执行ALTER DATABASE CHARACTER SET必须有SYSDBA权限，并且在STARTUP RESTRICT模式下执行
(2)、原字符集必须是目标字符集的一个真子集（就是浪子所说的只能从WE8ISO8859P1转到ZHS16GBK的原因）
(3)、CLOB字段装换可能有问题，建议在转换以前把有CLOB字段的表导出后DROP，转换以后再导回
(4)、该转换不可逆，所以在做这个操作以前建议做数据库全备份

66、修改数据库名字

(1)、启动svrmgrl,以文本方式备份控制文件
 oracle>svrmgrl
 svrmgrl>connect internal
 svrmgrl>alter system backup controlfile to trace
(2)、编辑产生的跟踪文件，在udump目录下
 改CREATE CONTROLFILE REUSE DATABASE "CTC" NORESETLOGS ARCHIVELOG
 中的REUSE为SET
 然后把create controlfile这段语句拷出
(3)、正常宕库,后启动到nomount下
 svrmgrl>shutdown immediate
 svrmgrl>startup nomount
(4)、执行create controlfile那段语句
(5)、打开数据库
  svrmgrl>alter database open
  如提示用resetlogs选项则使用
  svrmgrl>alter database open resetlogs
(8)、相应修改初始化参数

67、rownum的用法

   select * from (select t.*,rownum id from dept t)
   where id between 1 and 20

68、oracle的内部参数

   SELECT a.ksppinm NAME,
       b.ksppstdf default_val,
       a.ksppdesc DESCRIPTION
  FROM x$ksppi a,
       x$ksppcv b
 WHERE a.indx=b.indx
   AND substr(a.ksppinm,1,1)='_'
 ORDER BY a.ksppinm

69、9i安装时报areasqueries错误的解决办法
    包括IAS 和 IDS

    把安装源文件目录全部改为英文字母或数字
    注意：不能是中文的路径

70、我如何知道一个表空间还有多少可以用

(1)、
SELECT upper(f.tablespace_name) 表空间名,
       d.Tot_grootte_Mb "表空间大小(M)",
       d.Tot_grootte_Mb - f.total_bytes "已使用空间(M)",
       round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) "使用比",
       f.total_bytes "空闲空间(M)",
       f.max_bytes "最大块(M)"
 FROM
    (SELECT tablespace_name,
            round(SUM(bytes)/(1024*1024),2) total_bytes,
            round(MAX(bytes)/(1024*1024),2) max_bytes
      FROM sys.dba_free_space
     GROUP BY tablespace_name) f,
    (SELECT dd.tablespace_name, round(SUM(dd.bytes)/(1024*1024),2) Tot_grootte_Mb
      FROM   sys.dba_data_files dd
      GROUP BY dd.tablespace_name) d
WHERE d.tablespace_name = f.tablespace_name
ORDER BY 4 DESC
(2)、select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space
group by tablespace_name

71、creck pl/sql developer 的方法

(1)、安装pl/sql developer
(2)、用UltraEdit将程序PLSQLDev.exe打开
(3)、将UltraEdit设置为16进制模式
(4)、查找串：BA 1E 00 00 00 2B D0
   修改：2B D0  为：4A 90
(5)、存盘退出
(6)、运行PLSQLDev.exe，如果提示你还有29天的时间可用，那就恭喜你了！

72、使索引无效

ALTER INDEX idx UNUSABLE;
ALTER INDEX idx_acctno DISABLE;(only to a function based index)

73、在SQLPLUS中给指定用户进行 set autotrace on/off

    以SCOTT用户为例：

    SQL>CONNECT scott/tiger

    connected.

    SQL>@$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL

    Table created.

    SQL>CONNECT / AS SYSDBA

    connected.

    SQL>@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL

    drop role plustrace;
    Role dropped.
    create role plustrace;
    Role created.
    .
    grant plustrace to dba with admin option;
    Grant succeeded.

    SQL>GRANT PLUSTRACE TO SCOTT;

    Grant succeeded.

    SQL>CONNECT SCOTT/TIGER

    connected.

    SQL>set autotrace on

    SQL>

74、关于约束的四种状态

Disabled novalidate：当约束使不能时，约束的规则不能强制在列
       （包含在约束中）的数据之上。但约束的定义保存在数据字典中。
       在执行数据仓库卷起（rollup）或装载且要加快装载过程时该方式
       是有用的。
Enabled novalidate：是能无效，该状态的表可以包含非法
      的数据，但不可能加入新的非法数据。
Enabled validate：使能有效，一个使能的约束是强制的，表的数据检查
      有效

75、在SQLPLUS中调用存储过程

SET SERVEROUTPUT ON
declare
 out_param varchar2(100);
begin
 your_proc(1,out_param);
 dbms_output.put_line(out_param);
end;
/
SET SERVEROUTPUT OFF

75、生成系统表和存储过程的三个文件。

     cat*.sql
     dbms*.sql
     utl*.sql

76、JOB中日期的使用

每个月1号:
last_day(sysdate)+1
每个季度的第一天:
to_date(decode(to_char(sysdate,'q'),'1',to_char(sysdate,'yyyy')||'0101',
    '2',to_char(sysdate,'yyyy')||'0401','3',to_char(sysdate,'yyyy')||'0701',
    '4',to_char(sysdate,'yyyy')||'1001'),'yyyymmdd')
每天:
sysdate+1
每个星期几:
decode(to_char(sysdate,'w'),'1',sysdate+7,
to_char(sysdate,'w'),'2',sysdate+6,to_char(sysdate,'w'),'3',sysdate+5,
to_char(sysdate,'w'),'4',sysdate+4,to_char(sysdate,'w'),'5',sysdate+3,
to_char(sysdate,'w'),'6',sysdate+2,to_char(sysdate,'w'),'7',sysdate+1)

每个星期x下午三点：interval(21, 'next_day(trunc(sysdate),x+1)+15/24');

每个季度的第一个星期x：
interval(21, 'next_day(trunc(sysdate,''Q''),3),5)');

77、使用execute immediate 的问题

8i以上才支持execute immediate
8.05只能用dbms_sql
最好使用execute immediate

78、ORACLE9i中删除表空间中数据文件的方法

drop tablespace tbsname including contents

79、找出串中的数字

SELECT TRANSLATE('2KRW229',
   '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')
   "Translate example"
     FROM DUAL
/

2229

--全是数字的:
select * from 你的表 where translate(你的列,'0123456789',' ')='';

select * from 你的表 where trim(ltrim(rtrim(replace(col_name,'0123456789',' ')))) is null

80、分析表
analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;

81、表空间管理和用户管理

--查看表空间和数据文件

select file_name,tablespace_name,autoextensible from dba_data_files;

--数据表空间

CREATE TABLESPACE USER_DATA
    LOGGING
    DATAFILE 'D:\ORACLE\ORADATA\ORCL\test.DBF' SIZE 50m REUSE ,
             'c:\USERS01112.DBF' SIZE 50m REUSE
    AUTOEXTEND
    ON NEXT  1280K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL

--临时表空间

CREATE TEMPORARY
    TABLESPACE  USER_DATA_TEMP TEMPFILE 'D:\TEMP0111.DBF'
    SIZE 50M REUSE AUTOEXTEND
    ON NEXT  1024K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL UNIFORM
    SIZE 1024K

--增加数据文件

ALTER TABLESPACE  USER_DATA
  ADD DATAFILE 'c:\USERS01113.DBF' SIZE 50M;

ALTER TABLESPACE USER_DATA
  ADD DATAFILE 'c:\USERS01114.DBF'  SIZE 50M
  AUTOEXTEND ON
;

--删除表空间

DROP TABLESPACE USER_DATA INCLUDING CONTENTS;

--修改数据文件大小
 ALTER DATABASE
 DATAFILE 'c:\USERS01113.DBF' RESIZE 40M;

--创建用户、赋予权限

CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY  USER_DATA
    DEFAULT
    TABLESPACE USER_DATA  TEMPORARY
    TABLESPACE USER_DATA  ACCOUNT UNLOCK;

GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;

--把表移到另一个表空间
ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;

--创建索引

CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME);

CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;

--重新建立索引

ALTER INDEX INDEXNAME REBUILD TABLESPACE  TABLESPACE;

--创建表

CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);

--建表的索引存储分配

CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX  STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;

--建立主键

ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)

--使约束无效

ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT CONSTRANAME;

ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT CONSTRANAME;

--删除约束

ALTER TABLE TABLENAME  DROP CONSTRAINT constraintname;

DROP TABLE TABLENAEM CASCADE CONSTRAINTS;(删除表后将所用的外键删除)

--给表增加列

ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;

--给列增加缺省值

ALTER TABLE TABLENAME
MODIFY COLUMNNAME  DEFAULT(VALUE) NOT NULL;

--给表增加外键
 ALTER TABLE  TABLENAME
 ADD CONSTRAINT  CONSTRAINTNAME
 FOREIGN KEY(COLUMN) REFERENCES TABLE1NAME(COLUMN1);

1、分析表
analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;

2、表空间管理和用户管理

--查看表空间和数据文件

select file_name,tablespace_name,autoextensible from dba_data_files;

--数据表空间

CREATE TABLESPACE USER_DATA
    LOGGING
    DATAFILE 'D:\ORACLE\ORADATA\ORCL\test.DBF' SIZE 50m REUSE ,
             'c:\USERS01112.DBF' SIZE 50m REUSE
    AUTOEXTEND
    ON NEXT  1280K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL

--修改表空间数据文件的路径

ALTER TABLESPACE app_data
  RENAME
    DATAFILE '/DISK4/app_data_01.dbf'
    TO   '/DISK5/app_data_01.dbf';

ALTER DATABASE
  RENAME FILE '/DISK1/system_01.dbf'
    TO '/DISK2/system_01.dbf';

--临时表空间

CREATE TEMPORARY
    TABLESPACE  USER_DATA_TEMP TEMPFILE 'D:\TEMP0111.DBF'
    SIZE 50M REUSE AUTOEXTEND
    ON NEXT  1024K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL UNIFORM
    SIZE 1024K

--增加数据文件

ALTER TABLESPACE  USER_DATA
  ADD DATAFILE 'c:\USERS01113.DBF' SIZE 50M;

ALTER TABLESPACE USER_DATA
  ADD DATAFILE 'c:\USERS01114.DBF'  SIZE 50M
  AUTOEXTEND ON
;

--删除表空间

DROP TABLESPACE USER_DATA INCLUDING CONTENTS;

--修改表空间的存储参数

ALTER TABLESPACE tablespacename
  MINIMUM EXTENT 2M;

ALTER TABLESPACE tablespacename
  DEFAULT STORAGE (
    INITIAL 2M
    NEXT 2M
    MAXEXTENTS 999 );

--表空间联机/脱机/只读

ALTER TABLESPACE tablespacename OFFLINE/ONLINE/READ ONLY;

--修改数据文件大小
 ALTER DATABASE
 DATAFILE 'c:\USERS01113.DBF' RESIZE 40M;

--创建用户、赋予权限

CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY  USER_DATA
    DEFAULT
    TABLESPACE USER_DATA  TEMPORARY
    TABLESPACE USER_DATA  ACCOUNT UNLOCK;

GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;

3、表的管理

--创建表

CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);

--建表的索引存储分配

CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX  STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;

--修改表的存储分配

ALTER TABLE tablename
PCTFREE 30
PCTUSED 50
STORAGE(NEXT 500K
MINEXTENTS 2
MAXEXTENTS 100);

ALTER TABLE tablename
ALLOCATE EXTENT(SIZE 500K
DATAFILE '/DISK3/DATA01.DBF');

--把表移到另一个表空间

ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;

--回收空闲的空间(回收到High-water mark)
  全部回收需要TRUNCATE TABLE tablename

ALTER TABLE tablename
DEALLOCATE UNUSED;

--删除表(连同所用constraint)

DROP TABLE tablename
CASCADE CONSTRAINTS;

--给表增加列

ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;

--删除表中的列

ALTER TABLE tablename
DROP COLUMN columnname;

ALTER TABLE tablename
DROP COLUMN columnname
CASCADE CONSTRAINTS CHECKPOINT 1000;

--标记列不可用

ALTER TABLE tablename
SET UNUSED COLUMN columnname
CASCADE CONSTRAINTS;

--删除标记为不可用的列

ALTER TABLE tablename
DROP UNUSED COLUMNS CHECKPOINT 1000;

--继续删除列选项

ALTER TABLE tablename
DROP COLUMNS CONTINUE CHECKPOINT 1000;

--把表放到BUFFER_POOL中去

ALTER TABLE tablename
  STORAGE (BUFFER_POOL RECYCLE);

--避免动态分配EXTENT

ALTER TABLE tablename ALLOCATE EXTENT;

--把表放到CACHE中去

ALTER TABLE tablename ALLOCATE CACHE/NOCACHE;

4、索引管理

--创建索引

CREATE INDEX indexname ON TABLENAME(COLUMNNAME);

CREATE INDEX indexname ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;

--重新建立索引

ALTER INDEX indexname REBUILD TABLESPACE  TABLESPACE;

--索引分配参数

ALTER INDEX indexname
STORAGE(NEXT 400K
 MAXEXTENTS 100);

--释放索引空间

ALTER INDEX indexname
ALLOCATE EXTENT (SIZE 200K
DATAFILE '/DISK6/indx01.dbf');

ALTER INDEX indexname
DEALLOCATE UNUSED;

--重新整理索引表空间碎片

ALTER INDEX indexname COALESCE;

--删除索引

DROP INDEX indexname

--把索引放到BUFFER_POOL中

ALTER INDEX cust_name_idx
  REBUILD
  STORAGE (BUFFER_POOL KEEP);

5、约束管理

--建立主键

ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)

--使约束无效

ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT constraintname;

ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT constraintname;

--删除约束

ALTER TABLE tablename  DROP CONSTRAINT constraintname;

DROP TABLE tablename CASCADE CONSTRAINTS;(删除表后将所用的外键删除)

--给列增加缺省值

ALTER TABLE TABLENAME
MODIFY columnname  DEFAULT(value) NOT NULL;

--给表增加外键
 ALTER TABLE  tablename
 ADD CONSTRAINT  constraintname
 FOREIGN KEY(column) REFERENCES table1name(column1);

6、安全策略

--加密传输

把客户端环境变量ora_encrypt_login设为true
把服务器端参数dblink_encypt_login设为true

--数据库管理员安全策略

a、建库后立即修改SYS/SYSTEM的口令(9.2后必须修改其口令)
b、只有数据库管理员才能以SYSDBA登录系统
c、建立不同角色的管理员，分配不同的权限

   比如：对象创建于维护
         数据库的调整与维护
         创建用户分配角色
         启动关闭
         恢复备份

--应用开发者的安全策略

a、开发者的特权只能在测试开发的数据库中赋予权限
b、自由开发者、受控开发者
   自由开发者:create table\index\procedure\package
   受控开发者:没有以上权限

7、日志文件管理

--切换日志文件

ALTER SYSTEM SWITCH LOGFILE;

--增加日志文件

ALTER DATABASE ADD LOGFILE
('/DISK3/log3a.rdo',
'/DISK4/log3b.rdo') size 1M;

--增加日志成员

ALTER DATABASE ADD LOGFILE MEMBER
'/DISK4/log1b.rdo' TO GROUP 1
'/DISK4/log2b.rdo' TO GROUP 2;

--删除日志文件

ALTER DATABASE DROP LOGFILE GROUP 3;

--删除日志成员

ALTER DATABASE DROP LOGFILE MEMBER '/DISK4/log2b.dbf';

--清除日志文件内容

ALTER DATABASE CLEAR LOGFILE '/DISK3/log2a.rdo';


大家在应用ORACLE的时候可能会遇到很多看起来不难的问题, 特别对新手来说, 今天我简单把它总结一下, 发布给大家, 希望对大家有帮助! 和大家一起探讨, 共同进步!

    对ORACLE高手来说是不用看的。

    1. Oracle安装完成后的初始口令?

    internal/oracle

    sys/change_on_install

    system/manager

    scott/tiger

    sysman/oem_temp

    2. ORACLE9IAS WEB CACHE的初始默认用户和密码？

    administrator/administrator

    3. oracle 8.0.5怎幺创建数据库?

    用orainst。如果有motif界面，可以用orainst /m

        4. oracle 8.1.7怎幺创建数据库?

    dbassist

    5. oracle 9i 怎幺创建数据库?

    dbca

    6. oracle中的裸设备指的是什幺?

    裸设备就是绕过文件系统直接访问的储存空间

    7. oracle如何区分 64-bit/32bit 版本？？？

    $ sqlplus '/ AS SYSDBA'

    SQL*Plus: Release 9.0.1.0.0 - Production on Mon Jul 14 17:01:09 2003

    (c) Copyright 2001 Oracle Corporation. All rights reserved.

    Connected to:

    Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production

    With the Partitioning option

    JServer Release 9.0.1.0.0 - Production

    SQL> select * from v$version;

    BANNER

    ----------------------------------------------------------------

    Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production

    PL/SQL Release 9.0.1.0.0 - Production

    CORE 9.0.1.0.0 Production

    TNS for Solaris: Version 9.0.1.0.0 - Production

    NLSRTL Version 9.0.1.0.0 - Production

    SQL>

8. SVRMGR什幺意思？

    svrmgrl，Server Manager.

    9i下没有，已经改为用SQLPLUS了

    sqlplus /nolog

    变为归档日志型的

    9. 请问如何分辨某个用户是从哪台机器登陆ORACLE的?

    SELECT machine , terminal FROM V$SESSION;

    10. 用什幺语句查询字段呢？

    desc table_name 可以查询表的结构

    select field_name,... from ... 可以查询字段的值

    select * from all_tables where table_name like '%'

    select * from all_tab_columns where table_name='??'

11. 怎样得到触发器、过程、函数的创建脚本？

    desc user_source

    user_triggers

12. 怎样计算一个表占用的空间的大小？

    select owner,table_name,

    NUM_ROWS,

    BLOCKS*AAA/1024/1024 "Size M",

    EMPTY_BLOCKS,

    LAST_ANALYZED

    from dba_tables

    where table_name='XXX';

    Here: AAA is the value of db_block_size ;

    XXX is the table name you want to check

    13. 如何查看最大会话数？

    SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%';

    SQL>

    SQL> show parameter processes

    NAME TYPE VALUE

    ------------------------------------ ------- ------------------------------

    aq_tm_processes integer 1

    db_writer_processes integer 1

    job_queue_processes integer 4

    log_archive_max_processes integer 1

    processes integer 200

    这里为200个用户。

    select * from v$license;

    其中sessions_highwater纪录曾经到达的最大会话数

       14. 如何查看系统被锁的事务时间？

    select * from v$locked_object ;

    15. 如何以archivelog的方式运行oracle。

    init.ora

    log_archive_start = true

    RESTART DATABASE

    16. 怎幺获取有哪些用户在使用数据库

    select username from v$session;

    17. 数据表中的字段最大数是多少?

    表或视图中的最大列数为 1000

    18. 怎样查得数据库的SID ?

    select name from v$database;

    也可以直接查看 init.ora文件

    19. 如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ?

    select sys_context('userenv','ip_address') from dual;

    如果是登陆本机数据库，只能返回127.0.0.1，呵呵

    20. unix 下怎幺调整数据库的时间？

    su -root

    date -u 08010000

21. 在ORACLE TABLE中如何抓取MEMO类型字段为空的资料记录?

    select remark from oms_flowrec where trim(' ' from remark) is not null ;

    22. 如何用BBB表的资料去更新AAA表的资料(有关联的字段)

    UPDATE AAA SET BNS_SNM=(SELECT BNS_SNM FROM BBB WHERE AAA.DPT_NO=BBB.DPT_NO) WHERE BBB.DPT_NO IS NOT NULL;

    23. P4计算机安装方法

    将SYMCJIT.DLL改为SYSMCJIT.OLD

    24. 何查询SERVER是不是OPS?

    SELECT * FROM V$OPTION;

    如果PARALLEL SERVER=TRUE则有OPS能

    25. 何查询每个用户的权限?

    SELECT * FROM DBA_SYS_PRIVS;

    26. 如何将表移动表空间?

    ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;

    27. 如何将索引移动表空间?

    ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME;

    28. 在LINUX,UNIX下如何激活DBA STUDIO?

    OEMAPP DBASTUDIO
        29. 查询锁的状况的对象有?

    V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ;

    查询锁的表的方法:

    SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')', S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2 FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;

    30. 如何解锁?

    ALTER SYSTEM KILL SESSION ‘SID,SERIR#’;
        31. SQLPLUS下如何修改编辑器?

    DEFINE _EDITOR=“<编辑器的完整路经>” -- 必须加上双引号来定义新的编辑器，也可以把这个写在$ORACLE_HOME/sqlplus/admin/glogin.sql里面使它永久有效。

    32. ORACLE产生随机函数是?

    DBMS_RANDOM.RANDOM

    33. LINUX下查询磁盘竞争状况命令?

    Sar -d

    33. LINUX下查询CPU竞争状况命令?

    sar -r

    34. 查询当前用户对象?

    SELECT * FROM USER_OBJECTS;

    SELECT * FROM DBA_SEGMENTS;

    35. 如何获取错误信息?

    SELECT * FROM USER_ERRORS;

    36. 如何获取链接状况?

    SELECT * FROM DBA_DB_LINKS;

         37. 查看数据库字符状况?

    SELECT * FROM NLS_DATABASE_PARAMETERS;

    SELECT * FROM V$NLS_PARAMETERS;

    38. 查询表空间信息?

    SELECT * FROM DBA_DATA_FILES;

    39. ORACLE的INTERAL用户要口令?

    修改 SQLNET.ORA

    SQLNET.AUTHENTICATION_SERVICES=(NTS)

    40. 出现JAVA.EXE的解决办法?

    一般是将ORACLEORAHOMEXIHTTPSERVER改成手工激活可以的

    X是8或9

41. 如何给表、列加注释？

    SQL>comment on table 表 is '表注释';注释已创建。

    SQL>comment on column 表.列 is '列注释';注释已创建。

    SQL> select * from user_tab_comments where comments is not null;

42. 如何查看各个表空间占用磁盘情况？

    SQL> col tablespace format a20

    SQL> select

    b.file_id 文件ID号,

    b.tablespace_name 表空间名,

    b.bytes 字节数,

    (b.bytes-sum(nvl(a.bytes,0))) 已使用,

    sum(nvl(a.bytes,0)) 剩余空间,

    sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比

    from dba_free_space a,dba_data_files b

    where a.file_id=b.file_id

    group by b.tablespace_name,b.file_id,b.bytes

    order by b.file_id

    43. 如把ORACLE设置为MTS或专用模式？

    #dispatchers="(PROTOCOL=TCP) (SERVICE=SIDXDB)" 加上就是MTS，注释就是专用模式，SID是指你的实例名。

    44. 如何才能得知系统当前的SCN号 ?

    select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe;

    45. 请问如何在ORACLE中取毫秒?

    9i之前不支持,9i开始有timestamp.

    9i可以用select systimestamp from dual;

46. 如何在字符串里加回车？

    select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ;

    47. 中文是如何排序的？

    Oracle9i之前，中文是按照二进制编码进行排序的。

    在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值

    SCHINESE_RADICAL_M 按照部首（第一顺序）、笔划（第二顺序）排序

    SCHINESE_STROKE_M 按照笔划（第一顺序）、部首（第二顺序）排序

    SCHINESE_PINYIN_M 按照拼音排序

    48. Oracle8i中对象名可以用中文吗？

    可以

    49. 如何改变WIN中SQL*Plus启动选项？

    SQL*PLUS自身的选项设置我们可以在$ORACLE_HOME/sqlplus/admin/glogin.sql中设置。

50. 怎样修改oracel数据库的默认日期?

    alter session set nls_date_format='yyyymmddhh24miss';

    OR

    可以在init.ora中加上一行

    nls_date_format='yyyymmddhh24miss'

       51. 如何将小表放入keep池中?

    alter table xxx storage(buffer_pool keep);

    52. 如何检查是否安装了某个patch?

    check that oraInventory

    53. 如何使select语句使查询结果自动生成序号?

    select rownum,COL from table;

    54. 如何知道数据裤中某个表所在的tablespace?

    select tablespace_name from user_tables where table_name='TEST';

    select * from user_tables中有个字段TABLESPACE_NAME，（oracle）;

    select * from dba_segments where …;

    55. 怎幺可以快速做一个和原表一样的备份表?

    create table new_table as (select * from old_table);

        55. 怎幺在sqlplus下修改procedure?

    select line,trim(text) t from user_source where name =’A’ order by line;

    56. 怎样解除PROCEDURE被意外锁定?

    alter system kill session ,把那个session给杀掉，不过你要先查出她的session id

    or

    把该过程重新改个名字就可以了。

    57. SQL Reference是个什幺东西？

    是一本sql的使用手册，包括语法、函数等等，oracle官方网站的文档中心有下载.

    58. 如何查看数据库的状态?

    unix下

    ps -ef | grep ora

    windows下看服务是否起来，是否可以连上数据库

    59. 请问如何修改一张表的主键?

    alter table aaa

    drop constraint aaa_key ;

    alter table aaa

    add constraint aaa_key primary key(a1,b1) ;

    60. 改变数据文件的大小?

    用 ALTER DATABASE .... DATAFILE .... ;

    手工改变数据文件的大小，对于原来的 数据文件有没有损害。

61. 怎样查看ORACLE中有哪些程序在运行之中？

    查看v$sessions表

62. 怎幺可以看到数据库有多少个tablespace?

    select * from dba_tablespaces;

    63. 如何修改oracle数据库的用户连接数？

    修改initSID.ora，将process加大，重启数据库.

    64. 如何查出一条记录的最后更新时间?

    可以用logminer 察看

    65. 如何在PL/SQL中读写文件？

    UTL_FILE包允许用户通过PL/SQL读写操作系统文件。

    66. 怎样把“&”放入一条记录中？

    insert into a values (translate ('at{&}t','at{}','at'));

    67. EXP　如何加ＱＵＥＲＹ参数？

    EXP USER/PASS FILE=A.DMP TABLES(BSEMPMS)

    QUERY='"WHERE EMP_NO=\'S09394\'\" ﹔

    68. 关于oracle8i支持简体和繁体的字符集问题？

    ZHS16GBK可以支

    69. Data Guard是什幺软件？

    就是Standby的换代产品

    70. 如何创建SPFILE?

    SQL> connect / as sysdba

    SQL> select * from v$version;

    SQL> create pfile from spfile;

    SQL> CREATE SPFILE FROM PFILE='E:\ora9i\admin\eygle\pfile\init.ora';

    文件已创建。

    SQL> CREATE SPFILE='E:\ora9i\database\SPFILEEYGLE.ORA' FROM

    PFILE='E:\ora9i\admin\eygle\pfile\init.ora';

    文件已创建。

71. 内核参数的应用?

    shmmax

    含义：这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存，只决定了最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。

    设置方法：0.5*物理内存

    例子：Set shmsys:shminfo_shmmax=10485760

    shmmin

    含义：共享内存的最小大小。

    设置方法：一般都设置成为1。

    例子：Set shmsys:shminfo_shmmin=1：

    shmmni

    含义：系统中共享内存段的最大个数。

    例子：Set shmsys:shminfo_shmmni=100

    shmseg

    含义：每个用户进程可以使用的最多的共享内存段的数目。

    例子：Set shmsys:shminfo_shmseg=20：

    semmni

    含义：系统中semaphore identifierer的最大个数。

    设置方法：把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最大的那个processes的那个值加10。

    例子：Set semsys:seminfo_semmni=100

    semmns

    含义：系统中emaphores的最大个数。

    设置方法：这个值可以通过以下方式计算得到：各个Oracle实例的initSID.ora里边的processes的值的总和（除去最大的Processes参数）＋最大的那个Processes×2＋10×Oracle实例的个数。

    例子：Set semsys:seminfo_semmns=200

    semmsl:

    含义：一个set中semaphore的最大个数。

    设置方法：设置成为10＋所有Oracle实例的InitSID.ora中最大的Processes的值。

    例子：Set semsys:seminfo_semmsl=-200

        72. 怎样查看哪些用户拥有SYSDBA、SYSOPER权限？

    SQL>conn sys/change_on_install

    SQL>select * from V_$PWFILE_USERS;

    73. 如何单独备份一个或多个表？

    exp 用户/密码 tables=(表1,…,表2)

    74. 如何单独备份一个或多个用户？

    exp system/manager owner=(用户1,用户2,…,用户n) file=导出文件

    75. 如何对CLOB字段进行全文检索？

    SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)>0;

    76. 如何显示当前连接用户?

    SHOW USER

    77. 如何查看数据文件放置的路径 ?

    col file_name format a50

    SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;

    78. 如何查看现有回滚段及其状态 ?

    SQL> col segment format a30

    SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS

         79. 如何改变一个字段初始定义的Check范围？

    SQL> alter table xxx drop constraint constraint_name;
之后再创建新约束:

    SQL> alter table xxx add constraint constraint_name check();

    80. Oracle常用系统文件有哪些？

    通过以下视图显示这些文件信息：v$database,v$datafile,v$logfile v$controlfile v$parameter;

       81. 内连接INNER JOIN?

    Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no;

    82. 如何外连接?

    Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);

    Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;

    83. 如何执行脚本SQL文件?

    SQL>@$PATH/filename.sql;

    84. 如何快速清空一个大表?

    SQL>truncate table table_name;

    85. 如何查有多少个数据库实例?

    SQL>SELECT * FROM V$INSTANCE;

    86. 如何查询数据库有多少表?

    SQL>select * from all_tables;

    87. 如何测试SQL语句执行所用的时间?

    SQL>set timing on ;

    SQL>select * from tablename;

        88. CHR()的反函数是?

    ASCII()

    SELECT CHAR(65) FROM DUAL;

    SELECT ASCII('A') FROM DUAL;

    89. 字符串的连接

    SELECT CONCAT(COL1,COL2) FROM TABLE ;

    SELECT COL1||COL2 FROM TABLE ;

    90. 怎么把select出来的结果导到一个文本文件中？

    SQL>SPOOL C:\ABCD.TXT;

    SQL>select * from table;

    SQL >spool off;

    91. 怎样估算SQL执行的I/O数 ?

    SQL>SET AUTOTRACE ON ;

    SQL>SELECT * FROM TABLE;

    OR

    SQL>SELECT * FROM v$filestat ;

    可以查看IO数

91. 怎样估算SQL执行的I/O数 ?

    SQL>SET AUTOTRACE ON ;

    SQL>SELECT * FROM TABLE;

    OR

    SQL>SELECT * FROM v$filestat ;

    可以查看IO数

  92. 如何在sqlplus下改变字段大小?

    alter table table_name modify (field_name varchar2(100));

    改大行，改小不行（除非都是空的）

    93. 如何查询某天的数据?

    select * from table_name where trunc(日期字段)＝to_date('2003-05-02','yyyy-mm-dd');

    94. sql 语句如何插入全年日期？

create table BSYEAR (d date);
insert into BSYEAR
select to_date('20030101','yyyymmdd')+rownum-1
from all_objects
where rownum <= to_char(to_date('20031231','yyyymmdd'),'ddd');

    95. 如果修改表名?

    alter table old_table_name rename to new_table_name;

    96. 如何取得命令的返回状态值？

    sqlcode=0

    97. 如何知道用户拥有的权限?

    SELECT * FROM dba_sys_privs ;

    98. 从网上下载的ORACLE9I与市场上卖的标准版有什么区别？

    从功能上说没有区别，只不过oracle公司有明文规定；从网站上下载的oracle产品不得用于 商业用途，否则侵权。

        99. 怎样判断数据库是运行在归档模式下还是运行在非归档模式下？

    进入dbastudio，历程--〉数据库---〉归档查看。

    100. sql>startup pfile和ifile,spfiled有什么区别？

    pfile就是Oracle传统的初始化参数文件，文本格式的。ifile类似于c语言里的include，用于把另一个文件引入spfile是9i里新增的并且是默认的参数文件，二进制格式startup后应该只可接pfile


有人会否认ORACLE是全球最有影响的数据库产品之一；不过好的东西似乎总不是那么好用（初看起来如此），甚至有些无情－－总会给layman们一个个无情的错误号。下面是我个人的总结，条条有用，希望能给初学者一点启示。
    关于“好的东西似乎总不是那么好用（初看起来如此）”的一个笑话：在参加 IBM DB2 512、513培训前，在校园网上下载到了安装程序，不过任凭我们几个同学研究个半天，也不知哪个文件是安装文件，竟没有安装成功。最后，一致认为：看来这个培训真是太有必要了！事后，才知道－－我们下载的是4linux的！

 [以8.1.6为例]：

1、ORA－12541：TNS：没有监听器

    原因：没有启动监听器或者监听器损坏。如果是前者，使用命令net start OracleOraHome81TNSListener（名字可能有出入）即可；如果是后者，则使用“Net8 Configuration Assistant”工具向导之“监听程序配置”增加一个监听器即可（基本不用写任何信息，一路OK。在添加之前可能需要把所有的监听器先删除！）

2、ORA－12500：TNS：监听程序无法启动专用服务器进程
    或
   ORA－12560：TNS：协议适配器错误

    原因：ORACLE的数据库服务没有启动。使用命令net start ORACLESERVICEORADB（ORADB为数据库名字）即可。如果仍没有解决，请继续向下看。

3、如果数据库服务启动失败，则很有可能是其注册表项值损坏，最好的做法是以下两步：

    1）ORADIM -DELETE -SID oradb 删除数据库服务项
    2）ORADIM -NEW -SID oradb 新增数据库服务项
    注：这个过程中如果出错，就重启计算机！

4、ORA－12154：TNS：能解析服务名

    原因：ORACLE的网络服务名没有正确配置。请使用“Net8 Configuration Assistant”工具向导之“本地网络服务名配置”配置TNS即可。如果仍没有解决，请继续向下看。

5、ORA－1034 ：TNS：ORACLE不可用

    原因：ORACLE的数据库服务正确启动，但是数据库没有打开！

    使用命令：

    1）svrmgrl  启动服务管理器
    2）connect internal 以internal身份登陆
    3）startup  打开数据库

6、ORA－12560：TNS：协议适配器错误（顽固性的）

    原因：未知。

    解决：必杀技－－打开“Windows任务管理器”，杀死ORACLE.exe及ORADIM.exe进程，书写自己的ora_startup.bat，执行之！

PS：

1、我的ora_startup.bat：

net start OracleOraHome81TNSListener
net start ORACLESERVICEORADB
svrmgrl 一般情况下不用，不过有时少不了它的，具体步骤见第5步。

2、我的ora_shutdown.bat：

net stop OracleOraHome81TNSListener
net stop ORACLESERVICEORADB

3、ORACLE相关服务名请参见“管理工具”之“服务”中以ORACLE开头的服务名。


1.字符串函数
长度与分析用
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length) 不多说了,取子串
right(char_expr,int_expr) 返回字符串右边int_expr个字符
字符操作类
upper(char_expr) 转为大写
lower(char_expr) 转为小写
space(int_expr) 生成int_expr个空格
replicate(char_expr,int_expr)复制字符串int_expr次
reverse(char_expr) 反转字符串
stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从 start开始的length个字符用char_expr2代替
ltrim(char_expr) rtrim(char_expr) 取掉空格
ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符
字符串查找
charindex(char_expr,expression) 返回char_expr的起始位置
patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0
2.数学函数
abs(numeric_expr) 求绝对值
ceiling(numeric_expr) 取大于等于指定值的最小整数
exp(float_expr) 取指数 floor(numeric_expr) 小于等于指定值得最大整数
pi() 3.1415926.........
power(numeric_expr,power) 返回power次方
rand([int_expr]) 随机数产生器
round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入
sign(int_expr) 根据正数,0,负数,,返回+1,0,-1
sqrt(float_expr) 平方根
3.日期函数
getdate() 返回日期
datename(datepart,date_expr) 返回名称如 June
datepart(datepart,date_expr) 取日期一部份
datediff(datepart,date_expr1.dateexpr2) 日期差
dateadd(datepart,number,date_expr) 返回日期加上 number
上述函数中datepart的 写法 取值和意义
yy 1753-9999 年份
qq 1-4 刻
mm 1-12 月
dy 1-366 日
dd 1-31 日
wk 1-54 周
dw 1-7 周几
hh 0-23 小时
mi 0-59 分钟
ss 0-59 秒
ms 0-999 毫秒
日期转换 convert()
4.系统函数
suser_name() 用户登录名
user_name() 用户在数据库中的名字 user 用户在数据库中的名字
show_role() 对当前用户起作用的规则
db_name() 数据库名
object_name(obj_id) 数据库对象名
col_name(obj_id,col_id) 列名
col_length(objname,colname) 列长度
valid_name(char_expr) 是否是有效标识符


    在开发数据库应用中，经常会遇到处理时间的问题，如查询指定时间的记录等。下面就这些常见的问题，结合自己的一些经验，和大家探讨一下这类问题。
    首先介绍一下，SQL Server里处理时间的几个主要函数的用法：
getdate()函数：取得系统当前的日期和时间。返回值为datetime类型的。
用法：getdate()
例子：
select getdate() as dte,dateadd(day,-1,getdate()) as nowdat
输出结果：
dte nowdat

1999-11-21 19:13:10.083 1999-11-20 19:13:10.083

(1 row(s) affected)

datepart()函数：以整数的形式返回时间的指定部分。
用法：datepart(datepart,date)
参数说明：datepart时要返回的时间的部分，常用取值year、month、day、hour、minute。
date是所指定的时间。

例子：
SELECT DATEPART(month, GETDATE()) AS 'Month Number'
输出结果：
Month Number

11

(1 row(s) affected)

dateadd()函数：通过给指定的时间的指定部分加上一个整数值以返回一个新时间值。
用法：dateadd(datepart,number,date)
参数说明：datepart(同上）
date(同上)
number要增加的值，整型，可正可负，正值返回date之后的时间值，负值返回date
之前的时间值

例子：
select getdate() as today
select dateadd(day,-1,getdate())
select dateadd(day,1,getdate())
输出：
today

1999-11-21 19:42:41.410

(1 row(s) affected)

yesterday

1999-11-20 19:42:41.410

(1 row(s) affected)

tomorrow

1999-11-22 19:42:41.410

(1 row(s) affected)

datediff()函数：返回两个时间以指定时间部分来计算的差值。返回整数值。如1991-6-12和1991-6-21之间以天
来算相差9天,1998-6-12和1999-6-23按年算相差1年，1999-12-1和1999-3-12按月算相差9个月
用法：datediff(darepart,date1,date2)
参数说明：datepart（同上)
date1、date2(同上date)
例子：
select datediff(month,'1991-6-12','1992-6-21') as a
输出：
a

12

(1 row(s) affected)


1.把某个字段重新生气序列(从1到n):
DECLARE @i int
Set @i = 0
Update Table1 Set @i = @i + 1,Field1 = @i

2.按成绩排名次
Update 成绩表
Set a.名次 = (
Select Count(*) + 1
From 成绩表 b
Where a.总成绩 < b.总成绩
)
From 成绩表 a

3.查询外部数据库
Select a.*
From OpenRowSet('Microsoft.Jet.OLEDB.4.0','c:\test.mdb';'admin';'',Table1) a

4.查询Excel文件
Select *
From OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1$

5.在查询中指定排序规则
Select * From Table1 Order By Field1 COLLATE Chinese_PRC_BIN
为什么要指定排序规则呢?参见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985
例,检查数据库中的Pub_Users表中是否存在指定的用户:
Select Count(*) From Pub_Users Where [UserName]='admin' And [PassWord]='aaa' COLLATE Chinese_PRC_BIN
默认比较是不区分大小写的,如果不加COLLATE Chinese_PRC_BIN,那么密码aaa与AAA是等效的,这当然与实际不符.注意的是,每个条件都要指定排序规则,上例中用户名就不区分大小写.

6.Order By的一个小技巧
Order By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)
Select a.ID,a.Name,(Select Count(*) From TableB b Where a.ID=b.PID) From TableA a Order By 3


探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构：

CREATE TABLE [dbo].[TGongwen] (    --TGongwen是红头文件表名

   [Gid] [int] IDENTITY (1, 1) NOT NULL ,
--本表的id号，也是主键

   [title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,
--红头文件的标题

   [fariqi] [datetime] NULL ,
--发布日期

   [neibuYonghu] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,
--发布用户

   [reader] [varchar] (900) COLLATE Chinese_PRC_CI_AS NULL ,

--需要浏览的用户。每个用户中间用分隔符“,”分开

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

    下面，我们来往数据库中添加1000万条数据：

declare @i int

set @i=1

while @i<=250000

begin

    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-2-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最先的25万条记录')

    set @i=@i+1

end

GO

declare @i int

set @i=1

while @i<=250000

begin

    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-9-16','办公室','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是中间的25万条记录')

    set @i=@i+1

end

GO

declare @h int

set @h=1

while @h<=100

begin

declare @i int

set @i=2002

while @i<=2003

begin

declare @j int

        set @j=0

        while @j<50

            begin

declare @k int

            set @k=0

            while @k<50

            begin

    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(@i as varchar(4))+'-8-15 3:'+cast(@j as varchar(2))+':'+cast(@j as varchar(2)),'通信科','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是最后的50万条记录')

            set @k=@k+1

            end

set @j=@j+1

        end

set @i=@i+1

end

set @h=@h+1

end

GO

declare @i int

set @i=1

while @i<=9000000

begin

    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-5-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最后添加的900万条记录')

    set @i=@i+1000000

end

GO

通过以上语句，我们创建了25万条由于2004年2月5日发布的记录，25万条由办公室于2004年9月6日发布的记录，2002年和2003年各100个2500条相同日期、不同分秒的记录（共50万条），还有由通信科于2004年5月5日发布的900万条记录，合计1000万条。

一、因情制宜，建立“适当”的索引

    建立“适当”的索引是实现查询优化的首要前提。

    索引（index）是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据时，索引提供了对数据的快速访问。事实上，没有索引,数据库也能根据SELECT语句成功地检索到结果，但随着表变得越来越大，使用“适当”的索引的效果就越来越明显。注意，在这句话中，我们用了“适当”这个词，这是因为，如果使用索引时不认真考虑其实现过程，索引既可以提高也会破坏数据库的工作性能。

    （一）深入浅出理解索引结构

    实际上，您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引：聚集索引（clustered index，也称聚类索引、簇集索引）和非聚集索引（nonclustered index，也称非聚类索引、非簇集索引）。下面，我们举例来说明一下聚集索引和非聚集索引的区别：

    其实，我们的汉语字典的正文本身就是一个聚集索引。比如，我们要查“安”字，就会很自然地翻开字典的前几页，因为“安”的拼音是“an”，而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的，那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字，那么就说明您的字典中没有这个字；同样的，如果查“张”字，那您也会将您的字典翻到最后部分，因为“张”的拼音是“zhang”。也就是说，字典的正文部分本身就是一个目录，您不需要再去查其他目录来找到您需要找的内容。

    我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

    如果您认识某个字，您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字，不知道它的发音，这时候，您就不能按照刚才的方法找到您要查的字，而需要去根据“偏旁部首”查到您要找的字，然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法，比如您查“张”字，我们可以看到在查部首之后的检字表中“张”的页码是672页，检字表中“张”的上面是“驰”字，但页码却是63页，“张”的下面是“弩”字，页面是390页。很显然，这些字并不是真正的分别位于“张”字的上下方，现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序，是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字，但它需要两个过程，先找到目录中的结果，然后再翻到您所需要的页码。

    我们把这种目录纯粹是目录，正文纯粹是正文的排序方式称为“非聚集索引”。

    通过以上例子，我们可以理解到什么是“聚集索引”和“非聚集索引”。

    进一步引申一下，我们可以很容易的理解：每个表只能有一个聚集索引，因为目录只能按照一种方法进行排序。

（二）何时使用聚集索引或非聚集索引

    下面的表总结了何时使用聚集索引或非聚集索引（很重要）。

    动作描述
      使用聚集索引
      使用非聚集索引

    列经常被分组排序
      应
      应

    返回某范围内的数据
      应
      不应

    一个或极少不同值
      不应
      不应

    小数目的不同值
      应
      不应

    大数目的不同值
      不应
      应

    频繁更新的列
      不应
      应

    外键列
      应
      应

    主键列
      应
      应

    频繁修改索引列
      不应
      应

    事实上，我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如：返回某范围内的数据一项。比如您的某个表有一个时间列，恰好您把聚合索引建立在了该列，这时您查询2004年1月1日至2004年10月1日之间的全部数据时，这个速度就将是很快的，因为您的这本字典正文是按日期进行排序的，聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可；而不像非聚集索引，必须先查到目录中查到每一项数据对应的页码，然后再根据页码查到具体内容。

（三）结合实际，谈索引使用的误区

    理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引，但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区，以便于大家掌握索引建立的方法。

    1、主键就是聚集索引

    这种想法笔者认为是极端错误的，是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。

    通常，我们会在每个表中都建立一个ID列，以区分每条数据，并且这个ID列是自动增大的，步长一般为1。我们的这个办公自动化的实例中的列Gid就是如此。此时，如果我们将这个列设为主键，SQL SERVER会将此列默认为聚集索引。这样做有好处，就是可以让您的数据在数据库中按照ID进行物理排序，但笔者认为这样做意义不大。

    显而易见，聚集索引的优势是很明显的，而每个表中只能有一个聚集索引的规则，这使得聚集索引变得更加珍贵。

    从我们前面谈到的聚集索引的定义我们可以看出，使用聚集索引的最大好处就是能够根据查询要求，迅速缩小查询范围，避免全表扫描。在实际应用中，因为ID号是自动生成的，我们并不知道每条记录的ID号，所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。其次，让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则；当然，这种情况只是针对用户经常修改记录内容，特别是索引项的时候会负作用，但对于查询速度并没有影响。

    在办公自动化系统中，无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是“日期”还有用户本身的“用户名”。

    通常，办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况，但如果您的系统已建立了很长时间，并且数据量很大，那么，每次每个用户打开首页的时候都进行一次全表扫描，这样做意义是不大的，绝大多数的用户1个月前的文件都已经浏览过了，这样做只能徒增数据库的开销而已。事实上，我们完全可以让用户打开系统首页时，数据库仅仅查询这个用户近3个月来未阅览的文件，通过“日期”这个字段来限制表扫描，提高查询速度。如果您的办公自动化系统已经建立的2年，那么您的首页显示速度理论上将是原来速度8倍，甚至更快。

    在这里之所以提到“理论上”三字，是因为如果您的聚集索引还是盲目地建在ID这个主键上时，您的查询速度是没有这么高的，即使您在“日期”这个字段上建立的索引（非聚合索引）。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现（3个月内的数据为25万条）：

    （1）仅在主键上建立聚集索引，并且不划分时间段：

Select gid,fariqi,neibuyonghu,title from tgongwen

    用时：128470毫秒（即：128秒）

    （2）在主键上建立聚集索引，在fariq上建立非聚集索引：

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

    用时：53763毫秒（54秒）

    （3）将聚合索引建立在日期列（fariqi）上：

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

    用时：2423毫秒（2秒）

    虽然每条语句提取出来的都是25万条数据，各种情况的差异却是巨大的，特别是将聚集索引建立在日期列时的差异。事实上，如果您的数据库真的有1000万容量的话，把主键建立在ID列上，就像以上的第1、2种情况，在网页上的表现就是超时，根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。

    得出以上速度的方法是：在各个select语句前加：declare @d datetime

set @d=getdate()

并在select语句后加：

select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

    2、只要建立索引就能显著提高查询速度

    事实上，我们可以发现上面的例子中，第2、3条语句完全相同，且建立索引的字段也相同；不同的仅是前者在fariqi字段上建立的是非聚合索引，后者在此字段上建立的是聚合索引，但查询速度却有着天壤之别。所以，并非是在任何字段上简单地建立索引就能提高查询速度。

    从建表的语句中，我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中，我们每天都会发几个文件，这几个文件的发文日期就相同，这完全符合建立聚集索引要求的：“既不能绝大多数都相同，又不能只有极少数相同”的规则。由此看来，我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。

    3、把所有需要提高查询速度的字段都加进聚集索引，以提高查询速度

    上面已经谈到：在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。既然这两个字段都是如此的重要，我们可以把他们合并起来，建立一个复合索引（compound index）。

    很多人认为只要把任何字段加进聚集索引，就能提高查询速度，也有人感到迷惑：如果把复合的聚集索引字段分开查询，那么查询速度会减慢吗？带着这个问题，我们来看一下以下的查询速度（结果集都是25万条数据）：（日期列fariqi首先排在复合聚集索引的起始列，用户名neibuyonghu排在后列）

    （1）select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5'

    查询速度：2513毫秒

    （2）select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5' and neibuyonghu='办公室'

    查询速度：2516毫秒

    （3）select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu='办公室'

    查询速度：60280毫秒

    从以上试验中，我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的，甚至比用上全部的复合索引列还要略快（在查询结果集数目一样的情况下）；而如果仅用复合聚集索引的非起始列作为查询条件的话，这个索引是不起任何作用的。当然，语句1、2的查询速度一样是因为查询的条目数一样，如果复合索引的所有列都用上，而且查询结果少的话，这样就会形成“索引覆盖”，因而性能可以达到最优。同时，请记住：无论您是否经常使用聚合索引的其他列，但其前导列一定要是使用最频繁的列。

（四）其他书上没有的索引使用经验总结

    1、用聚合索引比用不是聚合索引的主键速度快

    下面是实例语句：（都是提取25万条数据）

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

    使用时间：3326毫秒

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000

    使用时间：4470毫秒

    这里，用聚合索引比用不是聚合索引的主键速度快了近1/4。

    2、用聚合索引比用一般的主键作order by时速度快，特别是在小数据量情况下

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi

    用时：12936

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

    用时：18843

    这里，用聚合索引比用一般的主键作order by时，速度快了3/10。事实上，如果数据量很小的话，用聚集索引作为排序列要比使用非聚集索引速度快得明显的多；而数据量如果很大的话，如10万以上，则二者的速度差别不明显。

    3、使用聚合索引内的时间段，搜索时间会按数据占整个数据表的百分比成比例减少，而无论聚合索引使用了多少个

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1'

    用时：6343毫秒（提取100万条）

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-6-6'

    用时：3170毫秒（提取50万条）

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

    用时：3326毫秒（和上句的结果一模一样。如果采集的数量一样，那么用大于号和等于号是一样的）

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' and fariqi<'2004-6-6'

    用时：3280毫秒

    4 、日期列不会因为有分秒的输入而减慢查询速度

    下面的例子中，共有100万条数据，2004年1月1日以后的数据有50万条，但只有两个不同的日期，日期精确到日；之前有数据50万条，有5000个不同的日期，日期精确到秒。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' order by fariqi

    用时：6390毫秒

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi<'2004-1-1' order by fariqi

    用时：6453毫秒

    （五）其他注意事项

    “水可载舟，亦可覆舟”，索引也一样。索引有助于提高检索性能，但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引，数据库就要做更多的工作。过多的索引甚至会导致索引碎片。

    所以说，我们要建立一个“适当”的索引体系，特别是对聚合索引的创建，更应精益求精，以使您的数据库能得到高性能的发挥。

    当然，在实践中，作为一个尽职的数据库管理员，您还要多测试一些方案，找出哪种方案效率最高、最为有效。

二、改善SQL语句

    很多人不知道SQL语句在SQL SERVER中是如何执行的，他们担心自己所写的SQL语句会被SQL SERVER误解。比如：

select * from table1 where name='zhangsan' and tID > 10000

    和执行:

select * from table1 where tID > 10000 and name='zhangsan'

    一些人不知道以上两条语句的执行效率是否一样，因为如果简单的从语句先后上看，这两个语句的确是不一样，如果tID是一个聚合索引，那么后一句仅仅从表的10000条以后的记录中查找就行了；而前一句则要先从全表中查找看有几个name='zhangsan'的，而后再根据限制条件条件tID>10000来提出查询结果。

    事实上，这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”，它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间，也就是说，它能实现自动优化。

    虽然查询优化器可以根据where子句自动的进行查询优化，但大家仍然有必要了解一下“查询优化器”的工作原理，如非这样，有时查询优化器就会不按照您的本意进行快速查询。

    在查询分析阶段，查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数（SARG），那么就称之为可优化的，并且可以利用索引快速获得所需数据。

    SARG的定义：用于限制搜索的一个操作，因为它通常是指一个特定的匹配，一个值得范围内的匹配或者两个以上条件的AND连接。形式如下：

列名 操作符 <常数 或 变量>

或

<常数 或 变量> 操作符列名

    列名可以出现在操作符的一边，而常数或变量出现在操作符的另一边。如：

Name=’张三’

价格>5000

5000<价格

Name=’张三’ and 价格>5000

    如果一个表达式不能满足SARG的形式，那它就无法限制搜索的范围了，也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。

    介绍完SARG后，我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验：

    1、Like语句是否属于SARG取决于所使用的通配符的类型

    如：name like ‘张%’ ，这就属于SARG

    而：name like ‘%张’ ,就不属于SARG。

    原因是通配符%在字符串的开通使得索引无法使用。

    2、or 会引起全表扫描

Name=’张三’ and 价格>5000 符号SARG，而：Name=’张三’ or 价格>5000 则不符合SARG。使用or会引起全表扫描。

    3、非操作符、函数引起的不满足SARG形式的语句

    不满足SARG形式的语句最典型的情况就是包括非操作符的语句，如：NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等，另外还有函数。下面就是几个不满足SARG形式的例子：

ABS(价格)<5000

Name like ‘%三’

    有些表达式，如：

WHERE 价格*2>5000

    SQL SERVER也会认为是SARG，SQL SERVER会将此式转化为：

WHERE 价格>2500/2

    但我们不推荐这样使用，因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。

    4、IN 的作用相当与OR

    语句：

Select * from table1 where tid in (2,3)

    和

Select * from table1 where tid=2 or tid=3

    是一样的，都会引起全表扫描，如果tid上有索引，其索引也会失效。

    5、尽量少用NOT

    6、exists 和 in 的执行效率是一样的

    很多资料上都显示说，exists要比in的执行效率要高，同时应尽可能的用not exists来代替not in。但事实上，我试验了一下，发现二者无论是前面带不带not，二者之间的执行效率都是一样的。因为涉及子查询，我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开。

    （1）select title,price from titles where title_id in (select title_id from sales where qty>30)

    该句的执行结果为：

    表 'sales'。扫描计数 18，逻辑读 56 次，物理读 0 次，预读 0 次。

    表 'titles'。扫描计数 1，逻辑读 2 次，物理读 0 次，预读 0 次。

    （2）select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty>30)

    第二句的执行结果为：

    表 'sales'。扫描计数 18，逻辑读 56 次，物理读 0 次，预读 0 次。

    表 'titles'。扫描计数 1，逻辑读 2 次，物理读 0 次，预读 0 次。

    我们从此可以看到用exists和用in的执行效率是一样的。

    7、用函数charindex()和前面加通配符%的LIKE执行效率一样

    前面，我们谈到，如果在LIKE前面加上通配符%，那么将会引起全表扫描，所以其执行效率是低下的。但有的资料介绍说，用函数charindex()来代替LIKE速度会有大的提升，经我试验，发现这种说明也是错误的：

select gid,title,fariqi,reader from tgongwen where charindex('刑侦支队',reader)>0 and fariqi>'2004-5-5'

    用时：7秒，另外：扫描计数 4，逻辑读 7155 次，物理读 0 次，预读 0 次。

select gid,title,fariqi,reader from tgongwen where reader like '%' + '刑侦支队' + '%' and fariqi>'2004-5-5'

    用时：7秒，另外：扫描计数 4，逻辑读 7155 次，物理读 0 次，预读 0 次。

    8、union并不绝对比or的执行效率高

    我们前面已经谈到了在where子句中使用or会引起全表扫描，一般的，我所见过的资料都是推荐这里用union来代替or。事实证明，这种说法对于大部分都是适用的。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or gid>9990000

    用时：68秒。扫描计数 1，逻辑读 404008 次，物理读 283 次，预读 392163 次。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

union

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000

    用时：9秒。扫描计数 8，逻辑读 67489 次，物理读 216 次，预读 7499 次。

    看来，用union在通常情况下比用or的效率要高的多。

    但经过试验，笔者发现如果or两边的查询列是一样的话，那么用union则反倒和用or的执行速度差很多，虽然这里union扫描的是索引，而or扫描的是全表。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or fariqi='2004-2-5'

    用时：6423毫秒。扫描计数 2，逻辑读 14726 次，物理读 1 次，预读 7176 次。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

union

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where  fariqi='2004-2-5'

    用时：11640毫秒。扫描计数 8，逻辑读 14806 次，物理读 108 次，预读 1144 次。

    9、字段提取要按照“需多少、提多少”的原则，避免“select *”

    我们来做一个试验：

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

    用时：4673毫秒

select top 10000 gid,fariqi,title from tgongwen order by gid desc

    用时：1376毫秒

select top 10000 gid,fariqi from tgongwen order by gid desc

    用时：80毫秒

    由此看来，我们每少提取一个字段，数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。

    10、count(*)不比count(字段)慢

    某些资料上说：用*会统计所有列，显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看：

select count(*) from Tgongwen

    用时：1500毫秒

select count(gid) from Tgongwen

    用时：1483毫秒

select count(fariqi) from Tgongwen

    用时：3140毫秒

select count(title) from Tgongwen

    用时：52050毫秒

    从以上可以看出，如果用count(*)和用count(主键)的速度是相当的，而count(*)却比其他任何除主键以外的字段汇总速度要快，而且字段越长，汇总的速度就越慢。我想，如果用count(*)， SQL SERVER可能会自动查找最小字段来汇总的。当然，如果您直接写count(主键)将会来的更直接些。

    11、order by按聚集索引列排序效率最高

    我们来看：（gid是主键，fariqi是聚合索引列）

select top 10000 gid,fariqi,reader,title from tgongwen

    用时：196 毫秒。 扫描计数 1，逻辑读 289 次，物理读 1 次，预读 1527 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc

    用时：4720毫秒。 扫描计数 1，逻辑读 41956 次，物理读 0 次，预读 1287 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

    用时：4736毫秒。 扫描计数 1，逻辑读 55350 次，物理读 10 次，预读 775 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc

    用时：173毫秒。 扫描计数 1，逻辑读 290 次，物理读 0 次，预读 0 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc

    用时：156毫秒。 扫描计数 1，逻辑读 289 次，物理读 0 次，预读 0 次。

    从以上我们可以看出，不排序的速度以及逻辑读次数都是和“order by 聚集索引列” 的速度是相当的，但这些都比“order by 非聚集索引列”的查询速度是快得多的。

    同时，按照某个字段进行排序的时候，无论是正序还是倒序，速度是基本相当的。

    12、高效的TOP

    事实上，在查询和提取超大容量的数据集时，影响数据库响应时间的最大因素不是数据查找，而是物理的I/0操作。如：

select top 10 * from (

select top 10000 gid,fariqi,title from tgongwen

where neibuyonghu='办公室'

order by gid desc) as a

order by gid asc

    这条语句，从理论上讲，整条语句的执行时间应该比子句的执行时间长，但事实相反。因为，子句执行后返回的是10000条记录，而整条语句仅返回10条语句，所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。经笔者在实践中的应用，发现TOP确实很好用，效率也很高。但这个词在另外一个大型数据库ORACLE中却没有，这不能说不是一个遗憾，虽然在ORACLE中可以用其他方法（如：rownumber）来解决。在以后的关于“实现千万级数据的分页显示存储过程”的讨论中，我们就将用到TOP这个关键词。

    到此为止，我们上面讨论了如何实现从大容量的数据库中快速地查询出您所需要的数据方法。当然，我们介绍的这些方法都是“软”方法，在实践中，我们还要考虑各种“硬”因素，如：网络性能、服务器的性能、操作系统的性能，甚至网卡、交换机等。

三、实现小数据量和海量数据的通用分页显示存储过程

    建立一个web 应用，分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法，也就是利用ADO自带的分页功能（利用游标）来实现分页。但这种分页方法仅适用于较小数据量的情形，因为游标本身有缺点：游标是存放在内存中，很费内存。游标一建立，就将相关的记录锁住，直到取消游标。游标提供了对特定集合中逐行扫描的手段，一般使用游标来逐行遍历数据，根据取出数据条件的不同进行不同的操作。而对于多表和大表中定义的游标（大的数据集合）循环很容易使程序进入一个漫长的等待甚至死机。

    更重要的是，对于非常大的数据模型而言，分页检索时，如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。现在流行的分页方法一般是检索页面大小的块区的数据，而非检索所有的数据，然后单步执行当前行。

    最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。这个存储过程用了游标，由于游标的局限性，所以这个方法并没有得到大家的普遍认可。

    后来，网上有人改造了此存储过程，下面的存储过程就是结合我们的办公自动化实例写的分页存储过程：

CREATE procedure pagination1

(@pagesize int,  --页面大小，如每页存储20条记录

@pageindex int   --当前页码

)

as

set nocount on

begin

declare @indextable table(id int identity(1,1),nid int)  --定义表变量

declare @PageLowerBound int  --定义此页的底码

declare @PageUpperBound int  --定义此页的顶码

set @PageLowerBound=(@pageindex-1)*@pagesize

set @PageUpperBound=@PageLowerBound+@pagesize

set rowcount @PageUpperBound

insert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(day,-365,getdate()) order by fariqi desc

select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid

and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id

end

set nocount off

    以上存储过程运用了SQL SERVER的最新技术――表变量。应该说这个存储过程也是一个非常优秀的分页存储过程。当然，在这个过程中，您也可以把其中的表变量写成临时表：CREATE TABLE #Temp。但很明显，在SQL SERVER中，用临时表是没有用表变量快的。所以笔者刚开始使用这个存储过程时，感觉非常的不错，速度也比原来的ADO的好。但后来，我又发现了比此方法更好的方法。

    笔者曾在网上看到了一篇小短文《从数据表中取出第n条到第m条的记录的方法》，全文如下：

从publish 表中取出第 n 条到第 m 条的记录：
SELECT TOP m-n+1 *
FROM publish
WHERE (id NOT IN
        (SELECT TOP n-1 id
         FROM publish))

id 为publish 表的关键字

    我当时看到这篇文章的时候，真的是精神为之一振，觉得思路非常得好。等到后来，我在作办公自动化系统（ASP.NET+ C#＋SQL SERVER）的时候，忽然想起了这篇文章，我想如果把这个语句改造一下，这就可能是一个非常好的分页存储过程。于是我就满网上找这篇文章，没想到，文章还没找到，却找到了一篇根据此语句写的一个分页存储过程，这个存储过程也是目前较为流行的一种分页存储过程，我很后悔没有争先把这段文字改造成存储过程：

CREATE PROCEDURE pagination2
(
 @SQL nVARCHAR(4000),    --不带排序语句的SQL语句
 @Page int,              --页码
 @RecsPerPage int,       --每页容纳的记录数
 @ID VARCHAR(255),       --需要排序的不重复的ID号
 @Sort VARCHAR(255)      --排序字段及规则
)
AS

DECLARE @Str nVARCHAR(4000)

SET @Str='SELECT   TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+'NOT IN
(SELECT   TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@Sort

PRINT @Str

EXEC sp_ExecuteSql @Str
GO

    其实，以上语句可以简化为：

SELECT TOP 页大小 *

FROM Table1

WHERE (ID NOT IN

          (SELECT TOP 页大小*页数 id

         FROM 表

         ORDER BY id))

ORDER BY ID

    但这个存储过程有一个致命的缺点，就是它含有NOT IN字样。虽然我可以把它改造为：

SELECT TOP 页大小 *

FROM Table1

WHERE not exists

(select * from (select top (页大小*页数) * from table1 order by id) b where b.id=a.id )

order by id

    即，用not exists来代替not in，但我们前面已经谈过了，二者的执行效率实际上是没有区别的。

    既便如此，用TOP 结合NOT IN的这个方法还是比用游标要来得快一些。

    虽然用not exists并不能挽救上个存储过程的效率，但使用SQL SERVER中的TOP关键字却是一个非常明智的选择。因为分页优化的最终目的就是避免产生过大的记录集，而我们在前面也已经提到了TOP的优势，通过TOP 即可实现对数据量的控制。

    在分页算法中，影响我们查询速度的关键因素有两点：TOP和NOT IN。TOP可以提高我们的查询速度，而NOT IN会减慢我们的查询速度，所以要提高我们整个分页算法的速度，就要彻底改造NOT IN，同其他方法来替代它。

    我们知道，几乎任何字段，我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值，所以如果这个字段不重复，那么就可以利用这些不重复的字段的max或min作为分水岭，使其成为分页算法中分开每页的参照物。在这里，我们可以用操作符“>”或“<”号来完成这个使命，使查询语句符合SARG形式。如：

Select top 10 * from table1 where id>200

    于是就有了如下分页方案：

select top 页大小 *

from table1

where id>

      (select max (id) from

      (select top ((页码-1)*页大小) id from table1 order by id) as T

       )

  order by id

    在选择即不重复值，又容易分辨大小的列时，我们通常会选择主键。下表列出了笔者用有着1000万数据的办公自动化系统中的表，在以GID（GID是主键，但并不是聚集索引。）为排序列、提取gid,fariqi,title字段，分别以第1、10、100、500、1000、1万、10万、25万、50万页为例，测试以上三种分页方案的执行速度：（单位：毫秒）

页  码
 方案1
 方案2
 方案3

1
 60
 30
 76

10
 46
 16
 63

100
 1076
 720
 130

500
 540
 12943
 83

1000
 17110
 470
 250

1万
 24796
 4500
 140

10万
 38326
 42283
 1553

25万
 28140
 128720
 2330

50万
 121686
 127846
 7168

    从上表中，我们可以看出，三种存储过程在执行100页以下的分页命令时，都是可以信任的，速度都很好。但第一种方案在执行分页1000页以上后，速度就降了下来。第二种方案大约是在执行分页1万页以上后速度开始降了下来。而第三种方案却始终没有大的降势，后劲仍然很足。

    在确定了第三种分页方案后，我们可以据此写一个存储过程。大家知道SQL SERVER的存储过程是事先编译好的SQL语句，它的执行效率要比通过WEB页面传来的SQL语句的执行效率要高。下面的存储过程不仅含有分页方案，还会根据页面传来的参数来确定是否进行数据总数统计。

-- 获取指定页的数据

CREATE PROCEDURE pagination3

@tblName   varchar(255),       -- 表名

@strGetFields varchar(1000) = '*',  -- 需要返回的列

@fldName varchar(255)='',      -- 排序的字段名

@PageSize   int = 10,          -- 页尺寸

@PageIndex  int = 1,           -- 页码

@doCount  bit = 0,   -- 返回记录总数, 非 0 值则返回

@OrderType bit = 0,  -- 设置排序类型, 非 0 值则降序

@strWhere  varchar(1500) = ''  -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL   varchar(5000)       -- 主语句

declare @strTmp   varchar(110)        -- 临时变量

declare @strOrder varchar(400)        -- 排序类型

if @doCount != 0

  begin

    if @strWhere !=''

    set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere

    else

    set @strSQL = "select count(*) as Total from [" + @tblName + "]"

end

--以上代码的意思是如果@doCount传递过来的不是0，就执行总数统计。以下的所有代码都是@doCount为0的情况

else

begin

if @OrderType != 0

begin

    set @strTmp = "<(select min"

set @strOrder = " order by [" + @fldName +"] desc"

--如果@OrderType不是0，就执行降序，这句很重要！

end

else

begin

    set @strTmp = ">(select max"

    set @strOrder = " order by [" + @fldName +"] asc"

end

if @PageIndex = 1

begin

    if @strWhere != ''

    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from [" + @tblName + "] where " + @strWhere + " " + @strOrder

     else

     set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["+ @tblName + "] "+ @strOrder

--如果是第一页就执行以上代码，这样会加快执行速度

end

else

begin

--以下代码赋予了@strSQL以真正执行的SQL代码

set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["

    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder

if @strWhere != ''

    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["

        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["

        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["

        + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "

        + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

end

end

exec (@strSQL)

GO

    上面的这个存储过程是一个通用的存储过程，其注释已写在其中了。

    在大数据量的情况下，特别是在查询最后几页的时候，查询时间一般不会超过9秒；而用其他存储过程，在实践中就会导致超时，所以这个存储过程非常适用于大容量数据库的查询。

    笔者希望能够通过对以上存储过程的解析，能给大家带来一定的启示，并给工作带来一定的效率提升，同时希望同行提出更优秀的实时数据分页算法。

四、聚集索引的重要性和如何选择聚集索引

    在上一节的标题中，笔者写的是：实现小数据量和海量数据的通用分页显示存储过程。这是因为在将本存储过程应用于“办公自动化”系统的实践中时，笔者发现这第三种存储过程在小数据量的情况下，有如下现象：

    1、分页速度一般维持在1秒和3秒之间。

    2、在查询最后一页时，速度一般为5秒至8秒，哪怕分页总数只有3页或30万页。

    虽然在超大容量情况下，这个分页的实现过程是很快的，但在分前几页时，这个1－3秒的速度比起第一种甚至没有经过优化的分页方法速度还要慢，借用户的话说就是“还没有ACCESS数据库速度快”，这个认识足以导致用户放弃使用您开发的系统。

    笔者就此分析了一下，原来产生这种现象的症结是如此的简单，但又如此的重要：排序的字段不是聚集索引！

    本篇文章的题目是：“查询优化及分页算法方案”。笔者只所以把“查询优化”和“分页算法”这两个联系不是很大的论题放在一起，就是因为二者都需要一个非常重要的东西――聚集索引。

    在前面的讨论中我们已经提到了，聚集索引有两个最大的优势：

    1、以最快的速度缩小查询范围。

    2、以最快的速度进行字段排序。

    第1条多用在查询优化时，而第2条多用在进行分页时的数据排序。

    而聚集索引在每个表内又只能建立一个，这使得聚集索引显得更加的重要。聚集索引的挑选可以说是实现“查询优化”和“高效分页”的最关键因素。

    但要既使聚集索引列既符合查询列的需要，又符合排序列的需要，这通常是一个矛盾。

    笔者前面“索引”的讨论中，将fariqi，即用户发文日期作为了聚集索引的起始列，日期的精确度为“日”。这种作法的优点，前面已经提到了，在进行划时间段的快速查询中，比用ID主键列有很大的优势。

    但在分页时，由于这个聚集索引列存在着重复记录，所以无法使用max或min来最为分页的参照物，进而无法实现更为高效的排序。而如果将ID主键列作为聚集索引，那么聚集索引除了用以排序之外，没有任何用处，实际上是浪费了聚集索引这个宝贵的资源。

      为解决这个矛盾，笔者后来又添加了一个日期列，其默认值为getdate()。用户在写入记录时，这个列自动写入当时的时间，时间精确到毫秒。即使这样，为了避免可能性很小的重合，还要在此列上创建UNIQUE约束。将此日期列作为聚集索引列。

    有了这个时间型聚集索引列之后，用户就既可以用这个列查找用户在插入数据时的某个时间段的查询，又可以作为唯一列来实现max或min，成为分页算法的参照物。

    经过这样的优化，笔者发现，无论是大数据量的情况下还是小数据量的情况下，分页速度一般都是几十毫秒，甚至0毫秒。而用日期段缩小范围的查询速度比原来也没有任何迟钝。

    聚集索引是如此的重要和珍贵，所以笔者总结了一下，一定要将聚集索引建立在：

    1、您最频繁使用的、用以缩小查询范围的字段上；

    2、您最频繁使用的、需要排序的字段上。

    结束语：

    希望这篇文章不仅能够给大家的工作带来一定的帮助，也希望能让大家能够体会到分析问题的方法；最重要的是，希望这篇文章能够抛砖引玉，掀起大家的学习和讨论的兴趣，以共同促进。
    最后需要说明的是，在试验中，发现用户在进行大数据量查询的时候，对数据库速度影响最大的不是内存大小，而是CPU。在我的P4 2.4机器上试验的时候，查看“资源管理器”，CPU经常出现持续到100%的现象，而内存用量却并没有改变或者说没有大的改变。即使在我们的HP ML 350 G3服务器上试验时，CPU峰值也能达到90%，一般持续在70%左右。

    本文的试验数据都是来自我们的HP ML 350服务器。服务器配置：双Inter Xeon 超线程 CPU 2.4G，内存1G，操作系统Windows Server 2003 Enterprise Edition，数据库SQL Server 2000 SP3。


一、备份数据库

1、打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server
2、SQL Server组-->双击打开你的服务器-->双击打开数据库目录
3、选择你的数据库名称（如论坛数据库Forum）-->然后点上面菜单中的工具-->选择备份数据库
4、备份选项选择完全备份，目的中的备份到如果原来有路径和名称则选中名称点删除，然后点添加，如果原来没有路径和名称则直接选择添加，接着指定路径和文件名，指定后点确定返回备份窗口，接着点确定进行备份

二、还原数据库

1、打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server
2、SQL Server组-->双击打开你的服务器-->点图标栏的新建数据库图标，新建数据库的名字自行取
3、点击新建好的数据库名称（如论坛数据库Forum）-->然后点上面菜单中的工具-->选择恢复数据库
4、在弹出来的窗口中的还原选项中选择从设备-->点选择设备-->点添加-->然后选择你的备份文件名-->添加后点确定返回，这时候设备栏应该出现您刚才选择的数据库备份文件名，备份号默认为1（如果您对同一个文件做过多次备份，可以点击备份号旁边的查看内容，在复选框中选择最新的一次备份后点确定）-->然后点击上方常规旁边的选项按钮
5、在出现的窗口中选择在现有数据库上强制还原，以及在恢复完成状态中选择使数据库可以继续运行但无法还原其它事务日志的选项。在窗口的中间部位的将数据库文件还原为这里要按照你SQL的安装进行设置（也可以指定自己的目录），逻辑文件名不需要改动，移至物理文件名要根据你所恢复的机器情况做改动，如您的SQL数据库装在D:\Program Files\Microsoft SQL Server\MSSQL\Data，那么就按照您恢复机器的目录进行相关改动改动，并且最后的文件名最好改成您当前的数据库名（如原来是bbs_data.mdf，现在的数据库是forum，就改成forum_data.mdf），日志和数据文件都要按照这样的方式做相关的改动（日志的文件名是*_log.ldf结尾的），这里的恢复目录您可以自由设置，前提是该目录必须存在（如您可以指定d:\sqldata\bbs_data.mdf或者d:\sqldata\bbs_log.ldf），否则恢复将报错
6、修改完成后，点击下面的确定进行恢复，这时会出现一个进度条，提示恢复的进度，恢复完成后系统会自动提示成功，如中间提示报错，请记录下相关的错误内容并询问对SQL操作比较熟悉的人员，一般的错误无非是目录错误或者文件名重复或者文件名错误或者空间不够或者数据库正在使用中的错误，数据库正在使用的错误您可以尝试关闭所有关于SQL窗口然后重新打开进行恢复操作，如果还提示正在使用的错误可以将SQL服务停止然后重起看看，至于上述其它的错误一般都能按照错误内容做相应改动后即可恢复

三、收缩数据库

一般情况下，SQL数据库的收缩并不能很大程度上减小数据库大小，其主要作用是收缩日志大小，应当定期进行此操作以免数据库日志过大
1、设置数据库模式为简单模式：打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称（如论坛数据库Forum）-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”，然后按确定保存
2、在当前数据库上点右键，看所有任务中的收缩数据库，一般里面的默认设置不用调整，直接点确定
3、收缩数据库完成后，建议将您的数据库属性重新设置为标准模式，操作方法同第一点，因为日志在一些异常情况下往往是恢复数据库的重要依据

四、设定每日自动备份数据库

强烈建议有条件的用户进行此操作！
1、打开企业管理器，在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器
2、然后点上面菜单中的工具-->选择数据库维护计划器
3、下一步选择要进行自动备份的数据-->下一步更新数据优化信息，这里一般不用做选择-->下一步检查数据完整性，也一般不选择
4、下一步指定数据库维护计划，默认的是1周备份一次，点击更改选择每天备份后点确定
5、下一步指定备份的磁盘目录，选择指定目录，如您可以在D盘新建一个目录如：d:\databak，然后在这里选择使用此目录，如果您的数据库比较多最好选择为每个数据库建立子目录，然后选择删除早于多少天前的备份，一般设定4－7天，这看您的具体备份要求，备份文件扩展名一般都是bak就用默认的
6、下一步指定事务日志备份计划，看您的需要做选择-->下一步要生成的报表，一般不做选择-->下一步维护计划历史记录，最好用默认的选项-->下一步完成
7、完成后系统很可能会提示Sql Server Agent服务未启动，先点确定完成计划设定，然后找到桌面最右边状态栏中的SQL绿色图标，双击点开，在服务中选择Sql Server Agent，然后点击运行箭头，选上下方的当启动OS时自动启动服务
8、这个时候数据库计划已经成功的运行了，他将按照您上面的设置进行自动备份

修改计划：
1、打开企业管理器，在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->管理-->数据库维护计划-->打开后可看到你设定的计划，可以进行修改或者删除操作

五、数据的转移（新建数据库或转移服务器）

一般情况下，最好使用备份和还原操作来进行转移数据，在特殊情况下，可以用导入导出的方式进行转移，这里介绍的就是导入导出方式，导入导出方式转移数据一个作用就是可以在收缩数据库无效的情况下用来减小（收缩）数据库的大小，本操作默认为您对SQL的操作有一定的了解，如果对其中的部分操作不理解，可以咨询动网相关人员或者查询网上资料
1、将原数据库的所有表、存储过程导出成一个SQL文件，导出的时候注意在选项中选择编写索引脚本和编写主键、外键、默认值和检查约束脚本选项
2、新建数据库，对新建数据库执行第一步中所建立的SQL文件
3、用SQL的导入导出方式，对新数据库导入原数据库中的所有表内容


2月份 曾写过一篇sqlserver 优化海量查询的方法http://blog.csdn.net/great_domino/archive/2005/02/01/275839.aspx

最近有同事遇到sqlserver统计记百万条以上记录条数太慢的问题，sp经常会遇到统计大量数据问题，或许是巧合的原因，找到一个很简单的方法！

写了一篇文章

我们在统计记录的时候通常的做法是：select count(*) as c from table 。然而对于记录数巨大的表，上述做法将会非常耗时。在DELL 4400 服务器上做试验，MS Sqlserver 2000 数据库对于100万记录的简单数据表执行上述语句，时间在1分钟以上。如果在表的某个字段上做聚簇索引，第一次执行该语句的时间和没有索引的时间差不多，之后执行上述语句，速度很快，在1秒中以内，但当表的记录数发生较大变化后，再执行该语句又会经历一次耗时的过程。而且不是每个表都适合做聚簇索引的，对于数量巨大的表，如果需要经常增删操作，建聚簇索引是一个很不明智的做法，将会极大的影响增删的速度。那么有没有一个比较简单的方法快速获取表的记录总数呢？答案是有的。
 在MS SQL 数据库中每个表都在sysindexes 系统表中拥有至少一条记录，该记录中的rows 字段会定时记录表的记录总数。下面是sysindexes 表的相关记录的含义：

列名      数据类型             描述
id            int                        表ID(如果 indid = 0 或255)。否则为索引所属表的ID
Indid       smallint                索引ID：
                                         0＝表
                                         1＝聚簇索引
                                         >1＝非聚簇索引
                                        255＝具有text或image数据的表条目。
rows       int                       基于indid=0 和 indid=1地数据级行数，该值对于indid>1重 复。如果indid=255，rows设置为0。

  当表没有聚簇索引时，Indid = 0 否则为 1。


Java基础面试题

Java基础方面:

1,作用域public,protected,private,以及不写时的区别

答：区别如下：

作用域 当前类 同一package 子孙类 其他package

public √ √ √ √

protected √ √ √ ×

friendly √ √ × ×

private √ × × ×

不写时默认为friendly

2,ArrayList和Vector的区别,HashMap和Hashtable的区别

答：就ArrayList与Vector主要从二方面来说.

一.同步性:Vector是线程安全的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的

二.数据增长:当需要增长时,Vector默认增长为原来一培，而ArrayList却是原来的一半

就HashMap与HashTable主要从三方面来说。

一.历史原因:Hashtable是基于陈旧的Dictionary类的，HashMap是Java 1.2引进的Map接口的一个实现

二.同步性:Hashtable是线程安全的，也就是说是同步的，而HashMap是线程序不安全的，不是同步的

三.值：只有HashMap可以让你将空值作为一个表的条目的key或value

3,char型变量能不能定义为一个中文?为什么?

答：是能够定义成为一个中文的，因为java中以unicode编码，一个char占16个字节，所以放一个中文是没问题的

4,多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么?

答：多线程有两种实现方法，分别是继承Thread类与实现Runnable接口

同步的实现方面有两种，分别是synchronized,wait与notify

5,继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?

答:父类：

package test;

public class FatherClass

{

public FatherClass()

{

System.out.println("FatherClass Create");

}

}

子类:

package test;

import test.FatherClass;

public class ChildClass extends FatherClass

{

public ChildClass()

{

System.out.println("ChildClass Create");

}

public static void main(String[] args)

{

FatherClass fc = new FatherClass();

ChildClass cc = new ChildClass();

}

}

输出结果：

C:\>java test.ChildClass

FatherClass Create

FatherClass Create

ChildClass Create

6,内部类的实现方式?

答：示例代码如下：

package test;

public class OuterClass

{

private class InterClass

{

public InterClass()

{

System.out.println("InterClass Create");

}

}

public OuterClass()

{

InterClass ic = new InterClass();

System.out.println("OuterClass Create");

}

public static void main(String[] args)

{

OuterClass oc = new OuterClass();

}

}

输出结果:

C:\>java test/OuterClass

InterClass Create

OuterClass Create

再一个例题：

public class OuterClass {

private double d1 = 1.0;

//insert code here

}

You need to insert an inner class declaration at line 3. Which two inner class declarations are

valid?(Choose two.)

A. class InnerOne{

public static double methoda() {return d1;}

}

B. public class InnerOne{

static double methoda() {return d1;}

}

C. private class InnerOne{

double methoda() {return d1;}

}

D. static class InnerOne{

protected double methoda() {return d1;}

}

E. abstract class InnerOne{

public abstract double methoda();

}

说明如下：

一.静态内部类可以有静态成员，而非静态内部类则不能有静态成员。 故 A、B 错

二.静态内部类的非静态成员可以访问外部类的静态变量，而不可访问外部类的非静态变量；return d1 出错。

故 D 错

三.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确

四.答案为C、E

7,垃圾回收机制,如何优化程序?

8,float型float f=3.4是否正确?

答:不正确。精度不准确,应该用强制类型转换，如下所示：float f=(float)3.4

9、介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)?

答：Collection FrameWork如下：

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│　└Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）

Map提供key到value的映射

10、Java中异常处理机制，事件机制？

 答:使用New操作创建对象后,JAVA虚拟机自动该对象分配内存并保持跟踪,JAVA虚拟机能判断出对象是否还被引用,对不再被引用的对象释放其占用的内存.

11、JAVA中的多形与继承？

希望大家补上，谢谢

12、抽象类与接口？

答：抽象类与接口都用于抽象，但是抽象类(JAVA中)可以有自己的部分实现，而接口则完全是一个标识(同时有多重继承的功能)。

13、Java 的通信编程，编程题(或问答)，用JAVA SOCKET编程，读服务器几个字符，再写入本地显示？

答:Server端程序:

package test;

import java.net.*;

import java.io.*;

public class Server

{

private ServerSocket ss;

private Socket socket;

private BufferedReader in;

private PrintWriter out;

public Server()

{

try

{

ss=new ServerSocket(10000);

while(true)

{

socket = ss.accept();

String RemoteIP = socket.getInetAddress().getHostAddress();

String RemotePort = ":"+socket.getLocalPort();

System.out.println("A client come in!IP:"+RemoteIP+RemotePort);

in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));

String line = in.readLine();

System.out.println("Cleint send is :" + line);

out = new PrintWriter(socket.getOutputStream(),true);

out.println("Your Message Received!");

out.close();

in.close();

socket.close();

}

}catch (IOException e)

{

out.println("wrong");

}

}

public static void main(String[] args)


简 历
姓 名： | XXXXXX | 性 别： | 男
出生日期： | 1982年11月20日 | 居 住 地： | 深圳市
工作年限： | 二年以上 | 户 口： | 广西
电子邮件： | abc@21cn.com
移动电话： | 1111111111
自 我 评 价
1、能适应高强度的工作, 能够承担一定工作压力。
2、独特的学习方法使我在能力上快速提升和获得扎实的技术。
3、自信，有毅力，能吃苦耐劳，具有刻苦钻研精神。
4、爱岗、敬业，具有强烈的责任心。
5、具有良好沟通能力，编写文档的习惯，能发扬团队合作精神。
6、时刻关注业界最新动态，掌握最前沿的技术。
求 职 意 向
工作性质： | 全职
目标地点： | 深圳市，北京市
期望工资： | 面议
工 作 经 验
2004/08--2005/07：XXXXXXXXXX信息技术股份有限公司
所属行业： | 计算机
技术部 |  | J2EE软件工程师
负责使用Hibernate实现持久逻辑，部分概要、详细文档的编写
2003/06--2004/07：XXXXXXXX信息技术有限公司
所属行业： | 互联网/电子商务
技术部 |  | JSP程序员
基于Model2，运用MVC的思想，采用JSP+Servlet+JavaBean的J2EE开发，参与框架的设计和控制层的编写
项 目 经 验
2005/01--2005/07：桂星图书管理系统
软件环境： | Windows XP
开发工具： | eclipse + MyEclipse、Weblogic 8.1、Oracle 9i、Rational Rose 2003、Dreamweaver
项目描述： | 采用技术：DAO、BD、MVC模式, Struts + Spring + Hibernate 本系统实现了图书管理员代理用户借书、还书，管理员还可以对图书进行CRUD操作。提供了是在WebLogic Server上建立的J2EE系统。 表示层采用Struts 框架，持久化层采用Hibernate实现。Spring框架的依赖IoC（即依赖注入）很好的实现了控制反转。运用了业务代理模式使表示层与业务逻辑层分离，运用Spring框架提的DAO抽象，使业务逻辑层与持久化层分离，还使用了eclipse集成的CVS进行版本控制。
责任描述： | 运用UML对实体层进行分析与设计。根据需求决定实体间的单、双向和一对多等关联关系，以及Hibernate的检索策略、检索方式。负责项目的整体规划和项目控制等等。
2004/08--2004/12：网上电子商务交易系统
软件环境： | Windows XP
开发工具： | eclipse( + MyEclipsec + lomboz 3 )、Weblogic 8.1、Oracle 9i、UltraEdit、Rational Rose 2003
项目描述： | 采用技术：MVC、BD模式(即业务代理模式)、Facade模式，采用Struts + EJB。 表示层采用了struts框架技术，结合了MVC、单例模式、工厂模式， 系统中大量运用了Struts框架中的现成组件，如：使用了Struts 的五大标签库，整个视图层采用了 Tiles框架构建，用Validator 验证框架进行数据逻辑验证。模型层用EJB实现，通过会话Bean调用实体Bean。会话Bean实现业务逻辑，实体Bean实现对象的持久化。为了使表示层与业务逻辑层分离，充分运用了业务代理模式，下层EJB组件向上层Struts中的Action控制器开放接口，当模型层改变时，表示层不受影响。
责任描述： | 运用UML对EJB模块进行分析与设计。实现了部分EJB代码，如客 户下定单，客户与定单之间的CMR关联关系，编写了客户对定单的CRUD操作的模块。运用Façade模式，会话Bean封装对实体Bean的操作。
2003/10--2004/05：网上鲜花订购系统
软件环境： | Linux(RedHat 9.0)
开发工具： | JBuilder X、Tomcat 5.0、Oracle 9i、JCreator 、Visio 2003、Dreamweaver 、UltraEdit
项目描述： | 采用技术：运用命令模式和MVC思想的自定义框架. 本系统是在Windows XP平台下开发，在Linux平台上运行的项目。 系统为管理员提供了鲜花管理、订单管理（包括插、查、删、改）、对客户、订单进行分析，统计。系统为客户提供了订购鲜花和查询相关信息的功能。 服务器端技术采用JSP+Servlet + JavaBean 。使用Tomcat的JDBC、JNDI、ConnectionPool连接池等技术。控制器(Servlet)接收所有的请求,根据不同的请求调用相应的JavaBean来处理业务逻辑, 使用自定义的框架开发,通过单例模式完成对数据库的访问，再返回相应的试图(JSP)。用VSS对项目进行了管理。
责任描述： | 对项目部分文档（概要设计，详细设计）进行编写与整理。采用Rational Rose 2003完成业务建模。实现了自定义框架部分代码的编写。
教 育 经 历
2000/08--2004/08： XXXXXXXX大学 信息与计算科学 本科
1、多次获得过学校奖学金。
2、由于本专业学的课程是计算机、数学，具有扎实的数学基础，较强的逻辑思维能力。
3、具有全面的计算机理论体系结构。除本专业学习的数据结构、数据库原理、软件工程、操作系统、离散数学等课程以外，还自学了计算机专业的网络原理、编译原理、汇编语言、计算机组成原理等课程。
4、用ASP开发和维护学校校园网网站。用VB+SQL Server开发了校园日志管理系统。
5、大四最后一年，在XXXXXXX有限公司担任JSP程序员，用JSP+Servlet+JavaBean开发网上鲜花订购系统。
IT 技 能
技能名称 | 熟练程度 | 使用时间
XML | 熟练 | 12月
Crystal Reports | 了解 | 4月
WebLogic | 熟练 | 18月
EJB | 一般 | 12月
SQL Server | 熟练 | 16月
Linux | 一般 | 10月
J2EE | 精通 | 24月
JSP | 精通 | 20月
Oracle | 熟练 | 20月
JavaScript | 一般 | 12月
.NET | 一般 | 6月
附 加 信 息
特长： 1、精通J2EE JSP/Servlet/JavaBean，对基于MVC的Struts框架以及持久层Hibernate框架很有开发经验，了解Spring的IOC和AOP并能将其运用到项目中。
2、了解EJB, Threads,Socket编程JDBC,JNDI,JMail等J2EE核心技术。
3、熟练使用eclipse、Jbuilder X、Rational Rose、Visio、VSS、CVS。
4、有Linux环境下开发经验。能熟练配置中间件服务器Tomcat 5.0、Weblogic 8.1和使用Oracle数据库。
5、熟悉UML、XML、Javascript，熟悉.NET平台。
6、能够灵活运用OO思想进行分析,设计和编程。
7、了解多种设计模式并将其引入实际开发，懂软件工程和软件测试。


找工作要面试，有面试就有对付面试的办法。以下一些题目来自我和我朋友痛苦的面试经历，提这些问题

的公司包括IBM, E*Trade, Siebel, Motorola, SUN, 以及其它大小公司。

    面试是没什么道理可讲的，它的题目有的不合情理、脱离实际。有在纸上写的，有当面考你的，也有在电

话里问的，给你IDE的估计很少(否则你赶快去买彩票， 说不定中)。所以如果你看完此文后，请不要抱怨说这

些问题都能用IDE来解决。你必须在任何情况下准确回答这些问题，在面试中如果出现一两题回答不准确很有可

能你就被拒之门外了。

    当然这些都是Java的基本题，那些面试的人大多数不会问你Hibernate有多先进，Eclipse的三个组成部分

，或command design pattern，他们都是老一辈了，最喜欢问的就是基础知识。别小看了这些基础，我朋友水

平一流，结果就栽在一到基础知识的问题下，和高薪无缘。

    好了废话少说，开始正题。

    第一，谈谈final, finally, finalize的区别。

    final 用于声明属性，方法和类，分别表示属性不可变，方法不可覆盖，类不可继承。

finally是异常处理语句结构的一部分，表示总是执行。

finalize是Object类的一个方法，在垃圾收集器执行的时候会调用被回收对象的此方法，可以覆盖此方法提供

垃圾收集时的其他资源回收，例如关闭文件等。

    第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现

)interface(接口)?
可以继承其他类或完成其他接口，在swing编程中常用此方式。
    第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。
Static Nested Class是被声明为静态（static）的内部类，它可以不依赖于外部类实例被实例化。而通常的内

部类需要在外部类实例化后才能实例化。
    第四，&和&&的区别。
&是位运算符，表示按位与运算，&&是逻辑运算符，表示逻辑与（and）.
    第五，HashMap和Hashtable的区别。
HashMap是Hashtable的轻量级实现（非线程安全的实现），他们都完成了Map接口，主要区别在于HashMap允许

空（null）键值（key）,由于非线程安全，效率上可能高于Hashtable.

    第六，Collection 和 Collections的区别。

    Collection是集合类的上级接口，继承与他的接口主要有Set 和List.

Collections是针对集合类的一个帮助类，他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等

操作。

    第七，什么时候用assert。
1.4新增关键字（语法），用于测试boolean表达式状态，可用于调试程序。

使用方法 assert <boolean表达式>，表示如果表达式为真（true）,则下面的语句执行，否则抛出

AssertionError。

另外的使用方式assert < boolean表达式>:<other表达式>，表示如果表达式为真，后面的表达式忽略，否则后

面表达式的值用于AssertionError的构建参数。

注意编译时要增加-source 1.4 参数，否则报错。]运行时要增加 –ea参数，否则assert行被忽略

    第八，GC是什么? 为什么要有GC?

    GC是垃圾收集的意思（Gabage Collection）,内存处理是编程人员容易出现问题的地方，忘记或者错误的

内存回收会导致程序或系统的不稳定甚至崩溃，Java提供的GC功能可以自动监测对象是否超过作用域从而达到

自动回收内存的目的，Java语言没有提供释放已分配内存的显示操作方法。

    第九，String s = new String("xyz");创建了几个String Object?
两个
    第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12

Math.round(-11.5)==-11

round方法返回与参数最接近的长整数，参数加1/2后求其floor.
    第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; （s1+1运算结果是int型，需要强制转换类型）

short s1 = 1; s1 += 1;（可以正确编译）
    第十二，sleep() 和 wait() 有什么区别?
sleep是线程类（Thread）的方法，导致此线程暂停执行指定时间，给执行机会给其他线程，但是监控状态依然

保持，到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法，对此对象调用wait方法导致本线程放弃对象锁，进入等待此对象的等待锁定池，只有

针对此对象发出notify方法（或notifyAll）后本线程才进入对象锁定池准备获得对象锁进入运行状态。

    第十三，Java有没有goto?
没有
    很十三的问题，如果哪个面试的问到这个问题，我劝你还是别进这家公司。（完）（job.sohu.com）

第十四，数组有没有length()这个方法? String有没有length()这个方法？
数组没有length()这个方法，有length的属性。
String有有length()这个方法。

第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性

的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称

和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，

父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同

的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

?
Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类

型相配的话，返回真值。

第十七，给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException,

CannotRedoException, CannotUndoException, ClassCastException, CMMException,

ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException,

IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException,

NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException,

ProviderException, RasterFormatException, SecurityException, SystemException,

UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

第十八，error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样

的情况。
exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。

第十九，List, Set, Map是否继承自Collection接口?
List，Set是

Map不是

第二十，abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的

类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变

量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract

类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。

知道其行为的其它类可以在类中实现这些方法。
接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得

。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与

子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有

这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使

用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，

instanceof 运算符可以用来决定某对象的类是否实现了接口。

第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?
都不能

第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete

class)?
接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明

确的构造函数。

第二十三，启动一个线程是用run()还是start()?
启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并

执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

第二十四，构造器Constructor是否可被override?
构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。

第二十五，是否可以继承String类?
String类是final类故不可以继承。

第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?
不能，一个对象的一个synchronized方法只能由一个线程访问。

第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候

被执行，在return前还是后?
会执行，在return前执行。


第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?
不对，有相同的hash code。

第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，

那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对

该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。

第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?
switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short

、 char 或者 byte。long,string 都不能作用于swtich。

第三十二，编程题: 写一个Singleton出来。
     Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时

实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
    private Singleton(){}
    //在自己内部定义自己一个实例，是不是很奇怪？
    //注意这是private 只供内部调用
    private static Singleton instance = new Singleton();
    //这里提供了一个供外部访问本class的静态方法，可以直接访问
    public static Singleton getInstance() {
        return instance;
     }
}
第二种形式:
public class Singleton {
    private static Singleton instance = null;
    public static synchronized Singleton getInstance() {
    //这个方法比上面有所改进，不用每次都进行生成对象，只是第一次
    //使用时生成实例，提高了效率！
    if (instance==null)
        instance＝new Singleton();
return instance; 　　}
}
其他形式:
定义一个类，它的构造函数为private的，所有方法为static的。
一般认为第一种形式要更加安全些

1.      J2EE是什么？

 答: J2EE全称为Java2 Platform, Enterprise Edition。
“J2EE平台本质上是一个分布式的服务器应用程序设计环境——一个Java环境，它提供了：
·宿主应用的一个运行基础框架环境。
·一套用来创建应用的Java扩展API。”（引自《J2EE服务器端高级编程》）

2． EJB与JAVA BEAN的区别？

答:EJB与JAVA BEAN是SUN的不同组件规范，EJB是在容器中运行的，分步式的，而JAVA BEAN主要是一种可利用

的组件，主要在客户端UI表现上。

3．抽象类与接口？

答: 接口的好处是将实现与表现分离。

抽象类与接口都用于抽象，但是抽象类(JAVA中)可以有自己的部分实现，而接口则完全是一个标识(同时有多重

继承的功能)。

4．JSP中动态INCLUDE与静态INCLUDE的区别？

答:动态可以带参数，静态相当于一段静态HTML文件。

5．什么是JSP？它和Servlet有什么区别？

答：你可以将JSP当做一个可扩充的HTML来对待。虽然在本质上JSP文件会被服务器自动翻译为相应的Servlet来

执行。可以说Servlet是面向Java程序员而JSP是面向HTML程序员的，除此之外两者功能完全等价。

6 .JSP的内置对象及方法。

request request表示HttpServletRequest对象。它包含了有关浏览器请求的信息，并且提供了几个用于获取

cookie, header, 和session数据的有用的方法。

response response表示HttpServletResponse对象，并提供了几个用于设置送回 浏览器的响应的方法（如

cookies,头信息等）

out out 对象是javax.jsp.JspWriter的一个实例，并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字

空间、servlet相关的对象的API，并且包装了通用的servlet相关功能的方法。

session session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

application applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和

servlet环境的信息

config config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

page page表示从该页面产生的一个servlet实例

7. 说出Servlet的生命周期，并说出Servlet和CGI的区别。

Servlet被服务器实例化后，容器运行其init方法，请求到达时运行其service方法，service方法自动派遣运行

与请求对应的doXXX方法（doGet，doPost）等，当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中，它通过多线程方式运行其service方法，一个实例可以服务于多个

请求，并且其实例一般不会销毁，而CGI对每个请求都产生新的进程，服务完成后就销毁，所以效率上低于

servlet。

8说出在JSP页面里是怎么分页的?

页面需要保存以下参数：

总行数：根据sql语句得到总行数

每页显示行数：设定值

当前页数：请求参数

页面根据当前页数和每页行数计算出当前页第一行行数，定位结果集到此行，对结果集取出每页显示行数的行

即可。


数据库方面：

1存储过程和函数的区别

存储过程是用户定义的一系列sql语句的集合，涉及特定表或其它对象的任务，用户可以调用存储过程，而函数

通常是数据库已定义的方法，它接收参数并返回某种类型的值并且不涉及特定用户表。

2.       事务是什么？

事务是作为一个逻辑单元执行的一系列操作，一个逻辑工作单元必须有四个属性，称为 ACID（原子性、一致性

、隔离性和持久性）属性，只有这样才能成为一个事务：原子性:事务必须是原子工作单元；对于其数据修改，

要么全都执行，要么全都不执行。一致性:事务在完成时，必须使所有的数据都保持一致状态。在相关数据库中

，所有规则都必须应用于事务的修改，以保持所有数据的完整性。事务结束时，所有的内部数据结构（如 B 树

索引或双向链表）都必须是正确的。隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。

事务查看数据时数据所处的状态，要么是另一并发事务修改它之前的状态，要么是另一事务修改它之后的状态

，事务不会查看中间状态的数据。这称为可串行性，因为它能够重新装载起始数据，并且重播一系列事务，以

使数据结束时的状态与原始事务执行的状态相同。持久性:事务完成之后，它对于系统的影响是永久性的。该修

改即使出现系统故障也将一直保持。

3.游标的作用？如何知道游标已经到了最后？

游标用于定位结果集的行，通过判断全局变量@@FETCH_STATUS可以判断是否到了最后，通常此变量不等于0表示

出错或到了最后。

4.触发器分为事前触发和事后触发，这两种触发有和区别。语句级触发和行级触发有何区别。

事前触发器运行于触发事件发生之前，而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件

之前和新的字段值。

语句级触发器可以在语句执行前或后执行，而行级触发在触发器所影响的每一行触发一次。

四

1、数据库性能优化有那些措施（ORACLE/SYBASE/DB2/SQLSERVER选一种）2、写一个程序，把字符串倒叙，要求

“你好呀”变为“呀好你”（处理中文）3、名次解释（继承、重载、接口）4、JAVA线程实现有那些方法，说

明之5、JAVA内存遗漏什么原因6、从项目管理角度分析需求变动的控制7、JAVA SERVLET的生命周期8、说明回

话BEAN和实体BEAN?9、UML类之间的关系？一个半小时回答？  1写出你能记住的圆周率最多位2写出歌德巴赫猜

想的内容3有一映射函数 y=f（x），已知f(1)=1,f(1.99)=1,现要求对x的n+1位四舍五入，试写出映射函数4如

果你现在要开发一种语言，现要设计一随机函数Random(m),可以去系统时间为参数，那么Random(m)

=_____________5现有一文件长度为133939443939433字节，要求最大限度的压缩，请写出压缩后的文件必须存

在的东西6现有四点，a(4,6),b(6,3),c(13,30),d(93,2),请用你熟悉的语言编写一程序，求出直线ab,cd的夹角

 一道变态面试题。 Servlet在运行时，是单线程还是多线程？？Servlet在编写时，是单线程还是多线程？？
运行时是多线程，编写时怎么去算什么线程，要算也就算单线程

好，最长见的1、你说说县城和进城的区别2、你写个程序，把数字转化为中文的念法3、将一个文件的内容顺序

反过来写，不许用第三个文件4、说出HttpServlet中的10个方法5、讲讲servlet的生命周期6、如果oracle、

sqlserver的字段是varchar(10),那么插入“aaa”取出来的长度是多少7、为什么oracle对表修改了一个字段，

而相关这个表的存储过程要重见，虽然并没有用到哪个字段8、在linux中wc是命令是干什么的？（注意不是指

厕所）1、你说说县城和进城的区别 县城是名词，进程是动词 哈哈这个比较基本，我想搞程序的都能理解线程

，进程2、你写个程序，把数字转化为中文的念法 这个也不难，找找规律，没做过，我做一个大约1个多点吧，

估计。是个完整的3、将一个文件的内容顺序反过来写，不许用第三个文件 最简单，读出字符串，翻转字符串

，现成的方法，然后写入文件4、说出HttpServlet中的10个方法 光这么说挺费劲，遇到什么问题，解决的时候

就想起来了，不过10个还差不多，再多有点记不住。5、讲讲servlet的生命周期基础知识，基础知识^_^ 6、如

果oracle、sqlserver的字段是varchar(10),那么插入“aaa”取出来的长度是多少 是3对吧，可变长的，实在

不知道用的时候测试一下就知道了7、为什么oracle对表修改了一个字段，而相关这个表的存储过程要重见，虽

然并没有用到哪个字段算了，不查资料了，不过用到查查估计能明白 -- 不会 8、在linux中wc是命令是干什么

的？（注意不是指厕所）linux是个啥？  我出几道题考大家1、按字母顺序给国家名称排序，要求至少写出3种

方法。（笔答）（USA，China,Japan,Australia，Canada）2、请说出目前比较流行得应用服务器产品有那些。

（口述）3、XML和HTML的区别。（口述）4、EJB中的Home接口，Remote接口分别是做什么用的？（口述）

5、.IDL的是什么文件？（口述）6、请说出WSDL是什么的缩写。（笔答）7、请说出URL,URI,URN分别代表什么

。（口述）8、用JAVA县城实现一个简单的计时器。（笔答）9、写出JAVA操作XML，实现添加和删除一个NODE的

程序。（可以选用任意熟悉的JAVA API包）（笔答）10、写一个简单的TRIGGER，实现当向表1添加记录的时候

，表2也跟着添加。（笔答）11、如果你能在一个半小时里能回答完这些问题，你就算是合格的程序员了  1:查

书2：weblogic、websphere、jboss等3：不知道4：home中有创建方法，remote中是ejb提供的方法5：接口定义

语言6：web服务定义语言7：8：  1、按字母顺序给国家名称排序，要求至少写出3种方法。（笔答）（USA，

China,Japan,Australia，Canada）直接比较第一位的ascii马，如果相同在比较后面的位，哦这个玩意还要用

到一些算法，能写出一种把不只差不多的方法，用叔祖实现，用连表实现，酸不算两中 2、请说出目前比较流

行得应用服务器产品有那些。（口述）weblogic,websphere,jboss,3、XML和HTML的区别。（口述）xml 可扩展

标记语言，可以说是一种通用的数据表达方式，应用非常广泛，和java结合被认为是绝配（可移值的数据+可移

值的语言），html就不用说了 4、EJB中的Home接口，Remote接口分别是做什么用的？（口述）home 是主接口

，一般定义ejb的创建方法和不依赖于特定ejb实例的通用方法签名remote是远程组件借口，定义ejb的业务方法

签名local本地组件接口，功能同remote 5、.IDL的是什么文件？（口述）接口定义语言编写的接口定义文件 6

、请说出WSDL是什么的缩写。（笔答）不知道 7、请说出URL,URI,URN分别代表什么。（口述）url，统一资源

定位器uri，高不清楚了urn，可能是统一资源命名把 8、用JAVA县城实现一个简单的计时器。（笔答）java中

线程的实现机制不是很复杂，就几个方法，如果要应用查书就行，我觉得没必要完全记住那写方法 9、写出

JAVA操作XML，实现添加和删除一个NODE的程序。（可以选用任意熟悉的JAVA API包）（笔答）操作xml的包有

很多，我只写过一次读写xml文件的程序，不记得他的函数了 10、写一个简单的TRIGGER，实现当向表1添加记

录的时候，表2也跟着添加。（笔答）触发器没有具体实现过，不会 11、如果你能在一个半小时里能回答完这

些问题，你就算是合格的程序


JAVA相关基础知识
1、面向对象的特征有哪些方面
1.抽象：
抽象就是忽略一个主题中与当前目标无关的那些方面，以便更充分地注意与当前目标有关的方面。抽象并不打

算了解全部问题，而只是选择其中的一部分，暂时不用部分细节。抽象包括两个方面，一是过程抽象，二是数

据抽象。
2.继承：
继承是一种联结类的层次模型，并且允许和鼓励类的重用，它提供了一种明确表述共性的方法。对象的一个新

类可以从现有的类中派生，这个过程称为类继承。新类继承了原始类的特性，新类称为原始类的派生类（子类

），而原始类称为新类的基类（父类）。派生类可以从它的基类那里继承方法和实例变量，并且类可以修改或

增加新的方法使之更适合特殊的需要。
3.封装：
封装是把过程和数据包围起来，对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念，即现

实世界可以被描绘成一系列完全自治、封装的对象，这些对象通过一个受保护的接口访问其他对象。
4. 多态性：
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有

灵活、抽象、行为共享、代码共享的优势，很好的解决了应用程序函数同名问题。
2、String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的，因此不可以继承这个类、不能修改这个类。为了提高效率节省空间，我们

应该用StringBuffer类
3、int 和 Integer 有什么区别
Java 提供两种不同的类型：引用类型和原始类型（或内置类型）。Int是java的原始数据类型，Integer是java

为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
引用类型和原始类型的行为完全不同，并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法

，它们包括：大小和速度问题，这种类型以哪种类型的数据结构存储，当引用类型和原始类型用作某个类的实

例数据时所指定的缺省值。对象引用实例变量的缺省值为 null，而原始类型实例变量的缺省值与它们的类型有

关。
4、String 和StringBuffer的区别
JAVA平台提供了两个类：String和StringBuffer，它们可以储存和操作字符串，即包含多个字符的字符数据。

这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数

据要改变的时候你就可以使用StringBuffer。典型地，你可以使用StringBuffers来动态构造字符数据。
5、运行时异常与一般异常有何异同？
异常表示程序运行过程中可能出现的非正常状态，运行时异常表示虚拟机的通常操作中可能遇到的异常，是一

种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常，但是并不要求必须声明抛出未

被捕获的运行时异常。
6、说出Servlet的生命周期，并说出Servlet和CGI的区别。
Servlet被服务器实例化后，容器运行其init方法，请求到达时运行其service方法，service方法自动派遣运行

与请求对应的doXXX方法（doGet，doPost）等，当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中，它通过多线程方式运行其service方法，一个实例可以服务于多个

请求，并且其实例一般不会销毁，而CGI对每个请求都产生新的进程，服务完成后就销毁，所以效率上低于

servlet。
7、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据，此数组元素数大于实际存储的数据以便增加和插入元素，它们

都允许直接按序号索引元素，但是插入元素要涉及数组元素移动等内存操作，所以索引数据快而插入数据慢，

Vector由于使用了synchronized方法（线程安全），通常性能上较ArrayList差，而LinkedList使用双向链表实

现存储，按序号索引数据需要进行前向或后向遍历，但是插入数据时只需要记录本项的前后项即可，所以插入

速度较快。
8、EJB是基于哪些技术实现的？并说出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区

别。
    EJB包括Session Bean、Entity Bean、Message Driven Bean，基于JNDI、RMI、JAT等技术实现。
SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作，例如访问数据库、调用其他EJB组件。

EntityBean被用来代表应用系统中用到的数据。
对于客户机，SessionBean是一种非持久性对象，它实现某些在服务器上运行的业务逻辑。
对于客户机，EntityBean是一种持久性对象，它代表一个存储在持久性存储器中的实体的对象视图，或是一个

由现有企业应用程序实现的实体。
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ，这两种的 Session

Bean都可以将系统逻辑放在 method之中执行，不同的是 Stateful Session Bean 可以记录呼叫者的状态，因

此通常来说，一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然

也是逻辑组件，但是他却不负责记录使用者状态，也就是说当使用者呼叫 Stateless Session Bean 的时候，

EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之，很可能数个

使用者在执行某个 Stateless Session Bean 的 methods 时，会是同一个 Bean 的 Instance 在执行。从内存

方面来看， Stateful Session Bean 与 Stateless Session Bean 比较， Stateful Session Bean 会消耗

J2EE Server 较多的内存，然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
9、Collection 和 Collections的区别。
    Collection是集合类的上级接口，继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类，他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等

操作。
10、&和&&的区别。
    &是位运算符，表示按位与运算，&&是逻辑运算符，表示逻辑与（and）。
11、HashMap和Hashtable的区别。
    HashMap是Hashtable的轻量级实现（非线程安全的实现），他们都完成了Map接口，主要区别在于HashMap

允许空（null）键值（key）,由于非线程安全，效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value，而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人

引起误解。
Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在多个线程访问Hashtable时，不需要自

己为它的方法实现同步，而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。
12、final, finally, finalize的区别。
    final 用于声明属性，方法和类，分别表示属性不可变，方法不可覆盖，类不可继承。
finally是异常处理语句结构的一部分，表示总是执行。
finalize是Object类的一个方法，在垃圾收集器执行的时候会调用被回收对象的此方法，可以覆盖此方法提供

垃圾收集时的其他资源回收，例如关闭文件等。
13、sleep() 和 wait() 有什么区别?
    sleep是线程类（Thread）的方法，导致此线程暂停执行指定时间，给执行机会给其他线程，但是监控状态

依然保持，到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法，对此对象调用wait方法导致本线程放弃对象锁，进入等待此对象的等待锁定池，只有

针对此对象发出notify方法（或notifyAll）后本线程才进入对象锁定池准备获得对象锁进入运行状态。
14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性

的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称

和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，

父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的

参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
15、error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样
的情况。
    exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。


16、同步和异步有何异同，在什么情况下分别使用他们？举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到，或者正在读的数据可能已经被另一

个线程写过了，那么这些数据就是共享数据，必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法，并且不希望让程序等待方法的返回时，就应

该使用异步编程，在很多情况下采用异步途径往往更有效率。
17、abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的

类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变

量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract

类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。

知道其行为的其它类可以在类中实现这些方法。
接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得

。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与

子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有

这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使

用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，

instanceof 运算符可以用来决定某对象的类是否实现了接口。
18、heap和stack有什么区别。
栈是一种线形集合，其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
堆是栈的一个组成元素
19、forward 和redirect的区别
forward是服务器请求资源，服务器直接访问目标地址的URL，把那个URL的响应内容读取过来，然后把这些内容

再发给浏览器，浏览器根本不知道服务器发送的内容是从哪儿来的，所以它的地址栏中还是原来的地址。
    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址，一般来说浏览器会用刚

才请求的所有参数重新请求，所以session,request参数都可以获取。
20、EJB与JAVA BEAN的区别？
Java Bean 是可复用的组件，对Java Bean并没有严格的规范，理论上讲，任何一个Java类都可以是一个Bean。

但通常情况下，由于Java Bean是被容器所创建（如Tomcat）的，所以Java Bean应具有一个无参的构造器，另

外，通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中

的本地进程内COM组件，它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM，即分布式组件。它是

基于Java的远程方法调用（RMI）技术的，所以EJB可以被远程访问（跨进程、跨计算机）。但EJB必须被布署在

诸如Webspere、WebLogic这样的容器中，EJB客户从不直接访问真正的EJB组件，而是通过其容器访问。EJB容器

是EJB组件的代理，EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。
21、Static Nested Class 和 Inner Class的不同。
    Static Nested Class是被声明为静态（static）的内部类，它可以不依赖于外部类实例被实例化。而通常

的内部类需要在外部类实例化后才能实例化。
22、JSP中动态INCLUDE与静态INCLUDE的区别？
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含

文件中的变化，适合用于包含动态页面，并且可以带参数。
静态INCLUDE用include伪码实现,定不会检查所含文件的变化，适用于包含静态页面<%@ include

file="included.htm" %>
23、什么时候用assert。
    assertion(断言)在软件开发中是一种常用的调试方式，很多开发语言中都支持这种机制。在实现中，

assertion就是在程序中的一条语句，它对一个boolean表达式进行检查，一个正确程序必须保证这个boolean表

达式的值为true；如果该值为false，说明程序已经处于不正确的状态下，系统将给出警告或退出。一般来说，

assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能，在

软件发布后，assertion检查通常是关闭的。
24、GC是什么? 为什么要有GC?
    GC是垃圾收集的意思（Gabage Collection）,内存处理是编程人员容易出现问题的地方，忘记或者错误的

内存回收会导致程序或系统的不稳定甚至崩溃，Java提供的GC功能可以自动监测对象是否超过作用域从而达到

自动回收内存的目的，Java语言没有提供释放已分配内存的显示操作方法。
25、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    short s1 = 1; s1 = s1 + 1; （s1+1运算结果是int型，需要强制转换类型）
short s1 = 1; s1 += 1;（可以正确编译）
26、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
    Math.round(11.5)==12
Math.round(-11.5)==-11
round方法返回与参数最接近的长整数，参数加1/2后求其floor.
27、String s = new String("xyz");创建了几个String Object?
    两个
28、设计4个线程，其中两个线程每次对j增加1，另外两个线程对j每次减少1。写出程序。
以下程序使用内部类实现线程，对j增减的时候没有考虑顺序问题。
public class ThreadTest1{
  private int j;
  public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
  private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
  }
  private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
  }
  class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
  }
  class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
 }
  }
}
29、Java有没有goto?
java中的保留字，现在没有在java中使用。
30、启动一个线程是用run()还是start()?
启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并

执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。


31、EJB包括（SessionBean,EntityBean）说出他们的生命周期，及如何管理事务的？
SessionBean：Stateless Session Bean 的生命周期是由容器决定的，当客户机发出请求要建立一个Bean的实

例时，EJB容器不一定要创建一个新的Bean的实例供客户机调用，而是随便找一个现有的实例提供给客户机。当

客户机第一次调用一个Stateful Session Bean 时，容器必须立即在服务器中创建一个新的Bean实例，并关联

到客户机上，以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的

Bean实例。
EntityBean：Entity Beans能存活相对较长的时间，并且状态是持续的。只要数据库中的数据存在，Entity

beans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了，Entity beans也是存活的

。Entity Beans生命周期能够被容器或者 Beans自己管理。
EJB通过以下技术管理实务：对象管理组织（OMG）的对象实务服务（OTS），Sun Microsystems的Transaction

Service（JTS）、Java Transaction API（JTA），开发组（X/Open）的XA接口。
32、应用服务器有那些？
BEA WebLogic Server，IBM WebSphere Application Server，Oracle9i Application Server，jBoss，Tomcat
33、给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException,

CannotRedoException, CannotUndoException, ClassCastException, CMMException,

ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException,

IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,

ImagingOpException, IndexOutOfBoundsException, MissingResourceException,

NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException,

ProviderException, RasterFormatException, SecurityException, SystemException,

UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
34、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明

确的构造函数。
35、List, Set, Map是否继承自Collection接口?
    List，Set是，Map不是
36、说出数据连接池的工作机制是什么?
J2EE服务器启动时会建立一定数量的池连接，并一直维持不少于此数目的池连接。客户端程序需要连接时，池

驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接，池驱动程序就新建一定数量的

连接，新建连接的数量有配置参数决定。当使用的池连接调用完成后，池驱动程序将此连接表记为空闲，其他

调用就可以使用这个连接。
37、abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?
    都不能
38、数组有没有length()这个方法? String有没有length()这个方法？
数组没有length()这个方法，有length的属性。String有有length()这个方法。
39、Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
    equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容

和类型相配的话，返回真值。
40、构造器Constructor是否可被override?
构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。
41、是否可以继承String类?
String类是final类故不可以继承。
42、swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?
switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short

、 char 或者 byte。long,string 都不能作用于swtich。
43、try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行

，在return前还是后?
会执行，在return前执行。
44、编程题: 用最有效率的方法算出2乘以8等於几?
2 << 3
45、两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?
不对，有相同的hash code。
46、当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么

这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对

该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。
47、当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?
不能，一个对象的一个synchronized方法只能由一个线程访问。
48、编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时

实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
        //在自己内部定义自己一个实例，是不是很奇怪？
        //注意这是private 只供内部调用
        private static Singleton instance = new Singleton();
        //这里提供了一个供外部访问本class的静态方法，可以直接访问
        public static Singleton getInstance() {
            return instance;
        }
    }
    第二种形式:
public class Singleton {
    private static Singleton instance = null;
    public static synchronized Singleton getInstance() {
    //这个方法比上面有所改进，不用每次都进行生成对象，只是第一次
    //使用时生成实例，提高了效率！
    if (instance==null)
        instance＝new Singleton();
return instance; 　　}
}
其他形式:
定义一个类，它的构造函数为private的，所有方法为static的。
一般认为第一种形式要更加安全些
49、Java的接口和C++的虚类的相同和不同处。
由于Java不支持多继承，而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性，现有的单继承

机制就不能满足要求。与继承相比，接口有更高的灵活性，因为接口中没有任何实现代码。当一个类实现了接

口以后，该类要实现接口里面所有的方法和属性，并且接口里面的属性在默认状态下面都是public static,所

有方法默认情况下是public.一个类可以实现多个接口。
50、Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时，JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情

况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象

时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查，程序员可以创建自己的

异常，并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
51、垃圾回收的优点和原理。并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制，使c++程序员最头疼的内存管理的问题迎刃而解，它使得

Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制，Java中的对象不再有"作用域"

的概念，只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露，有效的使用可以使用的内存。垃

圾回收器通常是作为一个单独的低级别的线程运行，不可预知的情况下对内存堆中已经死亡的或者长时间没有

使用的对象进行清楚和回收，程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机

制有分代复制垃圾回收和标记垃圾回收，增量垃圾回收。
52、请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态，并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态，是一个静态方法，调用此方法要捕捉InterruptedException异

常。
notify():唤醒一个处于等待状态的线程，注意的是在调用此方法的时候，并不能确切的唤醒某一个等待状态的

线程，而是由JVM确定唤醒哪个线程，而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程，注意并不是给所有唤醒线程一个对象的锁，而是让它们竞争。
53、你所知道的集合类都有哪些？主要方法？
最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector，它们是可变大小的列表，比

较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对（称作"键"和"值"），其中每个键映射到

一个值。
54、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。

它负责在运行时查找和装入类文件的类。
55、char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的，因为java中以unicode编码，一个char占16个字节，所以放一个中文是没问题的
56、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法，分别是继承Thread类与实现Runnable接口
同步的实现方面有两种，分别是synchronized,wait与notify
57、JSP的内置对象及方法。
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息，并且提供了几个用于获取cookie,

header, 和session数据的有用的方法。
    response表示HttpServletResponse对象，并提供了几个用于设置送回 浏览器的响应的方法（如cookies,

头信息等）
    out对象是javax.jsp.JspWriter的一个实例，并提供了几个方法使你能用于向浏览器回送输出结果。
    pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、

servlet相关的对象的API，并且包装了通用的servlet相关功能的方法。
    session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
    applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境

的信息
    config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
    page表示从该页面产生的一个servlet实例
58、线程的基本概念、线程的基本状态以及状态之间的关系
线程指在程序执行过程中，能够执行程序代码的一个执行单位，每个程序至少都有一个线程，也就是程序本身

。
Java中的线程有四种状态分别是：运行、就绪、挂起、结束。
59、JSP的常用指令
<%@page language="java" contenType="text/html;charset=gb2312" session="true" buffer="64kb"

autoFlush="true" isThreadSafe="true" info="text" errorPage="error.jsp" isErrorPage="true"

isELIgnored="true" pageEncoding="gb2312" import="java.sql.*"%>
isErrorPage(是否能使用Exception对象)，isELIgnored(是否忽略表达式)
<%@include file="filename"%>
<%@taglib prefix="c"uri="http://......"%>
60、什么情况下调用doGet()和doPost()？
Jsp页面中的form标签里的method属性为get时调用doGet()，为post时调用doPost()。
61、servlet的生命周期
web容器加载servlet，生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用

service()方法实现，根据请求的不同调用不同的do***()方法。结束服务，web容器调用servlet的destroy()方

法。
62、如何现实servlet的单线程模式
<%@ page isThreadSafe="false"%>
63、页面间对象传递的方法
request，session，application，cookie等
64、JSP和Servlet有哪些相同点和不同点，他们之间的联系是什么？
JSP是Servlet技术的扩展，本质上是Servlet的简易方式，更强调应用的外表表达。JSP编译后是"类servlet"。

Servlet和JSP最主要的不同点在于，Servlet的应用逻辑是在Java文件中，并且完全从表示层中的HTML里分离开

来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图，Servlet主要用于控制逻

辑。
65、四种会话跟踪技术
会话作用域ServletsJSP 页面描述
page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类（可以带有任何的

include 指令，但是没有 include 动作）表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面
request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面，涉及多个

Web 组件（由于 forward 指令和 include 动作的关系）
session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越

多个客户机请求
application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序，包括多个

页面、请求和会话的一个全局作用域


66、Request对象的主要方法：
setAttribute(String name,Object)：设置名字为name的request的参数值
getAttribute(String name)：返回由name指定的属性值
getAttributeNames()：返回request对象所有属性的名字集合，结果是一个枚举的实例
getCookies()：返回客户端的所有Cookie对象，结果是一个Cookie数组
getCharacterEncoding()：返回请求中的字符编码方式
getContentLength()：返回请求的Body的长度
getHeader(String name)：获得HTTP协议定义的文件头信息
getHeaders(String name)：返回指定名字的request Header的所有值，结果是一个枚举的实例
getHeaderNames()：返回所以request Header的名字，结果是一个枚举的实例
getInputStream()：返回请求的输入流，用于获得请求中的数据
getMethod()：获得客户端向服务器端传送数据的方法
getParameter(String name)：获得客户端传送给服务器端的有name指定的参数值
getParameterNames()：获得客户端传送给服务器端的所有参数的名字，结果是一个枚举的实例
getParameterValues(String name)：获得有name指定的参数的所有值
getProtocol()：获取客户端向服务器端传送数据所依据的协议名称
getQueryString()：获得查询字符串
getRequestURI()：获取发出请求字符串的客户端地址
getRemoteAddr()：获取客户端的IP地址
getRemoteHost()：获取客户端的名字
getSession([Boolean create])：返回和请求相关Session
getServerName()：获取服务器的名字
getServletPath()：获取客户端所请求的脚本文件的路径
getServerPort()：获取服务器的端口号
removeAttribute(String name)：删除请求中的一个属性
67、J2EE是技术还是平台还是框架？
    J2EE本身是一个标准，一个为企业分布式应用的开发提供的标准平台。
    J2EE也是一个框架，包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
68、我们在web应用开发过程中经常遇到输出某种编码的字符，如iso8859-1等，如何输出一个某种编码的字符

串？
  Public String translate (String str) {
    String tempStr = "";
    try {
      tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
      tempStr = tempStr.trim();
    }
    catch (Exception e) {
      System.err.println(e.getMessage());
    }
    return tempStr;
  }
69、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。
区别主要答两点：a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型
b.逻辑操作不会产生短路
70、XML文档定义有几种形式？它们之间有何本质区别？解析XML文档有哪几种方式？
a: 两种形式 dtd  schema，b: 本质区别:schema本身是xml的，可以被XML解析器解析(这也是从DTD上发展

schema的根本目的)，c:有DOM,SAX,STAX等
    DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的，这种结构占用的内存较

多，而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件，不需要一次全部装载整个文件。当遇到

像文件开头，文档结束，或者标签开头与标签结束时，它会触发一个事件，用户通过在其回调事件中写入处理

代码来处理XML文件，适合对XML的顺序访问
    STAX:Streaming API for XML (StAX)
71、简述synchronized和java.util.concurrent.locks.Lock的异同 ？
主要相同点：Lock能完成synchronized所实现的所有功能
主要不同点：Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁，而Lock一

定要求程序员手工释放，并且必须在finally从句中释放。
72、EJB的角色和三个对象
一个完整的基于EJB的分布式计算结构由六个角色组成，这六个角色可以由不同的开发商提供，每个角色所作的

工作必须遵循Sun公司提供的EJB规范，以保证彼此之间的兼容性。这六个角色分别是EJB组件开发者

（Enterprise Bean Provider） 、应用组合者（Application Assembler）、部署者（Deployer）、EJB 服务

器提供者（EJB Server Provider）、EJB 容器提供者（EJB Container Provider）、系统管理员（System

Administrator）
三个对象是Remote（Local）接口、Home（LocalHome）接口，Bean类
73、EJB容器提供的服务
主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。
74、EJB规范规定EJB中禁止的操作有哪些？
    1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等)，2.不能操作awt，3.不能实现

服务器功能，4.不能对静态属生存取，5.不能使用IO操作直接存取文件系统，6.不能加载本地库.，7.不能将

this作为变量和返回，8.不能循环调用。
75、remote接口和home接口主要作用
remote接口定义了业务方法，用于EJB客户端调用业务方法。
home接口是EJB工厂用于创建和移除查找EJB实例
76、bean 实例的生命周期
对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理，而对于Entity Bean

和Statefull Session Bean存在Cache管理，通常包含创建实例，设置上下文、创建EJB Object（create）、业

务方法调用、remove等过程，对于存在缓冲池管理的Bean，在create之后实例并不从内存清除，而是采用缓冲

池调度机制不断重用实例，而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中

实例数量。
77、EJB的激活机制
以Stateful Session Bean 为例：其Cache大小决定了内存中可以同时存在的Bean实例的数量，根据MRU或NRU算

法，实例在激活和去激活状态之间迁移，激活机制是当客户端调用某个EJB实例业务方法时，如果对应EJB

Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中（通过序列化机制存储实例）回复（激活）

此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。
78、EJB的几种类型
会话（Session）Bean ，实体（Entity）Bean 消息驱动的（Message Driven）Bean
会话Bean又可分为有状态（Stateful）和无状态（Stateless）两种
实体Bean可分为Bean管理的持续性（BMP）和容器管理的持续性（CMP）两种
79、客服端调用EJB对象的几个基本步骤
设置JNDI服务工厂以及JNDI服务地址系统属性，查找Home接口，从Home接口调用Create方法创建Remote接口，

通过Remote接口调用其业务方法。
80、如何给weblogic指定大小的内存?
在启动Weblogic的脚本中（位于所在Domian对应服务器目录下的startServerName），增加set MEM_ARGS=-

Xms32m -Xmx200m，可以调整最小内存为32M，最大200M
81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv

文件，增加set PRODUCTION_MODE=true。
82、如何启动时不需输入用户名与密码?
修改服务启动文件，增加 WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码.
83、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配

置后,实际保存在什么文件中?
保存在此Domain的config.xml文件中，它是服务器的核心配置文件。
84、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏

览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写

的javaBean该如何办?
Domain目录\服务器目录\applications，将应用目录放在此目录下将可以作为应用访问，如果是Web应用，应用

目录需要满足Web应用目录要求，jsp文件可以直接放在应用目录中，Javabean需要放在应用目录的WEB-INF目录

的classes目录中，设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。
85、在weblogic中发布ejb需涉及到哪些配置文件
不同类型的EJB涉及的配置文件不同，都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体

Bean一般还需要weblogic-cmp-rdbms-jar.xml


86、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置
缺省安装中使用DemoIdentity.jks和DemoTrust.jks  KeyStore实现SSL，需要配置服务器使用Enable SSL，配

置其端口，在产品模式下需要从CA获取私有密钥和数字证书，创建identity和trust keystore，装载获得的密

钥和数字证书。可以配置此SSL连接是单向还是双向的。
87、如何查看在weblogic中已经发布的EJB?
可以使用管理控制台，在它的Deployment中可以查看所有已发布的EJB
88、CORBA是什么?用途是什么?
CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture)，由对象管理组织

(Object Management Group，缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为

联编)和允许应用程序间互操作的协议。 其目的为：用不同的程序设计语言书写在不同的进程中运行，为不同

的操作系统开发。
89、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
  Session Facade Pattern：使用SessionBean访问EntityBean
Message Facade Pattern：实现异步调用
EJB Command Pattern：使用Command JavaBeans取代SessionBean，实现轻量级访问
Data Transfer Object Factory：通过DTO Factory简化EntityBean数据提供特性
Generic Attribute Access：通过AttibuteAccess接口简化EntityBean数据提供特性
Business Interface：通过远程（本地）接口和Bean类实现相同接口规范业务逻辑一致性
ＥＪＢ架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂

，项目队伍越庞大则越能体现良好设计的重要性。
90、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此

MDB可用的时候发送过来，而non－persistent方式的消息将被丢弃。
91、Servlet执行时一般实现哪几个方法？
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
92、j2ee常用的设计模式？说明工厂模式。
    Java中的23种设计模式：
Factory（工厂模式），      Builder（建造模式），       Factory Method（工厂方法模式），
Prototype（原始模型模式），Singleton（单例模式），    Facade（门面模式），
Adapter（适配器模式），    Bridge（桥梁模式），        Composite（合成模式），
Decorator（装饰模式），    Flyweight（享元模式），     Proxy（代理模式），
Command（命令模式），      Interpreter（解释器模式）， Visitor（访问者模式），
Iterator（迭代子模式），   Mediator（调停者模式），    Memento（备忘录模式），
Observer（观察者模式），   State（状态模式），         Strategy（策略模式），
Template Method（模板方法模式）， Chain Of Responsibleity（责任链模式）
工厂模式：工厂模式是一种经常被使用到的模式，根据工厂模式实现的类可以根据提供的数据生成一组类中某

一个类的实例，通常这一组类有一个公共的抽象父类并且实现了相同的方法，但是这些方法针对不同的数据进

行了不同的操作。首先需要定义一个基类，该类的子类通过不同的方法实现了基类中的方法。然后需要定义一

个工厂类，工厂类可以根据条件生成不同的子类实例。当得到子类的实例后，开发人员可以调用基类中的方法

而不必考虑到底返回的是哪一个子类的实例。
93、EJB需直接实现它的业务接口或Home接口吗，请简述理由。
远程接口和Home接口不需要直接实现，他们的实现代码是由服务器产生的，程序运行中对应实现类会作为对应

接口类型的实例被使用。
94、排序都有哪几种方法？请列举。用JAVA实现一个快速排序。
    排序的方法有：插入排序（直接插入排序、希尔排序），交换排序（冒泡排序、快速排序），选择排序（

直接选择排序、堆排序），归并排序，分配排序（箱排序、基数排序）
快速排序的伪代码。
/ /使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e，该元素为支点
把余下的元素分割为两段left 和r i g h t，使得l e f t中的元素都小于等于支点，而right 中的元素都大于

等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t
95、请对以下在J2EE中常用的名词进行解释(或简单描述)
web容器：给处于其中的应用程序组件（JSP，SERVLET）提供一个环境，使JSP,SERVLET直接更容器中的环境变

量接口交互，不必关注其它系统问题。主要有WEB服务器来实现。例如：TOMCAT,WEBLOGIC,WEBSPHERE等。该容

器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的

WEB容器。
EJB容器：Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。

只要满足J2EE规范的EJB放入该容器，马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统

级别的服务。例如邮件服务、事务管理。
JNDI：（Java Naming & Directory Interface）JAVA命名目录服务。主要提供的功能是：提供一个目录系统，

让其它各地的应用程序在其上面留下自己的索引，从而满足快速查找和定位分布式应用程序的功能。
JMS：（Java Message Service）JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA：（Java Transaction API）JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即

可。
JAF：（Java Action FrameWork）JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署

和自定义实现自己的个性安全控制策略。
RMI/IIOP:（Remote Method Invocation /internet对象请求中介协议）他们主要用于通过远程调用服务。例如

，远程有一台计算机上运行一个程序，它提供股票分析服务，我们可以在本地计算机上实现对其直接调用。当

然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
96、JAVA语言如何进行异常处理，关键字：throws,throw,try,catch,finally分别代表什么意义？在try块中可

以抛出异常吗？
Java通过面向对象的方法进行异常处理，把各种不同的异常进行分类，并提供了良好的接口。在Java中，每个

异常都是一个对象，它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象，该对象

中包含有异常信息，调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来

实现的：try、catch、throw、throws和finally。一般情况下是用try来执行一段程序，如果出现异常，系统会

抛出（throws）一个异常，这时候你可以通过它的类型来捕捉（catch）它，或最后（finally）由缺省处理器

来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面，应包含一个catch子句来指定你想要捕捉的"异

常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句，在这个成员函数内部写另一个try语句保护其他代码。每当遇

到一个try语句，"异常"的框架就放到堆栈上面，直到所有的try语句都完成。如果下一级的try语句没有对某种

"异常"进行处理，堆栈就会展开，直到遇到有处理这种"异常"的try语句。
97、一个".java"源文件中是否可以包括多个类（不是内部类）？有什么限制？
可以。必须只有一个类名与文件名相同。
98、MVC的各个部分都有那些技术来实现?如何实现?
MVC是Model－View－Controller的简写。"Model" 代表的是应用的业务逻辑（通过JavaBean，EJB组件实现），

"View" 是应用的表示面（由JSP页面产生），"Controller" 是提供应用的处理过程控制（一般是一个Servlet

），通过这种设计模型把应用逻辑，处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用

。
99、java中有几种方法可以实现一个线程？用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使

用？
有两种实现方法，分别是继承Thread类与实现Runnable接口
用synchronized关键字修饰同步方法
反对使用stop()，是因为它不安全。它会解除由线程获取的所有锁定，而且如果对象处于一种不连贯状态，那

么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。

调用suspend()的时候，目标线程会停下来，但却仍然持有在这之前获得的锁定。此时，其他任何线程都不能访

问锁定的资源，除非被"挂起"的线程恢复运行。对任何线程来说，如果它们想恢复目标线程，同时又试图使用

任何一个锁定的资源，就会造成死锁。所以不应该使用suspend()，而应在自己的Thread类中置入一个标志，指

出线程应该活动还是挂起。若标志指出线程应该挂起，便用wait()命其进入等待状态。若标志指出线程应当恢

复，则用一个notify()重新启动线程。
100、java中有几种类型的流？JDK为每种类型的流提供了一些抽象类以供继承，请说出他们分别是哪些类？
字节流，字符流。字节流继承于InputStream \ OutputStream，字符流继承于InputStreamReader \

OutputStreamWriter。在java.io包中还有许多其他的流，主要是为了提高性能和使用方便。
101、java中会存在内存泄漏吗，请简单描述。
会。如：int i,i2;  return (i-i2);   //when i为足够大的正数,i2为足够大的负数。结果会造成溢位，导致

错误。
102、java中实现多态的机制是什么？
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性

的一种表现，重载Overloading是一个类中多态性的一种表现。
103、垃圾回收器的基本原理是什么？垃圾回收器可以马上回收内存吗？有什么办法主动通知虚拟机进行垃圾回

收？
对于GC来说，当程序员创建对象时，GC就开始监控这个对象的地址、大小以及使用情况。通常，GC采用有向图

的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的"，哪些对象是"不可达的"。

当GC确定一些对象为"不可达"时，GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc()，通

知GC运行，但是Java语言规范并不保证GC一定会执行。
104、静态变量和实例变量的区别？
static i = 10; //常量
   class A a;  a.i =10;//可变
105、什么是java序列化，如何实现java序列化？
序列化就是一种用来处理对象流的机制，所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行

读写操作，也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题

。
序列化的实现：将需要被序列化的类实现Serializable接口，该接口没有需要实现的方法，implements

Serializable只是为了标注该对象是可被序列化的，然后使用一个输出流(如：FileOutputStream)来构造一个

ObjectOutputStream(对象流)对象，接着，使用ObjectOutputStream对象的writeObject(Object obj)方法就可

以将参数为obj的对象写出(即保存其状态)，要恢复的话则用输入流。
106、是否可以从一个static方法内部发出对非static方法的调用？
不可以,如果其中包含对象的method()；不能保证对象初始化.
107、写clone()方法时，通常都有一行代码，是什么？
Clone 有缺省行为，super.clone();他负责产生正确大小的空间，并逐位复制。
108、在JAVA中，如何跳出当前的多重嵌套循环？
用break; return 方法。
109、List、Map、Set三个接口，存取元素时，各有什么特点？
List 以特定次序来持有元素，可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值，

value可多值。
110、J2EE是什么？
J2EE是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模

型(enterpriese application model).在这样的一个应用系统中，可按照功能划分为不同的组件，这些组件又

可在不同计算机上，并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组

件,Business层和组件,企业信息系统(EIS)层。
111、UML方面
标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。
112、说出一些常用的类，包，接口，请各举5个
常用的类：BufferedReader  BufferedWriter  FileReader  FileWirter  String  Integer
常用的包：java.lang  java.awt  java.io  java.util  java.sql
常用的接口：Remote  List  Map  Document  NodeList
113、开发中都用到了那些设计模式?用在什么场合?
每个模式都描述了一个在我们的环境中不断出现的问题，然后描述了该问题的解决方案的核心。通过这种方式

，你可以无数次地使用那些已有的解决方案，无需在重复相同的工作。主要用到了MVC的设计模式。用来开发

JSP/Servlet或者J2EE的相关应用。简单工厂模式等。
114、jsp有哪些动作?作用分别是什么?
JSP共有以下6种基本动作 jsp:include：在页面被请求的时候引入一个文件。 jsp:useBean：寻找或者实例化

一个JavaBean。 jsp:setProperty：设置JavaBean的属性。 jsp:getProperty：输出某个JavaBean的属性。

jsp:forward：把请求转到一个新的页面。 jsp:plugin：根据浏览器类型为Java插件生成OBJECT或EMBED标记。
115、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)

interface(接口)?
可以继承其他类或完成其他接口，在swing编程中常用此方式。
116、应用服务器与WEB SERVER的区别？
应用服务器：Weblogic、Tomcat、Jboss
WEB SERVER：IIS、 Apache
117、BS与CS的联系与区别。
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机，并采用大型数据库系统，如

Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。
B/Ｓ是Brower/Server的缩写，客户机上只要安装一个浏览器（Browser），如Netscape Navigator或Internet

Explorer，服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下，用户界面完全通过

WWW浏览器实现，一部分事务逻辑在前端实现，但是主要事务逻辑在服务器端实现。浏览器通过Ｗeb Server 同

数据库进行数据交互。
C/S 与 B/S 区别：
１．硬件环境不同:
    C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换

服务.
    B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比

C/S更强的适应范围, 一般只要有操作系统和浏览器就行
２．对安全要求不同
    C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适

宜. 可以通过B/S发布部分可公开信息.
    B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
３．对程序架构不同
    C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.
    B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的

程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统.

SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.
４．软件重用不同
    C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
    B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做

在墙上的石头桌子
５．系统维护不同
    C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系

统
    B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安

装就可以实现升级.
６．处理问题不同
    C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系

统
    B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.
７．用户接口不同
    C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高
    B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.
８．信息流不同
    C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
    B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。
118、LINUX下线程，GDI类的解释。
LINUX实现的就是基于核心轻量级进程的"一对一"线程模型，一个线程实体对应一个核心轻量级进程，而线程之

间的管理在核外函数库中实现。
GDI类为图像设备编程接口类库。
119、STRUTS的应用(如STRUTS架构)
Struts是采用Java Servlet/JavaServer Pages技术，开发Web应用程序的开放源码的framework。 采用Struts

能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能： 一.包含一个

controller servlet，能将用户的请求发送到相应的Action对象。 二.JSP自由tag库，并且在controller

servlet中提供关联支持，帮助开发员创建交互式表单应用。 三.提供了一系列实用对象：XML处理、通过Java

reflection APIs自动处理JavaBeans属性、国际化的提示和消息。
120、Jdo是什么?
JDO是Java对象持久化的新的规范，为java data object的简称,也是一个用于存取某种数据仓库中的对象的标

准化API。JDO提供了透明的对象存储，因此对开发人员来说，存储数据对象完全不需要额外的代码（如JDBC

API的使用）。这些繁琐的例行工作已经转移到JDO产品提供商身上，使开发人员解脱出来，从而集中时间和精

力在业务逻辑上。另外，JDO很灵活，因为它可以在任何数据底层上运行。JDBC只是面向关系数据库（RDBMS）

JDO更通用，提供到任何数据底层的存储功能，比如关系数据库、文件、XML以及对象数据库（ODBMS）等等，使

得应用可移植性更强。
121、内部类可以引用他包含类的成员吗？有没有什么限制？
一个内部类对象可以访问创建它的外部类对象的内容
122、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
Web ServiceWeb Service是基于网络的、分布式的模块化组件，它执行特定的任务，遵守具体的技术规范，这

些规范使得Web Service能与其他兼容的组件进行互操作。
JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只

要使用这些通用的接口，当你需要改变具体的实现时候也不需要修改代码。
JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。
WSDL是一种 XML 格式，用于将网络服务描述为一组端点，这些端点对包含面向文档信息或面向过程信息的消息

进行操作。这种格式首先对操作和消息进行抽象描述，然后将其绑定到具体的网络协议和消息格式上以定义端

点。相关的具体端点即组合成为抽象端点（服务）。
SOAP即简单对象访问协议(Simple Object Access Protocol)，它是用于交换XML编码信息的轻量级协议。
UDDI 的目的是为电子商务建立标准；UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心

的实现标准规范，同时也包含一组使企业能将自身提供的Web Service注册，以使别的企业能够发现的访问协议

的实现标准。