﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-咖啡时间(Coffee Time)</title><link>http://www.blogjava.net/javaruijie/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 14:53:34 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 14:53:34 GMT</pubDate><ttl>60</ttl><item><title>诊断并解决ORA-04031 错误</title><link>http://www.blogjava.net/javaruijie/archive/2007/06/20/125246.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Wed, 20 Jun 2007 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2007/06/20/125246.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/125246.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2007/06/20/125246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/125246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/125246.html</trackback:ping><description><![CDATA[<h2>当我们在共享池中试图分配大片的连续内存失败的时候，Oracle首先清除池中当前没使用的所有对象，使空闲内存块合并。如果仍然没有足够大单个的大块内存满足请求,就会产生ORA-04031 错误。 </h2>
<p>当这个错误出现的时候你得到的错误解释信息类似如下:</p>
<blockquote>
<pre>04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
// *Cause: More shared memory is needed than was allocated in the shared
// pool.
// *Action: If the shared pool is out of memory, either use the
// dbms_shared_pool package to pin large packages,
// reduce your use of shared memory, or increase the amount of
// available shared memory by increasing the value of the
// INIT.ORA parameters "shared_pool_reserved_size" and
// "shared_pool_size".
// If the large pool is out of memory, increase the INIT.ORA
// parameter "large_pool_size".
</pre>
</blockquote>
<h2>1.共享池相关的实例参数</h2>
<p>在继续之前，有必要理解下面的实例参数: </p>
<blockquote>
<ul>
    <li>SHARED_POOL_SIZE <br>这个参数指定了共享池的大小，单位是字节。可以接受数字值或者数字后面跟上后缀"K" 或 "M" 。"K"代表千字节, "M"代表兆字节。
    <li>SHARED_POOL_RESERVED_SIZE <br>指定了为共享池内存保留的用于大的连续请求的共享池空间。当共享池碎片强制使 Oracle 查找并释放大块未使用的池来满足当前的请求的时候，这个参数和SHARED_POOL_RESERVED_MIN_ALLOC 参数一起可以用来避免性能下降。
    <li>这个参数理想的值应该大到足以满足任何对保留列表中内存的请求扫描而无需从共享池中刷新对象。既然操作系统内存可以限制共享池的大小，一般来说，你应该设定这个参数为 SHARED_POOL_SIZE 参数的 10% 大小。
    <li>SHARED_POOL_RESERVED_MIN_ALLOC 这个参数的值控制保留内存的分配。如果一个足够尺寸的大块内存在共享池空闲列表中没能找到，内存就从保留列表中分配一块比这个值大的空间。默认的值对于大多数系统来说都足够了。如果你加大这个值，那么Oracle 服务器将允许从这个保留列表中更少的分配并且将从共享池列表中请求更多的内存。这个参数在Oracle 8i 和更高的版本中是隐藏的。提交如下的语句查找这个参数值:
    <pre>SELECT   nam.ksppinm NAME, val.ksppstvl VALUE
    FROM x$ksppi nam, x$ksppsv val
    WHERE nam.indx = val.indx AND nam.ksppinm LIKE '%shared%'
    ORDER BY 1;
    </pre>
    10g 注释：Oracle 10g 的一个新特性叫做 "自动内存管理" 允许DBA保留一个共享内存池来分shared pool,buffer cache, java pool 和large pool。一般来说，当数据库需要分配一个大的对象到共享池中并且不能找到连续的可用空间，将自动使用其他SGA结构的空闲空间来增加共享池的大小 。既然空间分配是Oracle自动管理的，ora-4031出错的可能性将大大降低。自动内存管理在初始化参数SGA_TARGET大于0的时候被激活。当前设定可以通过查询v$sga_dynamic_components 视图获得。请参考10g管理手册以得到更多内容 。 </li>
</ul>
</blockquote>
<h2>2.诊断ORA-04031 错误 </h2>
<p>注：大多数的常见的 ORA-4031 的产生都和 SHARED POOL SIZE 有关，这篇文章中的诊断步骤大多都是关于共享池的。　对于其它方面如Large_pool或是Java_pool，内存分配算法都是相似的，一般来说都是因为结构不够大造成。 </p>
<p>ORA-04031 可能是因为 SHARED POOL 不够大，或是因为碎片问题导致数据库不能找到足够大的内存块。</p>
ORA-04031 错误通常是因为库高速缓冲中或共享池保留空间中的碎片。 在加大共享池大小的时 候考虑调整应用,使用共享的SQL 并且调整如下的参数：
<blockquote>
<pre>SHARED_POOL_SIZE,
SHARED_POOL_RESERVED_SIZE,
SHARED_POOL_RESERVED_MIN_ALLOC.
</pre>
</blockquote>首先判定是否ORA-04031 错误是由共享池保留空间中的库高速缓冲的碎片产生的。提交下的查询：
<blockquote>
<pre>SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,
last_failure_size
FROM v$shared_pool_reserved;
</pre>
</blockquote>如果:
<blockquote>REQUEST_FAILURES &gt; 0 并且 LAST_FAILURE_SIZE &gt; SHARED_POOL_RESERVED_MIN_ALLOC </blockquote>
<p>那么ORA-04031 错误就是因为共享池保留空间缺少连续空间所致。要解决这个问题,可以考虑加大SHARED_POOL_RESERVED_MIN_ALLOC 来降低缓冲进共 享池保留空间的对象数目，并增大 SHARED_POOL_RESERVED_SIZE 和 SHARED_POOL_SIZE 来加大共享池保留空间的可用内存。</p>
如果：
<blockquote>REQUEST_FAILURES &gt; 0 并且 LAST_FAILURE_SIZE &lt; SHARED_POOL_RESERVED_MIN_ALLOC </blockquote>或者
<blockquote>REQUEST_FAILURES 等于0 并且 LAST_FAILURE_SIZE &lt; SHARED_POOL_RESERVED_MIN_ALLOC </blockquote>
<p>那么是因为在库高速缓冲缺少连续空间导致ORA-04031 错误。 </p>
<p>第一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的对象到共享池保留空间中并且加大SHARED_POOL_SIZE。 </p>
<h2>3.解决ORA-04031 错误</h2>
<ul>
    <li><strong>ORACLE BUG </strong>
    <p>Oracle推荐对你的系统打上最新的PatchSet。大多数的ORA-04031错误都和BUG 相关，可以通过使用这些补丁来避免。 </p>
    <p>下面表中总结和和这个错误相关的最常见的BUG、可能的环境和修补这个问题的补丁。 </p>
    <table>
        <tbody>
            <tr>
                <td><strong>BUG</strong></td>
                <td><strong>描述 </strong></td>
                <td><strong>Workaround</strong></td>
                <td><strong>Fixed</strong></td>
            </tr>
            <tr>
                <td>&lt;Bug:1397603&gt;</td>
                <td>ORA-4031/SGA memory leak of PERMANENT memory occurs for buffer handles </td>
                <td>_db_handles_cached = 0 </td>
                <td>901/ 8172 </td>
            </tr>
            <tr>
                <td>&lt;Bug:1640583&gt;</td>
                <td>ORA-4031 due to leak / cache buffer chain contention from AND-EQUAL access</td>
                <td>Not available</td>
                <td>8171/901</td>
            </tr>
            <tr>
                <td>&lt;Bug:1318267&gt;</td>
                <td>INSERT AS SELECT statements may<br>not be shared when they should be<br>if TIMED_STATISTICS. It can lead to ORA-4031</td>
                <td>
                <p>_SQLEXEC_PROGRESSION_COST=0 </p>
                </td>
                <td>8171/8200</td>
            </tr>
            <tr>
                <td>&lt;Bug:1193003&gt;</td>
                <td>Cursors may not be shared in 8.1<br>when they should be</td>
                <td>Not available</td>
                <td>8162/8170/ 901</td>
            </tr>
            <tr>
                <td>&lt;Bug:2104071&gt; </td>
                <td>ORA-4031/excessive "miscellaneous" shared pool usage possible. (many PINS)</td>
                <td>None-&gt; This is known to affect the XML parser. </td>
                <td>8174, 9013, 9201</td>
            </tr>
            <tr>
                <td>&lt;Note:263791.1&gt; </td>
                <td>Several number of BUGs related to ORA-4031 erros were fixed in the 9.2.0.5 patchset</td>
                <td>Not available</td>
                <td>9205</td>
            </tr>
        </tbody>
    </table>
    <br>
    <li><strong>编译Java代码时出现的ORA-4031</strong>
    <p>在你编译Java代码的时候如果内存溢出，你会看到错误：</p>
    <pre>A SQL exception occurred while compiling: :
    ORA-04031: unable to allocate bytes of shared memory
    ("shared pool","unknown object","joxlod: init h", "JOX: ioc_allocate_pal")
    </pre>
    <p>解决办法是关闭数据库然后把参数 JAVA_POOL_SIZE 设定为一个较大的值。这里错误信息中提到的 "shared pool" 其实共享全局区(SGA)溢出的误导，并不表示你需要增加SHARED_POOL_SIZE，相反，你必须加大 JAVA_POOL_SIZE 参数的值，然后重启动系统，再试一下。参考: &lt;Bug:2736601&gt; 。<br></p>
    <li><strong>小的共享池尺寸</strong>
    <p>很多情况下，共享池过小能够导致ORA-04031错误。下面信息有助于你调整共享池大小： </p>
    <ul>
        <li><strong>库高速缓冲命中率</strong>
        <p>命中率有助于你衡量共享池的使用，有多少语句需要被解析而不是重用。下面的SQL语句有助于你计算库高速缓冲的命中率： </p>
        <pre>SELECT SUM(PINS) "EXECUTIONS",
        SUM(RELOADS) "CACHE MISSES WHILE EXECUTING"
        FROM V$LIBRARYCACHE;
        </pre>
        <p>如果丢失超过1%,那么尝试通过加大共享池的大小来减少库高速缓冲丢失。</p>
        <li><strong>共享池大小计算</strong>
        <p>要计算最适合你工作负载的共享池大小，请参考：</p>
        &lt;Note:1012046.6&gt;: HOW TO CALCULATE YOUR SHARED POOL SIZE. </li>
    </ul>
    <li><strong>共享池碎片</strong>
    <p>每一次，需要被执行的SQL 或者PL/SQL 语句的解析形式载入共享池中都需要一块特定的连续的空间。数据库要扫描的第一个资源就是共享池中的空闲可用内存。一旦空闲内存耗尽，数据库要查找一块已经分配但还没使用的内存准备重用。如果这样的确切尺寸的大块内存不可用，就继续按照如下标准寻找：</p>
    <ul>
        <li>大块(chunk)大小比请求的大小大
        <li>空间是连续的
        <li>大块内存是可用的(而不是正在使用的) </li>
    </ul>
    <p>这样大块的内存被分开，剩余的添加到相应的空闲空间列表中。当数据库以这种方式操作一段时间之后，共享池结构就会出现碎片。 </p>
    <p>当共享池存在碎片的问题,分配一片空闲的空间就会花费更多的时间,数据库性能也会下降(整个操作的过程中，"chunk allocation"被一个叫做"shared pool latch" 的闩所控制) 或者是出现 ORA-04031 错误errors (在数据库不能找到一个连续的空闲内存块的时候)。 </p>
    <blockquote>参考 &lt;Note:61623.1&gt;: 可以得到关于共享池碎片的详细讨论。 </blockquote>如果SHARED_POOL_SIZE 足够大，大多数的 ORA-04031 错误都是由共享池中的动态SQL 碎片导致的。可能的原因如下：
    <ul>
        <li>非共享的SQL
        <li>生成不必要的解析调用 (软解析)
        <li>没有使用绑定变量 </li>
    </ul>
    <p>要减少碎片的产生你需要确定是前面描叙的几种可能的因素。可以采取如下的一些方法，当然不只局限于这几种: 应用调整、数据库调整或者实例参数调整。 </p>
    <blockquote>请参考 &lt;Note:62143.1&gt;，描述了所有的这些细节内容。这个注释还包括了共享池如何工作的细节。 </blockquote>
    <p>下面的视图有助于你标明共享池中非共享的SQL/PLSQL： </p>
    <ul>
        <li><strong>V$SQLAREA 视图</strong>
        <p>这个视图保存了在数据库中执行的SQL 语句和PL/SQL 块的信息。下面的SQL 语句可以显示给你带有literal 的语句或者是带有绑定变量的语句： </p>
        <pre>SELECT   SUBSTR (sql_text, 1, 40) "SQL", COUNT (*),
        SUM (executions) "TotExecs"
        FROM v$sqlarea
        WHERE executions &lt; 5
        GROUP BY SUBSTR (sql_text, 1, 40)
        HAVING COUNT (*) &gt; 30
        ORDER BY 2;
        </pre>
        <p>注: Having 后的数值 "30" 可以根据需要调整以得到更为详细的信息。 </p>
        <li><strong>X$KSMLRU 视图</strong>
        <p>这个固定表x$ksmlru 跟踪共享池中导致其它对象换出(age out)的应用。这个固定表可以用来标记是什么导致了大的应用。 </p>
        <p>如果很多对象在共享池中都被阶段性的刷新可能导致响应时间问题并且有可能在对象重载入共享池中的时候导致库高速缓冲闩竞争问题。 </p>
        <p>关于这个x$ksmlru 表的一个不寻常的地方就是如果有人从表中选取内容这个表的内容就会被擦除。这样这个固定表只存储曾经发生的最大的分配。这个值在选择后被重新设定这样接下来的大的分配可以被标记，即使它们不如先前的分配过的大。因为这样的重置，在查询提交后的结果不可以再次得到，从表中的输出的结果应该小心的保存。监视这个固定表运行如下操作： </p>
        <pre>SELECT * FROM X$KSMLRU WHERE ksmlrsiz &gt; 0;
        </pre>
        <p>这个表只可以用SYS用户登录进行查询。 </p>
        <li><strong>X$KSMSP 视图 (类似堆Heapdump信息) </strong>
        <p>使用这个视图能找出当前分配的空闲空间，有助于理解共享池碎片的程度。如我们在前面的描述，查找为游标分配的足够的大块内存的第一个地方是空闲列表( free list)。 下面的语句显示了空闲列表中的大块内存: </p>
        <pre>SELECT   '0 (&lt;140)' bucket, ksmchcls, 10 * TRUNC (ksmchsiz / 10) "From",
        COUNT (*) "Count", MAX (ksmchsiz) "Biggest",
        TRUNC (AVG (ksmchsiz)) "AvgSize", TRUNC (SUM (ksmchsiz)) "Total"
        FROM x$ksmsp
        WHERE ksmchsiz &lt; 140 AND ksmchcls = 'free'
        GROUP BY ksmchcls, 10 * TRUNC (ksmchsiz / 10)
        UNION ALL
        SELECT   '1 (140-267)' bucket, ksmchcls, 20 * TRUNC (ksmchsiz / 20),
        COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
        TRUNC (SUM (ksmchsiz)) "Total"
        FROM x$ksmsp
        WHERE ksmchsiz BETWEEN 140 AND 267 AND ksmchcls = 'free'
        GROUP BY ksmchcls, 20 * TRUNC (ksmchsiz / 20)
        UNION ALL
        SELECT   '2 (268-523)' bucket, ksmchcls, 50 * TRUNC (ksmchsiz / 50),
        COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
        TRUNC (SUM (ksmchsiz)) "Total"
        FROM x$ksmsp
        WHERE ksmchsiz BETWEEN 268 AND 523 AND ksmchcls = 'free'
        GROUP BY ksmchcls, 50 * TRUNC (ksmchsiz / 50)
        UNION ALL
        SELECT   '3-5 (524-4107)' bucket, ksmchcls, 500 * TRUNC (ksmchsiz / 500),
        COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
        TRUNC (SUM (ksmchsiz)) "Total"
        FROM x$ksmsp
        WHERE ksmchsiz BETWEEN 524 AND 4107 AND ksmchcls = 'free'
        GROUP BY ksmchcls, 500 * TRUNC (ksmchsiz / 500)
        UNION ALL
        SELECT   '6+ (4108+)' bucket, ksmchcls, 1000 * TRUNC (ksmchsiz / 1000),
        COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
        TRUNC (SUM (ksmchsiz)) "Total"
        FROM x$ksmsp
        WHERE ksmchsiz &gt;= 4108 AND ksmchcls = 'free'
        GROUP BY ksmchcls, 1000 * TRUNC (ksmchsiz / 1000);
        </pre>
        </li>
    </ul>
    </li>
</ul>
<h2><strong>4. ORA-04031 错误与 Large Pool </strong></h2>
<p>大池是个可选的内存区，为以下的操作提供大内存分配：</p>
<ul>
    <li>MTS会话内存和 Oracle XA 接口
    <li>Oracle 备份与恢复操作和I/O服务器进程用的内存(缓冲)
    <li>并行执行消息缓冲 </li>
</ul>
大池没有LRU列表。这和共享池中的保留空间不同，保留空间和共享池中其他分配的内存使用同样的LRU列表。大块内存从不会换出大池中，内存必须是显式的被每个会话分配并释放。一个请求如果没有足够的内存，就会产生类似这样的一个ORA-4031错误：
<blockquote>
<pre>ORA-04031: unable to allocate XXXX bytes of shared memory
("large pool","unknown object","session heap","frame")
</pre>
</blockquote>这个错误发生时候可以检查几件事情：
<ul>
    <li><strong>1- 使用如下语句检查 V$SGASTAT ，得知使用和空闲的内存：</strong>
    <pre>SELECT pool,name,bytes FROM v$sgastat where pool = 'large pool';
    </pre>
    <li><strong>2- 你还可以采用 heapdump level 32 来 dump 大池的堆并检查空闲的大块内存的大小</strong>
    <p>从大池分配的内存如果是LARGE_POOL_MIN_ALLOC 子节的整块数有助于避免碎片。任何请求分配小于LARGE_POOL_MIN_ALLOC 大块尺寸都将分配LARGE_POOL_MIN_ALLOC的大小。一般来说，你会看到使用大池的时候相对共享池来说要用到更多的内存。通常要解决大池中的ORA-4031错误必须增加 LARGE_POOL_SIZE 的大小。</p>
    </li>
</ul>
<br>
<h2>5. ORA-04031 和共享池刷新</h2>
<br>有一些技巧会提高游标的共享能力，从而共享池碎片和ORA-4031都会减少。<strong>最佳途径是调整应用使用绑定变量</strong>。另外在应用不能调整的时候考虑使用CURSOR_SHARING参数和FORCE不同的值来做到 (要注意那会导致执行计划改变，所以建议先对应用进行测试)。当上述技巧都不可以用的时候，并且碎片问题在系统中比较严重，刷新共享持可能有助于减轻碎片问题。但是，必须加以如下考虑：
<ul>
    <li>刷新将导致所有没被使用的游标从共享池删除。这样，在共享池刷新之后，大多数SQL和PL/SQL游标必须被硬解析。这将提高CPU的使用，也会加大Latch的活动。
    <li>当应用程序没有使用绑定变量并被许多用户进行类似的操作的时候(如在OLTP系统中) ，刷新之后很快还会出现碎片问题。所以共享池对设计糟糕的应用程序来说不是解决办法。
    <li>对一个大的共享池刷新可能会导致系统挂起，尤其是实例繁忙的时候，推荐在非高峰的时候刷新</li>
</ul>
<h2>6. ORA-04031错误的高级分析 </h2>
<p>如果前述的这些技术内容都不能解决ORA-04031 错误，可能需要额外的跟踪信息来得到问题发生的共享池的快照。 </p>
<p>调整init.ora参数添加如下的事件得到该问题的跟踪信息：</p>
<pre>event = "4031 trace name errorstack level 3"
event = "4031 trace name HEAPDUMP level 3"
</pre>
如果问题可重现，该事件可设定在会话层，在执行问题语句之前使用如下的语句：
<pre>SQL&gt; alter session set events '4031 trace name errorstack level 3';
SQL&gt; alter session set events '4031 trace name HEAPDUMP level 3';
</pre>
把这个跟踪文件发给Oracle支持人员进行排错。
<p>重要标注: Oracle 9.2.0.5 和Oracle 10g 版本中，每次在发生ORA-4031 错误的时候会自动创建一个跟踪文件，可以在user_dump_dest 目录中找到。如果你的系统是上述的版本，你不需要再进行前面描述中的步骤。 </p>
<br>
<h2>参考信息</h2>
<br><a href="http://metalink.oracle.com/"><u><font color=#0000ff>Metalink</font></u></a> - http://metalink.oracle.com <br>&lt;Note:1012046.6&gt; How to Calculate Your Shared Pool Size <br>&lt;Note:62143.1&gt; Understanding and Tuning the Shared Pool <br>&lt;Note:1012049.6&gt; Tuning Library Cache Latch Contention <br>&lt;Note:61623.1&gt; Resolving Shared Pool Fragmentation<br>&lt;Note:146599.1&gt; Diagnosing and Resolving Error ORA-04031
<img src ="http://www.blogjava.net/javaruijie/aggbug/125246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2007-06-20 10:11 <a href="http://www.blogjava.net/javaruijie/archive/2007/06/20/125246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat下JSP、Servlet和JavaBean环境的配置</title><link>http://www.blogjava.net/javaruijie/archive/2006/09/14/69742.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Thu, 14 Sep 2006 11:37:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/09/14/69742.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/69742.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/09/14/69742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/69742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/69742.html</trackback:ping><description><![CDATA[
		<font size="2">
				<br />总结了一下如何tomcat下配置jsp、servlet和Javabean。<br /><br />第一步：下载j2sdk和tomcat：到sun官方站点（ </font>
		<a href="http://java.sun.com/j2se/1.4.2/download.html）下载j2sdk，注意下载版本为Windows">
				<font size="2">http://java.sun.com/j2se/1.4.2/download.html）下载j2sdk，注意下载版本为Windows</font>
		</a>
		<font size="2"> Offline Installation的SDK，同时最好下载J2SE 1.4.2 document．tion，然后到tomcat官方站点（ </font>
		<a href="http://www.apache.org/dist/jakarta/tomcat-4/）下载tomcat（下载最新4.1.x版本的tomcat）；">
				<font size="2">http://www.apache.org/dist/jakarta/tomcat-4/）下载tomcat（下载最新4.1.x版本的tomcat）；</font>
		</a>
		<br />
		<br />
		<font size="2">第二步：安装和配置你的j2sdk和tomcat：执行j2sdk和tomcat的安装程序，然后按默认设置进行安装即可。<br />1.安装j2sdk以后，需要配置一下环境变量，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.4.2)：<br />JAVA_HOME=c:\j2sdk1.4.2<br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;（.;一定不能少，因为它代表当前路径）<br />path=%JAVA_HOME%\bin<br />接着可以写一个简单的java程序来测试J2SDK是否已安装成功：<br />public class Test{<br />public static void main(String args[]){<br />System.out.println("This is a test program.");<br />}<br />}<br />将上面的这段程序保存为文件名为Test.java的文件。<br />然后打开命令提示符窗口，cd到你的Test.java所在目录，然后键入下面的命令 <br />javac Test.java<br />java Test <br />此时如果看到打印出来This is a test program.的话说明安装成功了，如果没有打印出这句话，你需要仔细检查一下你的配置情况。<br /><br />2.安装Tomcat后，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat)：<br />CATALINA_HOME=c:\tomcat;<br />CATALINA_BASE=c:\tomcat;<br />然后修改环境变量中的classpath，把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去，修改后的classpath如下：<br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;<br />接着可以启动tomcat，在IE中访问 </font>
		<a href="http://localhost:8080，如果看到tomcat的欢迎页面的话说明安装成功了。/">
				<font size="2">http://localhost:8080，如果看到tomcat的欢迎页面的话说明安装成功了。</font>
		</a>
		<br />
		<font size="2">第三步：建立自己的jsp app目录<br />1.到Tomcat的安装目录的webapps目录，可以看到ROOT，examples, tomcat-docs之类Tomcat自带的的目录；<br />2.在webapps目录下新建一个目录，起名叫myapp；<br />3.myapp下新建一个目录WEB-INF，注意，目录名称是区分大小写的；<br />4.WEB-INF下新建一个文件web.xml，内容如下：<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br /><br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />" </font>
		<a href="http://java.sun.com/dtd/web-app_2_3.dtd">
				<font size="2">http://java.sun.com/dtd/web-app_2_3.dtd</font>
		</a>
		<font size="2">";&gt;<br /><br />&lt;web-app&gt;<br />&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br />&lt;description&gt;<br />A application for test.<br />&lt;/description&gt;<br />&lt;/web-app&gt;<br />5.在myapp下新建一个测试的jsp页面，文件名为index.jsp，文件内容如下：<br />&lt;html&gt;&lt;body&gt;&lt;center&gt;<br />Now time is: &lt;%=new java.util.Date()%&gt;<br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;<br />6.重启Tomcat<br />7.打开浏览器，输入 </font>
		<a href="http://localhost:8080/myapp/index.jsp">
				<font size="2">http://localhost:8080/myapp/index.jsp</font>
		</a>
		<font size="2"> 看到当前时间的话说明就成功了。<br /><br />第四步：建立自己的Servlet：<br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个servlet程序，文件名为Test.java，文件内容如下：<br />package test;<br />import java.io.IOException;<br />import java.io.PrintWriter;<br />import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />public class Test extends HttpServlet {<br />protected void doGet(HttpServletRequest request, HttpServletResponse response)<br />throws ServletException, IOException {<br />PrintWriter out=response.getWriter();<br />out.println("&lt;html&gt;&lt;body&gt;&lt;h1&gt;This is a servlet test.&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;");<br />out.flush();<br />}<br />}<br />2 .编译<br />将Test.java放在c:\test下，使用如下命令编译：<br />C:\Test&gt;javac Test.java<br />然后在c:\Test下会产生一个编译后的servlet文件：Test.class<br />3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下，也就是剪切那个test目录到classes目录下，如果classes目录不存在，就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构<br />4 .修改webapps\myapp\WEB-INF\web.xml，添加servlet和servlet-mapping<br />编辑后的web.xml如下所示，红色为添加的内容:<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br /><br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />" </font>
		<a href="http://java.sun.com/dtd/web-app_2_3.dtd">
				<font size="2">http://java.sun.com/dtd/web-app_2_3.dtd</font>
		</a>
		<font size="2">";&gt;<br /><br />&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br />&lt;description&gt;<br />A application for test.<br />&lt;/description&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;display-name&gt;Test&lt;/display-name&gt;<br />&lt;description&gt;A test Servlet&lt;/description&gt;<br />&lt;servlet-class&gt;test.Test&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/Test&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;/web-app&gt;<br />这段话中的servlet这一段声明了你要调用的Servlet，而servlet-mapping则是将声明的servlet“映射”到地址/Test上<br />5 .好了，启动Tomcat，启动浏览器，输入 </font>
		<a href="http://localhost:8080/myapp/Test">
				<font size="2">http://localhost:8080/myapp/Test</font>
		</a>
		<font size="2"> 如果看到输出This is a servlet test.就说明编写的servlet成功了。<br />注意：修改了web.xml以及新加了class，都要重启Tomcat<br /><br />第四步：建立自己的Bean：<br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个java程序，文件名为TestBean.java，文件内容如下：<br />package test;<br />public class TestBean{<br />private String name = null;<br />public TestBean(String strName_p){<br />this.name=strName_p;<br />} <br />public void setName(String strName_p){<br />this.name=strName_p;<br />}<br />public String getName(){<br />return this.name;<br />} <br />}<br />2 .编译<br />将TestBean.java放在c:\test下，使用如下命令编译：<br />C:\Test&gt;javac TestBean.java<br />然后在c:\Test下会产生一个编译后的bean文件：TestBean.class<br />3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下，<br />4 .新建一个TestBean.jsp文件，文件内容为：<br />&lt;%@ page import="test.TestBean" %&gt; <br />&lt;html&gt;&lt;body&gt;&lt;center&gt;<br />&lt;%<br />TestBean testBean=new TestBean("This is a test java bean.");<br />%&gt;<br />Java bean name is: &lt;%=testBean.getName()%&gt;<br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt; <br />5 .好了，重启Tomcat，启动浏览器，输入 </font>
		<a href="http://localhost:8080/myapp/TestBean.jsp">
				<font size="2">http://localhost:8080/myapp/TestBean.jsp</font>
		</a>
		<font size="2"> 如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。<br /><br />这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码，自己多动手写代码以增强自己在这方面开发的能力了。</font>
		<br />
<img src ="http://www.blogjava.net/javaruijie/aggbug/69742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-09-14 19:37 <a href="http://www.blogjava.net/javaruijie/archive/2006/09/14/69742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ORACLE游标的问题(ORA-01000: maximum open cursors exceeded) </title><link>http://www.blogjava.net/javaruijie/archive/2006/08/22/65014.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Tue, 22 Aug 2006 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/08/22/65014.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/65014.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/08/22/65014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/65014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/65014.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<p>下面的片断转载于<a href="http://www.itpub.net/">www.itpub.net</a></p>
				<p>
						<font style="BACKGROUND-COLOR: #ffffff">
								<font color="#0000ff">
										<font face="Verdana">[TIP]关于Java开发中使用Oracle数据库的一点注意事项（原创）</font>
								</font>
						</font>
				</p>
				<p>
						<font style="BACKGROUND-COLOR: #ffffff" face="verdana, arial, helvetica" color="#0000ff" size="2">很多朋友在Java开发中，使用Oracle数据库的时候，经常会碰到有ORA-01000: maximum open cursors exceeded.的错误。 <br /><br />实际上，这个错误的原因，主要还是代码问题引起的。 <br />ora-01000: maximum open cursors exceeded. <br />表示已经达到一个进程打开的最大游标数。 <br /><br />这样的错误很容易出现在Java代码中的主要原因是：Java代码在执行conn.createStatement()和conn.prepareStatement()的时候，实际上都是相当与在数据库中打开了一个cursor。尤其是，如果你的createStatement和prepareStatement是在一个循环里面的话，就会非常容易出现这个问题。因为游标一直在不停的打开，而且没有关闭。 <br /><br />一般来说，我们在写Java代码的时候，createStatement和prepareStatement都应该要放在循环外面，而且使用了这些Statment后，及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后，如果不需要使用结果集（ResultSet）的数据，就马上将Statment关闭。 <br /><br />对于出现ORA-01000错误这种情况，单纯的加大open_cursors并不是好办法，那只是治标不治本。实际上，代码中的隐患并没有解除。 <br />而且，绝大部分情况下，open_cursors只需要设置一个比较小的值，就足够使用了，除非有非常特别的要求。</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/javaruijie/aggbug/65014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-08-22 11:01 <a href="http://www.blogjava.net/javaruijie/archive/2006/08/22/65014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI命令使用大全（转帖）</title><link>http://www.blogjava.net/javaruijie/archive/2006/08/17/64170.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Thu, 17 Aug 2006 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/08/17/64170.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/64170.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/08/17/64170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/64170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/64170.html</trackback:ping><description><![CDATA[
		<h2 class="post-title">
				<font color="#000000" size="3">从shell中启动可视化编辑器 <br />vi filename 指示shell启动vi编辑器，并将参数<font style="BACKGROUND-COLOR: #ffffff">filename</font>传给它。如果当前目前中存在该文件，则vi编辑器将它解释为要打开的文件；如果没有该文件，则vi编译器创建新文件 <br />vi file1 file2 file3 shell传递3个参数给vi，vi将它们解释为要打开的文件。可以使用:w命令保存文件，使用:n命令访问下一个文件 <br />vi +# filename 打开文件，并将光标移到指定的行。例如，命令vi +100 records 从第100行开始编辑文件records <br />vi +/the filename 打开文件，并将光标移动包含有目标字符串的行。例如，命令vi +/Jason friends 从第1个含有字符串Jason的行开始编辑文件friends <br />view filename 打开文件进行编辑，但是拒绝保存对文件的修改，除非使用w!命令 <br />光标移动命令 <br />hjkl 将光标分别向左、下、上、右移动一个字符 <br />0(零) 将光标移到当前行的行首 <br />^(脱字符) 同0一样将光标移到当前行的行首 <br />$ 将光标移到当前行的行末 <br />##G 将光标移到G前面的数字指定的行。例如，42G将光标移到文件的第42行 <br />G 将光标移到文件的最后一行 <br />w 将光标向前移到下一个单词的首字母 <br />e 将光标向前移到下一个单词的最后一个字母 <br />b 将光标向后移到上一个单词首字母 <br />- 将光标定位到上一行的行首 <br />+ 将光标定位到下一行的行首 <br />12| 将光标定位到当前行的第12列 <br />L 将光标定位到屏幕的最下面一行 <br />M 将光标定位到屏幕中间的一行 <br />H 将光标定位到屏幕的最上面一行 <br />'' 两个单引号将光标移到它的先前的位置 <br />光标定位命令（上下文的） <br />fb 将光标向前移到当前行上的下一个字母b（或者其他的任意指定的字符） <br />Fb 将光标向后移到当前行上的上一个字母b（或指定的字符） <br />t# 将光标移到当前行上字符＃的第1个实例的右侧。例如，命令tM将光标移到当前行上第1个M的右侧 <br />T# 在当前行上向左移动光标，将它移到字符＃的第1个实例的前一字符 <br />/word 将光标向前移到单词word的下一个实例 <br />?word 将光标向后移到单词word的上一个实例 <br />n 将光标移到前面命令/word或?word中指定模式的下一个实例 <br />显示调整命令 <br />Ctrl+D 显示文件中的下半屏文本 <br />Ctrl+U 显示文件中的上半屏文本 <br />Ctrl+F 显示文件中的下一屏文本 <br />Ctrl+B 显示文件中的上一屏文本 <br />设置显示选项 <br />:set number 将行号作为屏幕显示的一部分，但是行号并不是文件的一部分。它的缩写形式为:set nu <br />:set nonumber 清除屏幕上的行号。也可以使用缩写形式:set nonu <br />:set showmode 在屏幕的右下角显示追加模式信息 <br />:set list 在每行的行末显示美元符号，并用Ctrl+I表示制表符 <br />:set showmatch 在输入）或］时，将光标移到与之匹配的（或[ <br />:set window=value 定义屏幕上显示的文本行的行数 <br />:set autoindent 自动缩进。也可以使用缩写形式:set ai <br />:set tabstop=value 设置显示制表符的空格字符个数。也可以使用缩写形式ts=value <br />:set wrapmargin=value 设置显示器的右页边。当输入进入所设置的页边时，编辑器自动回车换行 <br />:set ignorecase 指示编辑器搜索字符串，并忽略目标中字母的大小写 <br />:set 显示设置的所有选项 <br />:set all 显示所有可以设置的选项 <br />文本删除命令 <br />dd 删除当前光标所有的文本行 <br />#dd 删除＃行文本 <br />dw 从文本中删除一个单词 <br />#dw 从文本中删除＃个单词 <br />x 删除光标所在的一个字符 <br />#x 从文本中删除＃个字符 <br />D 删除当前行上光标后面的部分 <br />:#,#d 例如，:12,37d 将删除第12～37行之间的所有文本，包括第12和37行 <br />撤销命令 <br />u 撤销。恢复最近一次的文本修改操作，即使已经移动了光标。在Linux系统中，再次使用撤销命令将恢复更前一次的文本修改操作。在BSD的vi中，第2次撤销操作将撤销第一次撤销操作，恢复第1次撤销前修改的文本 <br />:redo 在Linux系统中，取消撤销操作恢复文本修改。在标准的UNIX系统中，第2个u命令取消第1个u命令，结果就是一个“redo” <br />U 如果在修改后还没有将光标移出当前行，则可以撤销对当前行进行的所有的文本修改 <br />向文本中添加文本 <br />a(小写) 从光标的右侧开始插入文本 <br />A(大写) 从当前行的行末开始添加文本 <br />i(小写) 从光标的左侧开始插入文本 <br />I(大写) 从当前行的行首插入文本 <br />o(小写) 在光标的下面打开（或插入）一个新行 <br />O(大写) 在光标的上面打开一个新行 <br />:#r filename 例如，:8r report.old读取文件report.old，并将它的内容放到当前文件的第8行之后 <br />Esc 无论使用什么命令进入了追加/插入模式，都可以通过按Esc键离开追加模式返回到vi的命令模式 <br />Ctrl+V 允许输入控制字符。按Ctrl+V键后再按回车键将把Ctrl+M插入到文件中 <br />在文件中修改文本 <br />cw 仅仅修改光标处的单词（删除单词，然后进入追加模式中，以在被删除单词的位置添加文本） <br />s(小写) 替换单个字符 <br />S(大写) 替换整行文本 <br />cc 替换整行文本(同S) <br />r 用输入的下一个字符替代当前光标处的字符，并自动返回到命令模式 <br />R 将编辑器放到覆盖模式，用输入的字符来逐个替换光标处的字符 <br />C(大写) 修改行上从光标到行末之间的文本 <br />ct# 修改行上从光标到前向第1个目标字符之间的文本。例如ctY将删除当前行上从光标到向前第1个字符Y之间的所有文本，并进入追加模式以在删除文本的位置添加文本 <br />cf# 修改行上从光标到前向第1个目标字符之间的文本（包括目标字符）。例如cfY将删除当前行上从光标到向前第1个字符Y之间（包括Y）的所有文本，并进入追加模式以在删除文本的位置添加文本 <br />cT# 修改行上从光标到后向第1个目标字符之间的文本。例如cTY将删除当前行上从光标到向后第1个字符Y之间的所有文本，并进入追加模式以在删除文本的位置添加文本 <br />cF# 修改行上从光标到后向第1个目标字符之间的文本（包括目标字符）。例如cFY将删除当前行上从光标到向后第1个字符Y之间（包括Y）的所有文本，并进入追加模式以在删除文本的位置添加文本 <br />接出和粘贴行的单词 <br />yy 将当前行复制或接出到内在缓冲区。20yy将当前行和它后面的19行（共20行）文本复制到内存。目标行仍然保留在文件中，可以使用p命令将这些内存中的文本粘贴到文件中 <br />dd 删除当前行，并将它放到与yy命令使用的相同的内存缓冲区。目标行从文件中删除，但是可以使用p命令将它粘贴到文件中的其他地方 <br />yw 将当前光标所在的单词接出或复制到内在缓冲区。6yw命令将把当前单词和它后面的5个（共6个）单词复制到内存 <br />dw 删除当前的单词，并将它放到与yw命令使用的相同的内存缓冲区。可以使用p命令将单词粘贴到文件的其他地方 <br />yt# 接出从光标到向前一个字符（不包括该字符）之间的文本。例如，ytB命令将从光标到字符B的下一实例（不包括字符B）之间的文本接出或复制到内存 <br />yf# 接出从光标到向前一个字符（包括该字符）之间的文本。例如，yf:命令将从光标到字符:的下一个实例（包括字符:）之间的文本接出或复制到内存 <br />yT# 后向接出（不包括目标字符）。例如，yTN命令将从光标到字符N的后向第1个实例之间的文本（不包括字符N）接出或复制到内存 <br />yF# 后向接出（包括目标字符）。例如，yFJ命令将把从光标到字符N的向后第1个实例之间的文本（包括字符N）接出或复制到内存 <br />p 将内存中的文本行粘贴到文件中光标所在行的下面，或将内存中的单词粘贴到文件中光标的右侧 <br />P(大写) 将接出或删除的文本行粘贴到文件中光标所在行的上面。或将接出或删除的单词粘贴到文件中光标的左侧 <br />文件移动命令 <br />J 将下行文本同当前行合并成一行 <br />:#,# move # 将指定的行移到目标位置。:12,35 move 58命令将第12～35行之间的所有文本移到第58行的后面。缩写为mo <br />:1,26 co 82 将第1～26行之间的所有文本复制到第82行的后面（可以选择行号） <br />使用可视化编辑器进行全局编辑 <br />:s /target/replacement/ 查找当前行上目标字符串的第1个实例并删除，然后用字符串replacement替换。只修改当前行上的第1个目标实例 <br />:g /target/s//replacement/ 查找所有行上目标字符串的第1个实例并删除，然后用字符串replacement替换。修改所有行上目标的第1个实例 <br />:#,# s/target/replacement/ 在指定的行上进行替换。例如，:7,37 s/march/walk/将查找第7～37行之间的所有文本行，并用字符串walk替换每行中的第1个目标字符串march。所有指定行上的第1个目标字符串修改 <br />:#,# s/target/replacement/g 在指定的行上进行全局替换。例如，:1,$ s/fun/joyful/g 将在第1行到文件最后一行之间查找目标字符串fun的所有实例并删除，然后用字符串joyful替换。指定行上的目标字符串的所有实例都被修改 <br />:g /target/s/replacement 查找所有行上目标字符串的第1个实例并删除，然后用字符串replacement替换。所有行上的第1个目标都被修改 <br />:#,# target/s/replacement/ 在指定的行上进行替换，例如，:7,37 march/s/walk命令在第7～37行之间每个文本行上查找目标字符串的第1个实例并删除，然后用字符串walk替换。所有指定行上的第1个目标字符串都被修改 <br />:#,# target/s/replacement/g 在指定的行上进行全局替换。例如，:1,$ fun/s/joyful/g将在第1行到文件最后一行之间查找目标字符串fun的所有实例并删除，然后用字符串joyful替换。指定行上的所有目标字符串都被修改 <br />编辑工具：映射，缩写和标记 <br />m# 用字母标记当前行。例如，ma命令表示用a标记当前行。即使移动了标记行，它仍然标记为a，可以用a来定位该行 <br />'# 定位标记行。例如，命令'a将光标移到标记a的行。命令'a,$d将删除从标记行到文件末尾之间的所有行 <br />:map # command string 在命令模式中输入＃时，将其作为一个命令串。例如，:map #o#!/bin/ksh产生一个新的命令模式指令，您输入＃时，它被解释为:o打开个新行，并添加文本#!/bin/ksh到文件中。为了在命令中包含回车和其他控制字符，可以在它们的前面用Ctrl+V命令 <br />:ab abbreviation char-string 设置追加模式缩写。例如，在命令模式中输入:ab mv Milky Way Galaxy，则建立缩写。如果在追加模式中输入字符串mw，然后按Esc键，mw将被Milky Way Galaxy替代 <br />在vi编辑器中向shell发出命令 <br />:!ls 启动一个shell，并让shell运行ls程序。在运行完指定的程序后，必须按回车键以返回到编辑器中 <br />:!ksh 启动一个shell，它允许运行多个命令。退出shell可以回到编译器中 <br />:Or!speel% 对当前文件(%)进行拼写检查，并将spell的输出诗篇到当前文件中，从第1行(0行后面)开始放置这些输出 <br />:31r!command% 运行UNIX命令（如cal或date）并将它的输出读入到当前文件，从第31行开始放置这些输出 <br />Ctrl+Z 用于挂起当前编辑会话进程的csh和ksh命令，它允许您向父shell发出命令 <br />fg 重新激活挂起的编辑进程的csh和ksh命令 <br />读、写和退出编辑器 <br />:wq 保存编辑会话期间对文件所做的修改，退出编辑器返回到shell <br />:q 如果没有对文件进行修改或添加文件，可以用q退出对一个文件的编辑 <br />:q! 退出对文件的编辑返回到shell模式，但是不保存在编辑会话期间对文件所做的修改 <br />:w filename v将文件的缓冲区副本（修改版本）保存到一个新文件 <br />[color=#DC143C][b]:#,# w newtest 例如，:1,6 w newtext命令创建一个名为newtext的文件，并将当前文件的第1～6行文本复制到文件newtext中 <br />:1,6 w &gt;&gt; oldfile 将当前文件的第1～6行文本的一个副本追加到已有文件oldfile的末尾 <br />:1,6 w! oldfile 用当前文件的第1～6行文本覆盖文件oldfile</font>
		</h2>
<img src ="http://www.blogjava.net/javaruijie/aggbug/64170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-08-17 17:40 <a href="http://www.blogjava.net/javaruijie/archive/2006/08/17/64170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一段判断日期时间是否有效的JavaScript</title><link>http://www.blogjava.net/javaruijie/archive/2006/05/16/46464.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Tue, 16 May 2006 11:25:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/05/16/46464.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/46464.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/05/16/46464.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/46464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/46464.html</trackback:ping><description><![CDATA[
		<p style="LINE-HEIGHT: 150%">
				<font class="f14" id="zoom" style="FONT-SIZE: 14px">&lt;script language=javascript&gt; <br />function strDateTime(str){ <br />var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/; <br />var r = str.match(reg); <br />if(r==null)return false; <br />var d= new Date(r[1], r[3]-1,r[4]); <br />var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate() <br />return newStr==str <br />} <br />alert(strDateTime("2002-1-31")) <br />alert(strDateTime("2002-1-41")) <br />&lt;/script&gt; <br />&lt;script language=javascript&gt; <br />function strDateTime(str){ <br />var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; <br />var r = str.match(reg); <br />if(r==null)return false; <br />var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); <br />var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds() <br />return newStr==str <br />} <br />alert(strDateTime("2002-1-31 12:34:56")) <br />alert(strDateTime("2001-2-29 12:54:56")) <br />alert(strDateTime("2002-1-41 12:00:00")) <br />&lt;/script&gt; <br /><br />&lt;script language="javascript"&gt; <br />var s="2002-4-16" <br />alert(chkDate(s)); <br />function chkDate(sDate){ <br />var r=/\d{4}(?:-\d{1,2}){0,2}/ <br />//正则表达式，判断是否为yyyy-mm-dd,yyyy-mm,yyyy格式 <br />if(sDate.match(r)==sDate){ <br />　var arr=sDate.split("-") <br />　switch(arr.length){ <br />　//根据不同的yyyy-mm-dd,yyyy-mm格式判断年月日数字是否正确 <br />　 case 3: <br />　　var tmpDate=new Date(arr[0],arr[1],arr[2]); <br />　　if(tmpDate.getMonth()==arr[1] &amp;&amp; tmpDate.getFullYear()==arr[0]) return true; <br />　　break; <br />　 case 2: <br />　　if(arr[1]&lt;13) return true; <br />　　break; <br />　 default: <br />　　return false; <br />　} <br />} <br />return false; <br />} <br />&lt;/script&gt; <br /><br />/* <br />时间有效性判断函数 <br />All by happywinds <br />*/ <br />function verifyDate(textObj) { <br />　　var str=textObj.value; <br />textObj.value = textObj.value.replace(/\s+/g,""); <br />　　if(str.search(/^\d{4}-\d{1,2}-\d{1,2}$/) == 0){ <br />　var y = parseInt(str.split("-")[0]); <br />　　 var m = parseInt(str.split("-")[1]); <br />　　 var d = parseInt(str.split("-")[2]); <br />　switch(m){ <br />　　　case 1: <br />　　　case 3: <br />　　　case 5: <br />　　　case 7: <br />　　　case 8: <br />　　　case 10: <br />　　　case 12: <br />　　　 if(d&gt;31){ <br />　　　　return false; <br />　　　　　　　　　　textObj.focus(); <br />　　　　　　　　　　textObj.select(); <br />　　}else{ <br />　　　　return true; <br />　　} <br />　　　 break; <br />　 case 2: <br />　　　 if((y%4==0 &amp;&amp; d&gt;29) || ((y%4!=0 &amp;&amp; d&gt;28))){ <br />　　　　return false; <br />　　　　　　　　　　textObj.focus(); <br />　　　　　　　　　　textObj.select(); <br />　　}else{ <br />　　　　return true; <br />　　} <br />　　　 break; <br />　　　case 4: <br />　　　case 6: <br />　　　case 9: <br />　　　case 11: <br />　　　 if(d&gt;30){ <br />　　　　return false; <br />　　　　　　　　　　textObj.focus(); <br />　　　　　　　　　　textObj.select(); <br />　　}else{ <br />　　　　return true; <br />　　} <br />　　　 break; <br />　 default: <br />　　　 return false; <br />　　　　　　　　　　textObj.focus(); <br />　　　　　　　　　　textObj.select(); <br />　} <br />}else{ <br />　　 return false; <br />　　　　　　　　　　textObj.focus(); <br />　　　　　　　　　　textObj.select(); <br />} <br />}</font>
		</p>
		<a href="/javaruijie/archive/2006/05/16/46464.html" target="_blank">原文链接</a>
<img src ="http://www.blogjava.net/javaruijie/aggbug/46464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-05-16 19:25 <a href="http://www.blogjava.net/javaruijie/archive/2006/05/16/46464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>61条面向对象设计的经验原则</title><link>http://www.blogjava.net/javaruijie/archive/2006/03/09/34501.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Thu, 09 Mar 2006 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/03/09/34501.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/34501.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/03/09/34501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/34501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/34501.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)所有数据都应该隐藏在所在的类的内部。 <BR>　　(2)类的使用者必须依赖类的共有接口，但类不能依赖它的使用者。 <BR>　　(3)尽量减少类的协议中的消息。 <BR>　　(4)实现所有类都理解的最基本公有接口[例如，拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。 <BR>　　(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。 <BR>　　如果类的两个方法有一段公共代码，那么就可以创建一个防止这些公共代码的私有函数。 <BR>　　(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。 <BR>　　(7)类之间应该零耦合，或者只有导出耦合关系。也即，一个类要么同另一个类毫无关系，要么只使用另一个类的公有接口中的操作。 <BR>　　(8)类应该只表示一个关键抽象。 <BR>　　包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响，则将对包中的所有类产生影响，而对其他的包不造成任何影响 . <BR>　　(9)把相关的数据和行为集中放置。 <BR>　　设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。 <BR>　　(10)把不相关的信息放在另一个类中(也即：互不沟通的行为)。 <BR>　　朝着稳定的方向进行依赖. <BR>　　(11)确保你为之建模的抽象概念是类，而不只是对象扮演的角色。 <BR>　　(12)在水平方向上尽可能统一地分布系统功能，也即：按照设计，顶层类应当统一地共享工作。 <BR>　　(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。 <BR>　　规划一个接口而不是实现一个接口。 <BR>　　(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。 <BR>　　(15)对包含太多互不沟通的行为的类多加小心。 <BR>　　这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。 <BR>　　(16)在由同用户界面交互的面向对象模型构成的应用程序中，模型不应该依赖于界面，界面则应当依赖于模型。 <BR>　　(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。 <BR>　　(18)从你的设计中去除不需要的类。 <BR>　　一般来说，我们会把这个类降级成一个属性。 <BR>　　(19)去除系统外的类。 <BR>　　系统外的类的特点是，抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。 <BR>　　(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类，特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。 <BR>　　(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段，我们常会发现很多代理没有用的，应当去除。 <BR>　　(22)尽量减少类的协作者的数量。 <BR>　　一个类用到的其他类的数目应当尽量少。 <BR>　　(23)尽量减少类和协作者之间传递的消息的数量。 <BR>　　(24)尽量减少类和协作者之间的协作量，也即：减少类和协作者之间传递的不同消息的数量。 <BR>　　(25)尽量减少类的扇出，也即：减少类定义的消息数和发送的消息数的乘积。 <BR>　　(26)如果类包含另一个类的对象，那么包含类应当给被包含的对象发送消息。也即：包含关系总是意味着使用关系。 <BR>　　(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。 <BR>　　(28)类包含的对象数目不应当超过<A href="http://www.gamvan.com/developer" target=_blank>开发者</A>短期记忆的容量。这个数目常常是6。 <BR>　　当类包含多于6个数据成员时，可以把逻辑相关的数据成员划分为一组，然后用一个新的包含类去包含这一组成员。 <BR>　　(29)让系统功能在窄而深的继承体系中垂直分布。 <BR>　　(30)在实现语义约束时，最好根据类定义来实现。这常常会导致类泛滥成灾，在这种情况下，约束应当在类的行为中实现，通常是在构造函数中实现，但不是必须如此。 <BR>　　(31)在类的构造函数中实现语义约束时，把约束测试放在构造函数领域所允许的尽量深的包含层次中。 <BR>　　(32)约束所依赖的语义信息如果经常改变，那么最好放在一个集中式的第3方对象中。 <BR>　　(33)约束所依赖的语义信息如果很少改变，那么最好分布在约束所涉及的各个类中。 <BR>　　(34)类必须知道它包含什么，但是不能知道谁包含它。 <BR>　　(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。 <BR>　　(36)继承只应被用来为特化层次结构建模。 <BR>　　(37)派生类必须知道基类，基类不应该知道关于它们的派生类的任何信息。 <BR>　　(38)基类中的所有数据都应当是私有的，不要使用保护数据。 <BR>　　类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。 <BR>　　(39)在理论上，继承层次体系应当深一点，越深越好。 <BR>　　(40)在实践中，继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。 <BR>　　(41)所有的抽象类都应当是基类。 <BR>　　(42)所有的基类都应当是抽象类。 <BR>　　(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。 <BR>　　(44)如果两个或更多个类共享公共数据(但没有公共行为)，那么应当把公共数据放在一个类中，每个共享这个数据的类都包含这个类。 <BR>　　(45)如果两个或更多个类有共同的数据和行为(就是方法)，那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。 <BR>　　(46)如果两个或更多个类共享公共接口(指的是消息，而不是方法)，那么只有他们需要被多态地使用时，他们才应当从一个公共基类继承。 <BR>　　(47)对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下，设计者应当使用多态。 <BR>　　(48)对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构，每个属性值都被变换成一个派生类。 <BR>　　(49)不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。 <BR>　　(50)不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。 <BR>　　(51)如果你觉得需要在运行时刻创建新的类，那么退后一步以认清你要创建的是对象。现在，把这些对象概括成一个类。 <BR>　　(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。 <BR>　　(53)不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。 <BR>　　(54)在创建继承层次时，试着创建可复用的框架，而不是可复用的组件。 <BR>　　(55)如果你在设计中使用了多重继承，先假设你犯了错误。如果没犯错误，你需要设法证明。 <BR>　　(56)只要在面向对象设计中用到了继承，问自己两个问题：(1)派生类是否是它继承的那个东西的一个特殊类型？(2)基类是不是派生类的一部分？ <BR>　　(57)如果你在一个面向对象设计中发现了多重继承关系，确保没有哪个基类实际上是另一个基类的派生类。 <BR>　　(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择，请选择包含关系。 <BR>　　(59)不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。 <BR>　　(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是，在对逻辑设计作出决策的过程中我们经常用到物理设计准则。 <BR>　　(61)不要绕开公共接口去修改对象的状态。 <BR><img src ="http://www.blogjava.net/javaruijie/aggbug/34501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-03-09 16:45 <a href="http://www.blogjava.net/javaruijie/archive/2006/03/09/34501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 如何创建\删除\修改\复制目录及文件</title><link>http://www.blogjava.net/javaruijie/archive/2006/03/09/34487.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Thu, 09 Mar 2006 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/03/09/34487.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/34487.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/03/09/34487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/34487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/34487.html</trackback:ping><description><![CDATA[import java.io.*;
<P>public class FileOperate {<BR>&nbsp; public FileOperate() {<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 新建目录<BR>&nbsp;&nbsp; * @param folderPath String 如 c:/fqf<BR>&nbsp;&nbsp; * @return boolean<BR>&nbsp;&nbsp; */<BR>&nbsp; public void newFolder(String folderPath) {<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = folderPath;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File myFilePath = new java.io.File(filePath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!myFilePath.exists()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFilePath.mkdir();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("新建目录操作出错");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 新建文件<BR>&nbsp;&nbsp; * @param filePathAndName String 文件路径及名称 如c:/fqf.txt<BR>&nbsp;&nbsp; * @param fileContent String 文件内容<BR>&nbsp;&nbsp; * @return boolean<BR>&nbsp;&nbsp; */<BR>&nbsp; public void newFile(String filePathAndName, String fileContent) {</P>
<P>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = filePathAndName;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File myFilePath = new File(filePath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!myFilePath.exists()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFilePath.createNewFile();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileWriter resultFile = new FileWriter(myFilePath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter myFile = new PrintWriter(resultFile);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strContent = fileContent;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFile.println(strContent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultFile.close();</P>
<P>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("新建目录操作出错");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 删除文件<BR>&nbsp;&nbsp; * @param filePathAndName String 文件路径及名称 如c:/fqf.txt<BR>&nbsp;&nbsp; * @param fileContent String<BR>&nbsp;&nbsp; * @return boolean<BR>&nbsp;&nbsp; */<BR>&nbsp; public void delFile(String filePathAndName) {<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = filePathAndName;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File myDelFile = new java.io.File(filePath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myDelFile.delete();</P>
<P>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("删除文件操作出错");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 删除文件夹<BR>&nbsp;&nbsp; * @param filePathAndName String 文件夹路径及名称 如c:/fqf<BR>&nbsp;&nbsp; * @param fileContent String<BR>&nbsp;&nbsp; * @return boolean<BR>&nbsp;&nbsp; */<BR>&nbsp; public void delFolder(String folderPath) {<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delAllFile(folderPath); //删除完里面所有内容<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = folderPath;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = filePath.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File myFilePath = new java.io.File(filePath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFilePath.delete(); //删除空文件夹</P>
<P>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("删除文件夹操作出错");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 删除文件夹里面的所有文件<BR>&nbsp;&nbsp; * @param path String 文件夹路径 如 c:/fqf<BR>&nbsp;&nbsp; */<BR>&nbsp; public void delAllFile(String path) {<BR>&nbsp;&nbsp;&nbsp; File file = new File(path);<BR>&nbsp;&nbsp;&nbsp; if (!file.exists()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; if (!file.isDirectory()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; String[] tempList = file.list();<BR>&nbsp;&nbsp;&nbsp; File temp = null;<BR>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; tempList.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (path.endsWith(File.separator)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = new File(path + tempList[i]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = new File(path + File.separator + tempList[i]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (temp.isFile()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp.delete();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (temp.isDirectory()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delFolder(path+"/"+ tempList[i]);//再删除空文件夹<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 复制单个文件<BR>&nbsp;&nbsp; * @param oldPath String 原文件路径 如：c:/fqf.txt<BR>&nbsp;&nbsp; * @param newPath String 复制后路径 如：f:/fqf.txt<BR>&nbsp;&nbsp; * @return boolean<BR>&nbsp;&nbsp; */<BR>&nbsp; public void copyFile(String oldPath, String newPath) {<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bytesum = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int byteread = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File oldfile = new File(oldPath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oldfile.exists()) { //文件存在时<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream inStream = new FileInputStream(oldPath); //读入原文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fs = new FileOutputStream(newPath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[1444];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (byteread = inStream.read(buffer)) != -1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytesum += byteread; //字节数 文件大小<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(bytesum);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.write(buffer, 0, byteread);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inStream.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("复制单个文件操作出错");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 复制整个文件夹内容<BR>&nbsp;&nbsp; * @param oldPath String 原文件路径 如：c:/fqf<BR>&nbsp;&nbsp; * @param newPath String 复制后路径 如：f:/fqf/ff<BR>&nbsp;&nbsp; * @return boolean<BR>&nbsp;&nbsp; */<BR>&nbsp; public void copyFolder(String oldPath, String newPath) {</P>
<P>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File a=new File(oldPath);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] file=a.list();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File temp=null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; file.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(oldPath.endsWith(File.separator)){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=new File(oldPath+file[i]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=new File(oldPath+File.separator+file[i]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp.isFile()){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream input = new FileInputStream(temp);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream output = new FileOutputStream(newPath + "/" +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (temp.getName()).toString());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] b = new byte[1024 * 5];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (len = input.read(b)) != -1) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.write(b, 0, len);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.flush();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(temp.isDirectory()){//如果是子文件夹<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("复制整个文件夹内容操作出错");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 移动文件到指定目录<BR>&nbsp;&nbsp; * @param oldPath String 如：c:/fqf.txt<BR>&nbsp;&nbsp; * @param newPath String 如：d:/fqf.txt<BR>&nbsp;&nbsp; */<BR>&nbsp; public void moveFile(String oldPath, String newPath) {<BR>&nbsp;&nbsp;&nbsp; copyFile(oldPath, newPath);<BR>&nbsp;&nbsp;&nbsp; delFile(oldPath);</P>
<P>&nbsp; }</P>
<P>&nbsp; /**<BR>&nbsp;&nbsp; * 移动文件到指定目录<BR>&nbsp;&nbsp; * @param oldPath String 如：c:/fqf.txt<BR>&nbsp;&nbsp; * @param newPath String 如：d:/fqf.txt<BR>&nbsp;&nbsp; */<BR>&nbsp; public void moveFolder(String oldPath, String newPath) {<BR>&nbsp;&nbsp;&nbsp; copyFolder(oldPath, newPath);<BR>&nbsp;&nbsp;&nbsp; delFolder(oldPath);</P>
<P>&nbsp; }<BR>}<BR></P><img src ="http://www.blogjava.net/javaruijie/aggbug/34487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-03-09 15:55 <a href="http://www.blogjava.net/javaruijie/archive/2006/03/09/34487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle job 管理</title><link>http://www.blogjava.net/javaruijie/archive/2006/03/07/34060.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Tue, 07 Mar 2006 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/03/07/34060.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/34060.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/03/07/34060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/34060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/34060.html</trackback:ping><description><![CDATA[<P>SVRMGR&gt; select * from dba_jobs;</P>
<P>初始化相关参数job_queue_processes<BR>alter system set job_queue_processes=39 scope=spfile;//最大值不能超过1000&nbsp; ;job_queue_interval = 10&nbsp; //调度作业刷新频率秒为单位<BR>DBA_JOBS describes all jobs in the database. <BR>USER_JOBS describes all jobs owned by the current user</P>
<P>1&nbsp; select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)<BR>2 select job,what,last_date,next_date,interval from&nbsp; dba_jobs where job in (1,3);</P>
<P><BR>查询job的情况。<BR>show paramter background_dump_dest.<BR>看alter.log 和trace</P>
<P><BR>SVRMGR&gt; select * from dba_jobs;</P>
<P>初始化相关参数job_queue_processes<BR>alter system set job_queue_processes=39 scope=spfile;//最大值不能超过1000</P>
<P>job_queue_interval = 10&nbsp; //调度作业刷新频率秒为单位</P>
<P><BR>DBA_JOBS describes all jobs in the database. <BR>USER_JOBS describes all jobs owned by the current user</P>
<P>1&nbsp; select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)<BR>2 select job,what,last_date,next_date,interval from&nbsp; dba_jobs where job in (1,3);</P>
<P><BR>查询job的情况。<BR>show paramter background_dump_dest.<BR>看alter.log 和trace</P>
<P><BR>请问我如何停止一个JOB<BR>SQL&gt; exec dbms_job.broken(1,true)</P>
<P>PL/SQL 过程已成功完成。<BR>SQL&gt;commit&nbsp; //必须提交否则无效</P>
<P>启动作业<BR>SQL&gt; exec dbms_job.broken(1,false)</P>
<P>PL/SQL 过程已成功完成。</P>
<P>停其他用户的job<BR>SQL&gt;exec sys.dbms_ijob.broken(98,true);<BR>SQL&gt;commit;</P>
<P><BR>============================</P>
<P>exec dbms_job.broken(:job) 停止<BR>exec dbms_job.broken(186,true) //标记位broken<BR>exec dbms_job.broken(186,false)//标记为非broken<BR>exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行时间<BR>exec dbms_job.remove(:job)；删除<BR>exec dbms_job.remove(186);<BR>commit；</P>
<P>把一个broken job重新运行</P>
<P><BR>三、查看相关job信息<BR>1、相关视图<BR>dba_jobs<BR>all_jobs<BR>user_jobs<BR>dba_jobs_running 包含正在运行job相关信息</P>
<P><BR>创建JOB<BR>variable jobno number;<BR>begin<BR>&nbsp; dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);<BR>&nbsp; commit;<BR>end;<BR>print jobno</P>
<P>例如，我们已经建立了一个存储过程，其名称为my_job，在sql/plus中以scott用户身份登录，执行如下命令： <BR>sql&gt; variable n number; <BR>sql&gt; begin <BR>dbms_job.submit(:n‘my_job;’,sysdate, <BR>‘sysdate＋1/360’); <BR>commit; <BR>end;<BR>Sql&gt; print :n; </P>
<P>系统提示执行成功。 <BR>Sql&gt; print :n; <BR>系统打印此任务的编号，例如结果为300。 </P>
<P><BR>简单例子<BR>一个简单例子： </P>
<P>创建测试表<BR>SQL&gt; create table TEST(a date);</P>
<P>表已创建。</P>
<P>创建一个自定义过程<BR>SQL&gt; create or replace procedure MYPROC as<BR>&nbsp; 2&nbsp; begin<BR>&nbsp; 3&nbsp; insert into TEST values(sysdate);<BR>&nbsp; 4&nbsp; end;<BR>&nbsp; 5&nbsp; /</P>
<P>过程已创建。</P>
<P>创建JOB<BR>SQL&gt; variable job1 number;<BR>SQL&gt; <BR>SQL&gt; begin<BR>&nbsp; 2&nbsp; dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');　　--每天1440分钟，即一分钟运行test过程一次<BR>&nbsp; 3&nbsp; end;<BR>&nbsp; 4&nbsp; /</P>
<P>PL/SQL 过程已成功完成。</P>
<P>运行JOB<BR>SQL&gt; begin<BR>&nbsp; 2&nbsp; dbms_job.run(:job1);<BR>&nbsp; 3&nbsp; end;<BR>&nbsp; 4&nbsp; /</P>
<P>PL/SQL 过程已成功完成。</P>
<P>SQL&gt; select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from TEST;</P>
<P>时间<BR>-------------------<BR>2001/01/07 23:51:21<BR>2001/01/07 23:52:22<BR>2001/01/07 23:53:24</P>
<P>删除JOB<BR>SQL&gt; begin<BR>&nbsp; 2&nbsp; dbms_job.remove(:job1);<BR>&nbsp; 3&nbsp; end;<BR>&nbsp; 4&nbsp; /</P>
<P>PL/SQL 过程已成功完成。</P>
<P>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</P>
<P><BR>a、利用dbms_job.run()立即执行该job<BR>&nbsp;&nbsp; sql&gt;begin<BR>&nbsp;&nbsp; sql&gt;dbms_job.run(:jobno) 该jobno为submit过程提交时返回的job number<BR>&nbsp;&nbsp; sql&gt;end;<BR>&nbsp;&nbsp; sql&gt;/<BR>b、利用dbms_job.broken()重新将broken标记为false<BR>&nbsp;&nbsp; sql&gt;begin<BR>&nbsp;&nbsp; sql&gt;dbms_job.broken (:job,false,next_date)<BR>&nbsp;&nbsp; sql&gt;end;<BR>&nbsp;&nbsp; sql&gt;/</P>
<P><BR>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<BR>SQL&gt; create table a(a date);<BR>Table created</P>
<P>创建一个过程<BR>SQL&gt; create or replace procedure test as<BR>&nbsp; 2&nbsp; begin<BR>&nbsp; 3&nbsp; insert into a values(sysdate);<BR>&nbsp; 4&nbsp; end;<BR>&nbsp; 5&nbsp; /<BR>Procedure created</P>
<P>提交作业<BR>SQL&gt; declare<BR>&nbsp; 2&nbsp; job1 number;&nbsp;&nbsp; //定义一个数字型变量<BR>&nbsp; 3&nbsp; begin<BR>&nbsp; 4&nbsp; dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');&nbsp; //按分钟算一天1440分钟<BR>&nbsp; 5&nbsp; end;<BR>&nbsp; 6&nbsp; /<BR>PL/SQL procedure successfully completed<BR>job1<BR>---------<BR>4<BR>SQL&gt; commit;<BR>Commit complete</P>
<P>运行作业<BR>SQL&gt; begin<BR>&nbsp; 2&nbsp; dbms_job.run(4);<BR>&nbsp; 3&nbsp; end;<BR>&nbsp; 4&nbsp; /<BR>PL/SQL procedure successfully completed</P>
<P>删除作业<BR>SQL&gt; begin<BR>&nbsp; 2&nbsp; dbms_job.remove(4);<BR>&nbsp; 3&nbsp; end;<BR>&nbsp; 4&nbsp; /<BR>PL/SQL procedure successfully completed<BR>SQL&gt; commit;<BR>Commit complete</P>
<P><BR>job change//修改作业<BR>execute dbms_job.change(186,null,null,'sysdate+3');<BR>execute dbms_job.change(186,'scott.test(update)');</P>
<P><BR>DBA_JOBS<BR>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<BR>字段（列）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述 <BR>JOB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务的唯一标示号 <BR>LOG_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30)&nbsp;&nbsp;&nbsp; 提交任务的用户 <BR>PRIV_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30)&nbsp;&nbsp;&nbsp; 赋予任务权限的用户 <BR>SCHEMA_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30)&nbsp;&nbsp;&nbsp; 对任务作语法分析的用户模式 <BR>LAST_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后一次成功运行任务的时间 <BR>LAST_SEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(8)&nbsp;&nbsp;&nbsp;&nbsp; 如HH24:MM:SS格式的last_date日期的小时，分钟和秒 <BR>THIS_DATE&nbsp;&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正在运行任务的开始时间，如果没有运行任务则为null <BR>THIS_SEC&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(8)&nbsp;&nbsp;&nbsp;&nbsp; 如HH24:MM:SS格式的this_date日期的小时，分钟和秒 <BR>NEXT_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下一次定时运行任务的时间 <BR>NEXT_SEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(8)&nbsp;&nbsp;&nbsp;&nbsp; 如HH24:MM:SS格式的next_date日期的小时，分钟和秒 <BR>TOTAL_TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该任务运行所需要的总时间，单位为秒 <BR>BROKEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(1)&nbsp;&nbsp;&nbsp;&nbsp; 标志参数，Y标示任务中断，以后不会运行 <BR>INTERVAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(200)&nbsp;&nbsp; 用于计算下一运行时间的表达式 <BR>FAILURES&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp; 任务运行连续没有成功的次数 <BR>WHAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(2000)&nbsp; 执行任务的PL/SQL块 <BR>CURRENT_SESSION_LABEL RAW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MLSLABEL 该任务的信任Oracle会话符 <BR>CLEARANCE_HI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW MLSLABEL&nbsp;&nbsp;&nbsp;&nbsp; 该任务可信任的Oracle最大间隙 <BR>CLEARANCE_LO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MLSLABEL 该任务可信任的Oracle最小间隙 <BR>NLS_ENV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(2000)&nbsp;&nbsp; 任务运行的NLS会话设置 <BR>MISC_ENV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW(32)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务运行的其他一些会话参数 </P>
<P>&nbsp;</P>
<P>描述&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERVAL参数值 <BR>每天午夜12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'TRUNC(SYSDATE + 1)' <BR>每天早上8点30分&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'TRUNC(SYSDATE + 1) + （8*60+30）/(24*60)' <BR>每星期二中午12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' <BR>每个月第一天的午夜12点&nbsp;&nbsp;&nbsp; 'TRUNC(LAST_DAY(SYSDATE ) + 1)' <BR>每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' <BR>每星期六和日早上6点10分&nbsp;&nbsp;&nbsp; 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + （6×60+10）/（24×60）' <BR></P><img src ="http://www.blogjava.net/javaruijie/aggbug/34060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-03-07 14:24 <a href="http://www.blogjava.net/javaruijie/archive/2006/03/07/34060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>触发器介绍</title><link>http://www.blogjava.net/javaruijie/archive/2006/03/07/34049.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Tue, 07 Mar 2006 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/03/07/34049.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/34049.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/03/07/34049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/34049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/34049.html</trackback:ping><description><![CDATA[<TABLE class=main_tdbg_575 style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR vAlign=center align=middle>
<TD class=main_ArticleTitle style="WORD-BREAK: break-all" colSpan=2 height=30>触发器介绍</TD></TR>
<TR vAlign=center align=middle>
<TD class=main_ArticleSubheading style="WORD-BREAK: break-all" colSpan=2></TD></TR>
<TR class=Article_tdbgall align=middle>
<TD colSpan=2>
<SCRIPT language=javascript src="/AD/200510/3.js"></SCRIPT>
</TD></TR>
<TR>
<TD id=fontzoom style="WORD-BREAK: break-all" vAlign=top colSpan=2 height=300>
<TABLE cellSpacing=0 cellPadding=10 align=left border=0>
<TBODY>
<TR>
<TD><!--插入广告JS代码-->
<SCRIPT language=javascript src="/AD/200510/2.js"></SCRIPT>
</TD></TR></TBODY></TABLE>
<P class=MsoNormal>一 触发器介绍</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 触发器是一种特殊的存储过程，它在插入，删除或修改特定表中</P>
<P class=MsoNormal>的数据时触发执行，它比数据库本身标准的功能有更精细和更复杂的</P>
<P class=MsoNormal>数据控制能力。数据库触发器有以下的作用：</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; * 安全性。可以基于数据库的值使用户具有操作数据库的某种权</P>
<P class=MsoNormal>利。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 可以基于时间限制用户的操作，例如不允许下班后和节假日</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改数据库数据。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 可以基于数据库中的数据限制用户的操作，例如不允许股票</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的价格的升幅一次超过10%。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; * 审计。可以跟踪用户对数据库的操作。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 审计用户操作数据库的语句。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 把用户对数据库的更新写入审计表。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; * 实现复杂的数据完整性规则。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 实现非标准的数据完整性检查和约束。触发器可产生比规则</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更为复杂的限制。与规则不同，触发器可以引用列或数据库对</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 象。例如，触发器可回退任何企图吃进超过自己保证金的期货。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 提供可变的缺省值。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; * 实现复杂的非标准的数据库相关完整性规则。触发器可以对数</P>
<P class=MsoNormal>据库中相关的表进行连环更新。例如，在auths表author_code列上的</P>
<P class=MsoNormal>删除触发器可导致相应删除在其它表中的与之匹配的行。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在修改或删除时级联修改或删除其它表中的与之匹配的行。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在修改或删除时把其它表中的与之匹配的行设成NULL值。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 触发器能够拒绝或回退那些破坏相关完整性的变化，取消试</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图进行数据更新的事务。当插入一个与其主健不匹配的外部键</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时，这种触发器会起作用。例如，可以在books.author_code</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列上生成一个插入触发器，如果新值与auths.author_code列</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中的某值不匹配时，插入被回退。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; * 同步实时地复制表中的数据。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; * 自动计算数据值，如果数据的值达到了一定的要求，则进行特</P>
<P class=MsoNormal>定的处理。例如，如果公司的帐号上的资金低于5万元则立即给财务人</P>
<P class=MsoNormal>员发送警告数据。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; ORACLE与SYBASE数据库的触发器有一定的区别，下面将分别讲述</P>
<P class=MsoNormal>这两种数据库触发器的作用和写法。</P>
<P class=MsoNormal>&nbsp;<?XML:NAMESPACE PREFIX = O /><O:P> </O:P></P>
<P class=MsoNormal>二 ORACLE 触发器</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; ORACLE产生数据库触发器的语法为：</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; create [or replace] trigger 触发器名 触发时间 触发事件</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on 表名</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [for each row]</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pl/sql 语句</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 其中：</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 触发器名：触发器对象的名称。由于触发器是数据库自动执行</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的，因此该名称只是一个名称，没有实质的用途。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 触发时间：指明触发器何时执行，该值可取：</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; before---表示在数据库动作之前触发器执行；</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; after---表示在数据库动作之后出发器执行。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 触发事件：指明哪些数据库动作会触发此触发器：</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert：数据库插入会触发此触发器；</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update：数据库修改会触发此触发器；</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete：数据库删除会触发此触发器。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 表&nbsp;&nbsp;&nbsp; 名：数据库触发器所在的表。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; for each row：对表的每一行触发器执行一次。如果没有这一</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选项，则只对整个表执行一次。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 举例：下面的触发器在更新表auths之前触发，目的是不允许在</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 周末修改表：</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; create trigger auth_secure</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; before insert or update or delete&nbsp; //对整表更新前触发</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on auths</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; begin</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(to_char(sysdate,'DY')='SUN'</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; end</P>
<P class=MsoNormal>&nbsp;<O:P> </O:P></P>
<P class=MsoNormal>三 SYBASE数据库触发器</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; SYBASE数据库触发器的作用与ORACLE非常类似，仅有较小的差异。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; SYBASE产生触发器的语法为：</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; CREATE TRIGGER 触发器名</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON 表名</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR INSERT，UPDATE，DELETE</P>
<P class=MsoNormal>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;AS&nbsp;</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL_statement |</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR INSERT，UPDATE</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL_statements</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 上面FOR子句用来指定在触发器上的哪些数据更新命令可激活该</P>
<P class=MsoNormal>触发器。IF UPDATE子句检查对指定列的操作类型，在IF UPDATE子句</P>
<P class=MsoNormal>中可指定多个列。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 与ORACLE不同，对于每条SQL语句，触发器只执行一次。触发器</P>
<P class=MsoNormal>在数据更新语句完成以后立即执行。触发器和启动它的语句被当作一</P>
<P class=MsoNormal>个事务处理，事务可以在触发器中回退。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; 下面举例说明SYBASE触发器的写法。</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp; create trigger forinsert_books</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on books</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for insert</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(select count(*) from auths,inserted</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where auths.author_code=insert.author_code)!=@@rowcount</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rollback transaction</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "books 表中 author_code 列的值在auths 表中不存在。"</P>
<P class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end</P></TD></TR></TBODY></TABLE>
<a HREF="/javaruijie">点击进入<a><img src ="http://www.blogjava.net/javaruijie/aggbug/34049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-03-07 13:48 <a href="http://www.blogjava.net/javaruijie/archive/2006/03/07/34049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse  启动参数设置大全</title><link>http://www.blogjava.net/javaruijie/archive/2006/01/19/28679.html</link><dc:creator>咖啡时间</dc:creator><author>咖啡时间</author><pubDate>Thu, 19 Jan 2006 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/javaruijie/archive/2006/01/19/28679.html</guid><wfw:comment>http://www.blogjava.net/javaruijie/comments/28679.html</wfw:comment><comments>http://www.blogjava.net/javaruijie/archive/2006/01/19/28679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaruijie/comments/commentRss/28679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaruijie/services/trackbacks/28679.html</trackback:ping><description><![CDATA[<P><SPAN class=tpc_content><FONT size=2>Eclipse 运行命令行参数大全 <BR>包括英文版本和中文版本两种的说明, 特别需要值得一提的是那个 -nl 参数, 可以指定程序启动时所使用的语言. 例如:<BR>eclipse -nl en_US<BR>将启动英文语言, 这个特性在安装了国际化语言包以后特别有用, 可以方便的切换各个语言的版本. 注意 IBM WSAD v5.1 也支持这个功能. <BR><BR>运行 Eclipse<BR>将 Eclipse 驱动程序安装（解压缩）到某个目录（例如，c:\eclipse）中之后，通过运行顶级安装目录中的 Eclipse 可执行文件来启动"工作台"。在 Windows 系统上，该可执行文件称为 eclipse.exe，而在 Linux 系统上称为 eclipse。注意：下列讨论描述 Windows 系统上的设置。Linux 上的设置是相似的。<BR><BR>如果您没有另行指定，则平台将缺省工作区目录创建为可执行文件的兄弟目录（例如 c:\eclipse\workspace）。此工作区目录用作项目的缺省内容区，还用于保存任何必需的元数据。要进行共享安装或多工作区安装，应明确指出工作区的位置而不是使用缺省值。有两种控制工作区位置的方法：使用当前工作目录或使用 -data 命令行自变量。<BR><BR>将工作区位置设置为在当前工作目录内<BR>在此方案中，工作区位置将是当前工作目录中称为 workspace 的目录。<BR><BR>实现此目的最容易的方法可能是使用下列步骤来创建快捷方式：<BR><BR>导航到 Windows 资源管理器中的 eclipse.exe 并使用右键拖动来创建 eclipse.exe 的快捷方式。 <BR>编辑快捷方式的属性，以使启动位置：字段标识工作区位置的父目录（例如，c:\users\robert）。 <BR>关闭属性对话框并双击快捷方式（如果提供的目录为 c:\users\robert，则工作区位置将为 c:\users\robert\workspace）。 <BR>当然，您也可以使用命令提示符（通过将目录切换为工作区父目录然后运行 eclipse.exe）来获得同样的效果。<BR><BR>使用 -data 设置工作区的特定位置<BR>要使用 -data 命令行自变量，只要将 -data your_workspace_location（例如，-data c:\users\robert\myworkspace）添加至快捷方式属性中的目标字段或显式地将它包括在命令行上。<BR><BR>使用 -vm 设置 java VM<BR>建议显式指定在运行 Eclipse 时要使用哪个 Java VM。使用 -vm 命令行自变量（例如，-vm c:\jre\bin\javaw.exe）可以实现此目的。如果不使用 -vm，则 Eclipse 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时，它们可更改您的路径，导致在下一次启动 Eclipse 时使用另一 Java VM。<BR><BR>运行 Eclipse 中的高级主题<BR>Eclipse 可执行文件及平台本身提供了人们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运行 Eclipse 可执行文件的一般格式是：<BR><BR>eclipse [platform options] [-vmargs [Java VM arguments]]<BR>Eclipse 启动参数 命令 描述 原因 <BR><FONT color=blue>-arch architecture</FONT><BR>定义 Eclipse 平台在其上运行的处理器体系结构。Eclipse 平台通常使用 Java os.arch 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有："x86"、"sparc"、"PA-RISC"和"ppc"。 2.0 <BR><FONT color=blue>-application applicationId</FONT>要运行的应用程序。应用程序由向 org.eclipse.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项，则该值会覆盖配置提供的值。如果不指定此项，则会运行"Eclipse 工作台"。 1.0 <BR><FONT color=blue>-boot bootJarURL</FONT>（建议不使用；用 -configuration 代替；支持 1.0 兼容）。Eclipse 平台的引导插件代码（boot.jar）的位置，表示为 URL。如果指定此项，则会用它来为装入 Eclipse 平台引导程序类装入器的类装入器设置类路径。仅当更改 startup.jar 和 boot.jar 的相对位置时才需要它。注意，不允许使用相对 URL。 *1.0 <BR><FONT color=blue>-classloaderproperties [file]</FONT><BR>如果指定的话，则使用给定位置处的类装入器属性文件来激活平台类类装入器增强。文件自变量可以是文件路径或 URL。注意，不允许使用相对 URL。单击此处以获得更多详细信息。 2.0.2 <BR><FONT color=blue>-configuration configurationFileURL</FONT><BR>Eclipse 平台配置文件的位置，表示为 URL。配置文件确定 Eclipse 平台、可用插件集和主要功能部件的位置。注意，不允许使用相对 URL。当安装或更新 Eclipse 平台时配置文件被写至此位置。 2.0 <BR><FONT color=blue>-consolelog</FONT>将 Eclipse 平台的错误日志镜像到用来运行 Eclipse 的控制台。与 -debug 组合时很方便使用。 1.0 <BR><FONT color=blue>-data workspacePath</FONT><BR>要运行 Eclipse 平台的工作区的路径。工作区位置也是项目的缺省位置。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR><FONT color=blue>-debug [optionsFile]</FONT><BR>将平台置于调试方式，并从给定位置处的文件装入调试选项（如果指定的话）。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置，则平台在启动 eclipse 的目录中查找称为".options"的文件。URL 和文件系统路径都可作为文件位置。 1.0 <BR><FONT color=blue>-dev [classpathEntries]</FONT><BR>将平台置于开发方式。将可选类路径条目（用逗号分隔的列表）添加至每个插件的运行时类路径。例如，当工作区包含要开发的插件时，指定 -dev bin 会为每个插件项目的名为 bin 的目录添加类路径条目，允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。 1.0 <BR><FONT color=blue>-endsplash params</FONT><BR>用于在 Eclipse 平台启动并运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <BR><FONT color=blue>-feature featureId</FONT><BR>主要功能部件的标识。主要功能部件为 Eclipse 的已启动实例提供了产品个性，并确定使用的产品定制信息。 2.0 <BR><FONT color=blue>-keyring keyringFilePath</FONT><BR>磁盘上授权数据库（或"密钥环"文件）的位置。此自变量必须与 -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR><FONT color=blue>-nl locale</FONT><BR>定义 Eclipse 平台在其上运行的语言环境的名称。Eclipse 平台通常自动计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有："en_US"和"fr_FR_EURO"。 2.0 <BR>-nolazyregistrycacheloading</FONT><FONT size=2><FONT color=blue>[/color]<BR>取消激活装入优化的平台插件注册表高速缓存。缺省情况下，仅当需要时才从注册表高速缓存（可用时）中装入扩展的配置元素，以减少内存占用。此选项将在启动时强制完全装入注册表高速缓存。 2.1 <BR>[color=blue]-noregistrycache</FONT>绕过读写内部插件注册表高速缓存文件。 2.0 <BR><FONT color=blue>-nosplash</FONT><BR>运行平台而不显示闪屏。 1.0 <BR><FONT color=blue>-os operatingSystem</FONT>定义 Eclipse 平台在其上运行的操作系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件，并用于解析插件清单文件中提及的路径中 $os$ 变量的出现。示例值有：<FONT color=blue>"win32"、"linux"、"hpux"、"solaris"和"aix"</FONT>。 1.0 <BR><FONT color=blue>-password password</FONT>授权数据库的密码。与 -keyring 选项配合使用。 1.0 <BR><FONT color=blue>-perspective perspectiveId</FONT><BR>启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数，则将打开关闭时活动的透视图。 1.0 <BR><FONT color=blue>-plugincustomization &nbsp; &nbsp; &nbsp; propertiesFile</FONT>包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 eclipse 的目录来解释相对路径。 2.0 <BR><FONT color=blue>-plugins pluginsFileURL</FONT>（建议不使用；用 -configuration 代替；支持 1.0 兼容）。 指定 Eclipse 平台查找插件的文件的位置，表示为 URL。该文件为属性文件格式，其中键是任意用户定义名称，值是指向 plugin.xml 文件的显式路径或指向包含插件的目录的路径的用逗号分隔的列表。注意，不允许使用相对 URL。如果指定此项，则此选项会导致创建适当的临时配置。 *1.0 <BR><FONT color=blue>-refresh </FONT>启动时执行工作区的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。 1.0 <BR><FONT color=blue>-showlocation </FONT>用于在窗口标题栏中显示工作区的位置的选项。在发行版 2.0 中，此选项仅与 -data 命令行自变量一起使用。 2.0 <BR><FONT color=blue>-showsplash params</FONT>用于显示闪屏（由可执行的 Eclipse 平台启动器执行）的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <BR><FONT color=blue>-vm vmPath</FONT><BR>要用来运行 Eclipse 平台的"Java 运行时环境"（JRE）的位置。如果不指定此项，则 JRE 位于 jre（它是 Eclipse 可执行文件的兄弟目录）。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR><FONT color=blue>-ws windowSystem</FONT><BR>定义 Eclipse 平台在其上运行的 Windows 系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清单文件中提及的路径中 $ws$ 变量的出现。示例值有：<FONT color=blue>"win32"、"motif"和"gtk"。 1.0 </FONT><BR><BR>将<FONT color=blue> -vmargs</FONT> 条目后面的所有自变量（但不包括 -vmargs）作为虚拟机自变量（即，在要运行的类的前面）直接传递到所指示的 Java VM。注意：如果 Eclipse 启动在 Java vm 自变量（-vmargs）之后提供的自变量（例如，-data），则 Eclipse 将不会启动并且您将接收到"JVM 已终止。出口代码为 1"的错误。<BR><BR>在不同的 VM 上运行 <BR>在 J9 上运行 Eclipse<BR>当在 J9 版本 1.5 上运行 Eclipse 时，建议使用以下 VM 选项： <BR><BR><FONT color=blue>eclipse.exe [eclipse arguments] -vm path_to_j9w.exe &nbsp; &nbsp; &nbsp; &nbsp; -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000</FONT>当在 J9 版本 2.0 上运行 Eclipse 时，J9W 选择的缺省自变量应为合适的选项。但是，要覆盖 Eclipse 可执行文件以内部方式自动设置的参数，必须指定 -vmargs 不带任何参数，如下所示： <BR><BR><FONT color=blue>eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs</FONT>有关进一步信息，参考 J9 VM 文档和帮助。<BR><BR>在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 Eclipse<BR>IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作，但在进行大型开发时是不够的。对于大型开发，应修改 VM 自变量以使有更多的堆可用。例如，下列设置将允许 Java 堆增大为 256MB：</FONT><BR></SPAN></P><img src ="http://www.blogjava.net/javaruijie/aggbug/28679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaruijie/" target="_blank">咖啡时间</a> 2006-01-19 17:18 <a href="http://www.blogjava.net/javaruijie/archive/2006/01/19/28679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>