??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美精品久久久久久久,日韩中文欧美,亚洲一区二区三区精品在线http://www.aygfsteel.com/javaruijie/zh-cnSun, 29 Jun 2025 01:52:54 GMTSun, 29 Jun 2025 01:52:54 GMT60诊断q解决ORA-04031 错误http://www.aygfsteel.com/javaruijie/archive/2007/06/20/125246.html咖啡旉咖啡旉Wed, 20 Jun 2007 02:11:00 GMThttp://www.aygfsteel.com/javaruijie/archive/2007/06/20/125246.htmlhttp://www.aygfsteel.com/javaruijie/comments/125246.htmlhttp://www.aygfsteel.com/javaruijie/archive/2007/06/20/125246.html#Feedback0http://www.aygfsteel.com/javaruijie/comments/commentRss/125246.htmlhttp://www.aygfsteel.com/javaruijie/services/trackbacks/125246.html当我们在׃n池中试图分配大片的连l内存失败的时候,Oracle首先清除池中当前没用的所有对象,使空闲内存块合ƈ。如果仍然没有够大单个的大块内存满?׃产生ORA-04031 错误?

当这个错误出现的时候你得到的错误解释信息类似如?

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".

1.׃n池相关的实例参数

在l之前,有必要理解下面的实例参数:

  • SHARED_POOL_SIZE
    q个参数指定了共享池的大,单位是字节。可以接受数字值或者数字后面跟上后~"K" ?"M" ?K"代表千字? "M"代表兆字节?
  • SHARED_POOL_RESERVED_SIZE
    指定了ؓ׃n池内存保留的用于大的q箋h的共享池I间。当׃n池碎片强制 Oracle 查找q攑֤块未使用的池来满_前的h的时候,q个参数和SHARED_POOL_RESERVED_MIN_ALLOC 参数一起可以用来避免性能下降?
  • q个参数理想的值应该大到以满Q何对保留列表中内存的h扫描而无需从共享池中刷新对象。既然操作系l内存可以限制共享池的大,一般来_你应该设定这个参Cؓ SHARED_POOL_SIZE 参数?10% 大小?
  • SHARED_POOL_RESERVED_MIN_ALLOC q个参数的值控制保留内存的分配。如果一个够尺寸的大块内存在共享池I闲列表中没能找刎ͼ内存׃保留列表中分配一块比q个值大的空间。默认的值对于大多数pȝ来说都够了。如果你加大q个|那么Oracle 服务器将允许从这个保留列表中更少的分配ƈ且将从共享池列表中请求更多的内存。这个参数在Oracle 8i 和更高的版本中是隐藏的。提交如下的语句查找q个参数?
    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;
        
    10g 注释QOracle 10g 的一个新Ҏ(gu)叫?"自动内存理" 允许DBA保留一个共享内存池来分shared pool,buffer cache, java pool 和large pool。一般来_当数据库需要分配一个大的对象到׃n池中q且不能扑ֈq箋的可用空_自动用其他SGAl构的空闲空间来增加׃n池的大小 。既然空间分配是Oracle自动理的,ora-4031出错的可能性将大大降低。自动内存管理在初始化参数SGA_TARGET大于0的时候被ȀzR当前设定可以通过查询v$sga_dynamic_components 视图获得。请参?0g理手册以得到更多内??

2.诊断ORA-04031 错误

注:大多数的常见?ORA-4031 的生都?SHARED POOL SIZE 有关Q这文章中的诊断步骤大多都是关于共享池的。 对于其它斚w如Large_pool或是Java_poolQ内存分配算法都是相似的Q一般来说都是因为结构不够大造成?

ORA-04031 可能是因?SHARED POOL 不够大,或是因ؓ片问题D数据库不能找到够大的内存块?/p> ORA-04031 错误通常是因为库高速缓冲中或共享池保留I间中的片?在加大共享池大小的时 候考虑调整应用,使用׃n的SQL q且调整如下的参敎ͼ

SHARED_POOL_SIZE,
SHARED_POOL_RESERVED_SIZE,
SHARED_POOL_RESERVED_MIN_ALLOC.
首先判定是否ORA-04031 错误是由׃n池保留空间中的库高速缓冲的片产生的。提交下的查询:
SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,
last_failure_size
FROM v$shared_pool_reserved;
如果:
REQUEST_FAILURES > 0 q且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC

那么ORA-04031 错误是因ؓ׃n池保留空间缺连l空间所致。要解决q个问题,可以考虑加大SHARED_POOL_RESERVED_MIN_ALLOC 来降低缓冲进?享池保留I间的对象数目,q增?SHARED_POOL_RESERVED_SIZE ?SHARED_POOL_SIZE 来加大共享池保留I间的可用内存?/p> 如果Q?

REQUEST_FAILURES > 0 q且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC
或?
REQUEST_FAILURES {于0 q且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

那么是因为在库高速缓冲缺连l空间导致ORA-04031 错误?

W一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的对象到共享池保留I间中ƈ且加大SHARED_POOL_SIZE?

3.解决ORA-04031 错误

  • ORACLE BUG

    Oracle推荐对你的系l打上最新的PatchSet。大多数的ORA-04031错误都和BUG 相关Q可以通过使用q些补丁来避免?

    下面表中ȝ和和q个错误相关的最常见的BUG、可能的环境和修补这个问题的补丁?

    BUG 描述 Workaround Fixed
    <Bug:1397603> ORA-4031/SGA memory leak of PERMANENT memory occurs for buffer handles _db_handles_cached = 0 901/ 8172
    <Bug:1640583> ORA-4031 due to leak / cache buffer chain contention from AND-EQUAL access Not available 8171/901
    <Bug:1318267> INSERT AS SELECT statements may
    not be shared when they should be
    if TIMED_STATISTICS. It can lead to ORA-4031

    _SQLEXEC_PROGRESSION_COST=0

    8171/8200
    <Bug:1193003> Cursors may not be shared in 8.1
    when they should be
    Not available 8162/8170/ 901
    <Bug:2104071> ORA-4031/excessive "miscellaneous" shared pool usage possible. (many PINS) None-> This is known to affect the XML parser. 8174, 9013, 9201
    <Note:263791.1> Several number of BUGs related to ORA-4031 erros were fixed in the 9.2.0.5 patchset Not available 9205

  • ~译Java代码时出现的ORA-4031

    在你~译Java代码的时候如果内存溢出,你会看到错误Q?/p>

    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")
        

    解决办法是关闭数据库然后把参?JAVA_POOL_SIZE 讑֮Z个较大的倹{这里错误信息中提到?"shared pool" 其实׃n全局?SGA)溢出的误|q不表示你需要增加SHARED_POOL_SIZEQ相反,你必d?JAVA_POOL_SIZE 参数的|然后重启动系l,再试一下。参? <Bug:2736601> ?br>

  • 的׃n池尺?/strong>

    很多情况下,׃n池过能够导致ORA-04031错误。下面信息有助于你调整共享池大小Q?

    • 库高速缓冲命中率

      命中率有助于你衡量共享池的用,有多语句需要被解析而不是重用。下面的SQL语句有助于你计算库高速缓冲的命中率:

      SELECT SUM(PINS) "EXECUTIONS",
              SUM(RELOADS) "CACHE MISSES WHILE EXECUTING"
              FROM V$LIBRARYCACHE;
              

      如果丢失过1%,那么试通过加大׃n池的大小来减库高速缓冲丢失?/p>

    • ׃n池大计?/strong>

      要计最适合你工作负载的׃n池大,请参考:

      <Note:1012046.6>: HOW TO CALCULATE YOUR SHARED POOL SIZE.
  • ׃n池碎?/strong>

    每一ơ,需要被执行的SQL 或者PL/SQL 语句的解析Ş式蝲入共享池中都需要一块特定的q箋的空间。数据库要扫描的W一个资源就是共享池中的I闲可用内存。一旦空闲内存耗尽Q数据库要查找一块已l分配但q没使用的内存准备重用。如果这L切寸的大块内存不可用Q就l箋按照如下标准LQ?/p>

    • 大块(chunk)大小比请求的大小?
    • I间是连l的
    • 大块内存是可用的(而不是正在用的)

    q样大块的内存被分开Q剩余的d到相应的I闲I间列表中。当数据库以q种方式操作一D|间之后,׃n池结构就会出现碎片?

    当共享池存在片的问?分配一片空闲的I间׃p更多的时?数据库性能也会下降(整个操作的过E中Q?chunk allocation"被一个叫?shared pool latch" 的闩所控制) 或者是出现 ORA-04031 错误errors (在数据库不能扑ֈ一个连l的I闲内存块的时??

    参?<Note:61623.1>: 可以得到关于׃n池碎片的详细讨论?
    如果SHARED_POOL_SIZE _大,大多数的 ORA-04031 错误都是由共享池中的动态SQL 片D的。可能的原因如下Q?
    • 非共享的SQL
    • 生成不必要的解析调用 (软解?
    • 没有使用l定变量

    要减碎片的产生你需要确定是前面描叙的几U可能的因素。可以采取如下的一些方法,当然不只局限于q几U? 应用调整、数据库调整或者实例参数调整?

    请参?<Note:62143.1>Q描qC所有的q些l节内容。这个注释还包括了共享池如何工作的细节?

    下面的视图有助于你标明共享池中非׃n的SQL/PLSQLQ?

    • V$SQLAREA 视图

      q个视图保存了在数据库中执行的SQL 语句和PL/SQL 块的信息。下面的SQL 语句可以昄l你带有literal 的语句或者是带有l定变量的语句:

      SELECT   SUBSTR (sql_text, 1, 40) "SQL", COUNT (*),
              SUM (executions) "TotExecs"
              FROM v$sqlarea
              WHERE executions < 5
              GROUP BY SUBSTR (sql_text, 1, 40)
              HAVING COUNT (*) > 30
              ORDER BY 2;
              

      ? Having 后的数?"30" 可以Ҏ(gu)需要调整以得到更ؓ详细的信息?

    • X$KSMLRU 视图

      q个固定表x$ksmlru 跟踪׃n池中D其它对象换出(age out)的应用。这个固定表可以用来标记是什么导致了大的应用?

      如果很多对象在共享池中都被阶D|的h可能D响应旉问题q且有可能在对象重蝲入共享池中的时候导致库高速缓冲闩竞争问题?

      关于q个x$ksmlru 表的一个不d的地方就是如果有Z表中选取内容q个表的内容׃被擦除。这栯个固定表只存储曾l发生的最大的分配。这个值在选择后被重新讑֮q样接下来的大的分配可以被标讎ͼ即它们不如先前的分配过的大。因L重置Q在查询提交后的l果不可以再ơ得刎ͼ从表中的输出的结果应该小心的保存。监视这个固定表q行如下操作Q?

      SELECT * FROM X$KSMLRU WHERE ksmlrsiz > 0;
              

      q个表只可以用SYS用户dq行查询?

    • X$KSMSP 视图 (cM堆Heapdump信息)

      使用q个视图能找出当前分配的I闲I间Q有助于理解׃n池碎片的E度。如我们在前面的描述Q查找ؓ游标分配的够的大块内存的第一个地Ҏ(gu)I闲列表( free list)?下面的语句显CZI闲列表中的大块内存:

      SELECT   '0 (<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 < 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 >= 4108 AND ksmchcls = 'free'
              GROUP BY ksmchcls, 1000 * TRUNC (ksmchsiz / 1000);
              

4. ORA-04031 错误?Large Pool

大池是个可选的内存区,Z下的操作提供大内存分配:

  • MTS会话内存?Oracle XA 接口
  • Oracle 备䆾与恢复操作和I/O服务器进E用的内?~冲)
  • q行执行消息~冲
大池没有LRU列表。这和共享池中的保留I间不同Q保留空间和׃n池中其他分配的内存用同LLRU列表。大块内存从不会换出大池中,内存必须是显式的被每个会话分配ƈ释放。一个请求如果没有够的内存Q就会生类DL一个ORA-4031错误Q?
ORA-04031: unable to allocate XXXX bytes of shared memory
("large pool","unknown object","session heap","frame")
q个错误发生时候可以检查几件事情:
  • 1- 使用如下语句?V$SGASTAT Q得知用和I闲的内存:
    SELECT pool,name,bytes FROM v$sgastat where pool = 'large pool';
        
  • 2- 你还可以采用 heapdump level 32 ?dump 大池的堆q检查空闲的大块内存的大?/strong>

    从大池分配的内存如果是LARGE_POOL_MIN_ALLOC 子节的整块数有助于避免碎片。Q何请求分配小于LARGE_POOL_MIN_ALLOC 大块寸都将分配LARGE_POOL_MIN_ALLOC的大。一般来_你会看到使用大池的时候相对共享池来说要用到更多的内存。通常要解军_池中的ORA-4031错误必须增加 LARGE_POOL_SIZE 的大?/p>


5. ORA-04031 和共享池h


有一些技巧会提高游标的共享能力,从而共享池片和ORA-4031都会减少?strong>最佳途径是调整应用用绑定变?/strong>。另外在应用不能调整的时候考虑使用CURSOR_SHARING参数和FORCE不同的值来做到 (要注意那会导致执行计划改变,所以徏议先对应用进行测?。当上述技巧都不可以用的时候,q且片问题在系l中比较严重Q刷新共享持可能有助于减ȝ片问题。但是,必须加以如下考虑Q?
  • h导致所有没被用的游标从共享池删除。这P在共享池h之后Q大多数SQL和PL/SQL游标必须被硬解析。这提高CPU的用,也会加大Latch的活动?
  • 当应用程序没有用绑定变量ƈ被许多用戯行类似的操作的时?如在OLTPpȝ? Q刷C后很快还会出现碎片问题。所以共享池对设计糟p的应用E序来说不是解决办法?
  • 对一个大的共享池h可能会导致系l挂P其是实例繁忙的时候,推荐在非高峰的时候刷?/li>

6. ORA-04031错误的高U分?

如果前述的这些技术内定w不能解决ORA-04031 错误Q可能需要额外的跟踪信息来得到问题发生的׃n池的快照?

调整init.ora参数d如下的事件得到该问题的跟t信息:

event = "4031 trace name errorstack level 3"
event = "4031 trace name HEAPDUMP level 3"
如果问题可重玎ͼ该事件可讑֮在会话层Q在执行问题语句之前使用如下的语句:
SQL> alter session set events '4031 trace name errorstack level 3';
SQL> alter session set events '4031 trace name HEAPDUMP level 3';
把这个跟t文件发lOracle支持人员q行排错?

重要标注: Oracle 9.2.0.5 和Oracle 10g 版本中,每次在发生ORA-4031 错误的时候会自动创徏一个跟t文Ӟ可以在user_dump_dest 目录中找到。如果你的系l是上述的版本,你不需要再q行前面描述中的步骤?


参考信?/h2>
Metalink - http://metalink.oracle.com
<Note:1012046.6> How to Calculate Your Shared Pool Size
<Note:62143.1> Understanding and Tuning the Shared Pool
<Note:1012049.6> Tuning Library Cache Latch Contention
<Note:61623.1> Resolving Shared Pool Fragmentation
<Note:146599.1> Diagnosing and Resolving Error ORA-04031

咖啡旉 2007-06-20 10:11 发表评论
]]>在Tomcat下JSP、Servlet和JavaBean环境的配|?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javaruijie/archive/2006/09/14/69742.html</guid><wfw:comment>http://www.aygfsteel.com/javaruijie/comments/69742.html</wfw:comment><comments>http://www.aygfsteel.com/javaruijie/archive/2006/09/14/69742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javaruijie/comments/commentRss/69742.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javaruijie/services/trackbacks/69742.html</trackback:ping><description><![CDATA[ <font size="2"> <br />ȝ了一下如何tomcat下配|jsp、servlet和Javabean?br /><br />W一步:下蝲j2sdk和tomcatQ到sun官方站点Q?</font> <a > <font size="2">http://java.sun.com/j2se/1.4.2/download.htmlQ下载j2sdkQ注意下载版本ؓWindows</font> </a> <font size="2"> Offline Installation的SDKQ同时最好下载J2SE 1.4.2 documentQtionQ然后到tomcat官方站点Q?</font> <a > <font size="2">http://www.apache.org/dist/jakarta/tomcat-4/Q下载tomcatQ下载最?.1.x版本的tomcatQ;</font> </a> <br /> <br /> <font size="2">W二步:安装和配|你的j2sdk和tomcatQ执行j2sdk和tomcat的安装程序,然后按默认设|进行安装即可?br />1.安装j2sdk以后Q需要配|一下环境变量,在我的电(sh)?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的j2sdk安装在c:\j2sdk1.4.2)Q?br />JAVA_HOME=c:\j2sdk1.4.2<br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Q?;一定不能少Q因为它代表当前路径Q?br />path=%JAVA_HOME%\bin<br />接着可以写一个简单的javaE序来测试J2SDK是否已安装成功:<br />public class Test{<br />public static void main(String args[]){<br />System.out.println("This is a test program.");<br />}<br />}<br />上面的q段E序保存为文件名为Test.java的文件?br />然后打开命o提示W窗口,cdC的Test.java所在目录,然后键入下面的命?<br />javac Test.java<br />java Test <br />此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印句话Q你需要仔l检查一下你的配|情c?br /><br />2.安装Tomcat后,在我的电(sh)?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的tomcat安装在c:\tomcat)Q?br />CATALINA_HOME=c:\tomcat;<br />CATALINA_BASE=c:\tomcat;<br />然后修改环境变量中的classpathQ把tomat安装目录下的common\lib下的servlet.jarq加到classpath中去Q修改后的classpath如下Q?br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;<br />接着可以启动tomcatQ在IE中访?</font> <a href="http://localhost:8080Q如果看到tomcat的欢q页面的话说明安装成功了?"> <font size="2">http://localhost:8080Q如果看到tomcat的欢q页面的话说明安装成功了?/font> </a> <br /> <font size="2">W三步:建立自己的jsp app目录<br />1.到Tomcat的安装目录的webapps目录Q可以看到ROOTQexamples, tomcat-docs之类Tomcat自带的的目录Q?br />2.在webapps目录下新Z个目录,起名叫myappQ?br />3.myapp下新Z个目录WEB-INFQ注意,目录名称是区分大写的;<br />4.WEB-INF下新Z个文件web.xmlQ内容如下:<br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />" </font> <a > <font size="2">http://java.sun.com/dtd/web-app_2_3.dtd</font> </a> <font size="2">";><br /><br /><web-app><br /><display-name>My Web Application</display-name><br /><description><br />A application for test.<br /></description><br /></web-app><br />5.在myapp下新Z个测试的jsp面Q文件名为index.jspQ文件内容如下:<br /><html><body><center><br />Now time is: <%=new java.util.Date()%><br /></center></body></html><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 />W四步:建立自己的ServletQ?br />1.用你最熟?zhn)的编辑器Q徏议用有语法查的java ideQ新Z个servletE序Q文件名为Test.javaQ文件内容如下:<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("<html><body><h1>This is a servlet test.</h1></body></html>");<br />out.flush();<br />}<br />}<br />2 .~译<br />Test.java攑֜c:\test下,使用如下命o~译Q?br />C:\Test>javac Test.java<br />然后在c:\Test下会产生一个编译后的servlet文gQTest.class<br />3 .结构test\Test.class剪切?CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那个test目录到classes目录下,如果classes目录不存在,新Z个?现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结?br />4 .修改webapps\myapp\WEB-INF\web.xmlQ添加servlet和servlet-mapping<br />~辑后的web.xml如下所C,U色为添加的内容:<br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />" </font> <a > <font size="2">http://java.sun.com/dtd/web-app_2_3.dtd</font> </a> <font size="2">";><br /><br /><display-name>My Web Application</display-name><br /><description><br />A application for test.<br /></description><br /><servlet><br /><servlet-name>Test</servlet-name><br /><display-name>Test</display-name><br /><description>A test Servlet</description><br /><servlet-class>test.Test</servlet-class><br /></servlet><br /><servlet-mapping><br /><servlet-name>Test</servlet-name><br /><url-pattern>/Test</url-pattern><br /></servlet-mapping><br /></web-app><br />q段话中的servletq一D声明了你要调用的ServletQ而servlet-mapping则是声明的servlet“映”到地址/Test?br />5 .好了Q启动TomcatQ启动浏览器Q输?</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.p明编写的servlet成功了?br />注意Q修改了web.xml以及新加了classQ都要重启Tomcat<br /><br />W四步:建立自己的BeanQ?br />1.用你最熟?zhn)的编辑器Q徏议用有语法查的java ideQ新Z个javaE序Q文件名为TestBean.javaQ文件内容如下:<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下,使用如下命o~译Q?br />C:\Test>javac TestBean.java<br />然后在c:\Test下会产生一个编译后的bean文gQTestBean.class<br />3 .TestBean.class文g剪切?%CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,<br />4 .新徏一个TestBean.jsp文gQ文件内容ؓQ?br /><%@ page import="test.TestBean" %> <br /><html><body><center><br /><%<br />TestBean testBean=new TestBean("This is a test java bean.");<br />%><br />Java bean name is: <%=testBean.getName()%><br /></center></body></html> <br />5 .好了Q重启TomcatQ启动浏览器Q输?</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.p明编写的Bean成功了?br /><br />q样完成了整个Tomcat下的jsp、servlet和javabean的配|。接下来需要做的事情就是多看书、多d人的好代码,自己多动手写代码以增己在q方面开发的能力了?/font> <br /> <img src ="http://www.aygfsteel.com/javaruijie/aggbug/69742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javaruijie/" target="_blank">咖啡旉</a> 2006-09-14 19:37 <a href="http://www.aygfsteel.com/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) http://www.aygfsteel.com/javaruijie/archive/2006/08/22/65014.html咖啡旉咖啡旉Tue, 22 Aug 2006 03:01:00 GMThttp://www.aygfsteel.com/javaruijie/archive/2006/08/22/65014.htmlhttp://www.aygfsteel.com/javaruijie/comments/65014.htmlhttp://www.aygfsteel.com/javaruijie/archive/2006/08/22/65014.html#Feedback0http://www.aygfsteel.com/javaruijie/comments/commentRss/65014.htmlhttp://www.aygfsteel.com/javaruijie/services/trackbacks/65014.html

下面的片断{载于www.itpub.net

[TIP]关于Java开发中使用Oracle数据库的一Ҏ(gu)意事(原创Q?/font>

很多朋友在Java开发中Q用Oracle数据库的时候,l常会碰到有ORA-01000: maximum open cursors exceeded.的错误?

实际上,q个错误的原因,主要q是代码问题引v的?
ora-01000: maximum open cursors exceeded.
表示已经辑ֈ一个进E打开的最大游标数?

q样的错误很Ҏ(gu)出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是Q如果你的createStatement和prepareStatement是在一个@环里面的话,׃非常Ҏ(gu)出现q个问题。因为游标一直在不停的打开Q而且没有关闭?

一般来_我们在写Java代码的时候,createStatement和prepareStatement都应该要攑֜循环外面Q而且使用了这些Statment后,及时关闭。最好是在执行了一ơexecuteQuery、executeUpdate{之后,如果不需要用结果集QResultSetQ的数据Q就马上Statment关闭?

对于出现ORA-01000错误q种情况Q单U的加大open_cursorsq不是好办法Q那只是L不治本。实际上Q代码中的隐(zhn)ƈ没有解除?
而且Q绝大部分情况下Qopen_cursors只需要设|一个比较小的|p够用了Q除非有非常特别的要求?/font>



咖啡旉 2006-08-22 11:01 发表评论
]]>
VI命o使用大全Q{帖)http://www.aygfsteel.com/javaruijie/archive/2006/08/17/64170.html咖啡旉咖啡旉Thu, 17 Aug 2006 09:40:00 GMThttp://www.aygfsteel.com/javaruijie/archive/2006/08/17/64170.htmlhttp://www.aygfsteel.com/javaruijie/comments/64170.htmlhttp://www.aygfsteel.com/javaruijie/archive/2006/08/17/64170.html#Feedback0http://www.aygfsteel.com/javaruijie/comments/commentRss/64170.htmlhttp://www.aygfsteel.com/javaruijie/services/trackbacks/64170.html 从shell中启动可视化~辑?
vi filename 指示shell启动vi~辑器,q将参数filename传给它。如果当前目前中存在该文Ӟ则vi~辑器将它解释ؓ要打开的文Ӟ如果没有该文Ӟ则vi~译器创建新文g
vi file1 file2 file3 shell传?个参数给viQvi它们解释ؓ要打开的文件。可以?w命o保存文gQ?n命o讉K下一个文?
vi +# filename 打开文gQƈ光标移到指定的行。例如,命ovi +100 records 从第100行开始编辑文件records
vi +/the filename 打开文gQƈ光标移动包含有目标字符串的行。例如,命ovi +/Jason friends 从第1个含有字W串Jason的行开始编辑文件friends
view filename 打开文gq行~辑Q但是拒l保存对文g的修改,除非使用w!命o
光标Ud命o
hjkl 光标分别向左、下、上、右Ud一个字W?
0(? 光标移到当前行的行?
^(脱字W? ?一样将光标Ud当前行的行首
$ 光标移到当前行的行?
##G 光标移到G前面的数字指定的行。例如,42G光标移到文件的W?2?
G 光标移到文件的最后一?
w 光标向前移C一个单词的首字?
e 光标向前移C一个单词的最后一个字?
b 光标向后移C一个单词首字母
- 光标定位到上一行的行首
+ 光标定位到下一行的行首
12| 光标定位到当前行的W?2?
L 光标定位到屏幕的最下面一?
M 光标定位到屏幕中间的一?
H 光标定位到屏幕的最上面一?
'' 两个单引号将光标Ud它的先前的位|?
光标定位命oQ上下文的)
fb 光标向前移到当前行上的下一个字母bQ或者其他的L指定的字W)
Fb 光标向后移到当前行上的上一个字母bQ或指定的字W)
t# 光标移到当前行上字W#的第1个实例的右侧。例如,命otM光标移到当前行上第1个M的右?
T# 在当前行上向左移动光标,它Ud字符Q的W?个实例的前一字符
/word 光标向前移到单词word的下一个实?
?word 光标向后移到单词word的上一个实?
n 光标移到前面命?word?word中指定模式的下一个实?
昄调整命o
Ctrl+D 昄文g中的下半屏文?
Ctrl+U 昄文g中的上半屏文?
Ctrl+F 昄文g中的下一屏文?
Ctrl+B 昄文g中的上一屏文?
讄昄选项
:set number 行号作为屏q显C的一部分Q但是行号ƈ不是文g的一部分。它的羃写Ş式ؓ:set nu
:set nonumber 清除屏幕上的行号。也可以使用~写形式:set nonu
:set showmode 在屏q的右下角显C加模式信?
:set list 在每行的行末昄元W号Qƈ用Ctrl+I表示制表W?
:set showmatch 在输入)或]Ӟ光标移C之匹配的Q或[
:set window=value 定义屏幕上显C的文本行的行数
:set autoindent 自动~进。也可以使用~写形式:set ai
:set tabstop=value 讄昄制表W的I格字符个数。也可以使用~写形式ts=value
:set wrapmargin=value 讄昄器的右页辏V当输入q入所讄的页Ҏ(gu)Q编辑器自动回R换行
:set ignorecase 指示~辑器搜索字W串Qƈ忽略目标中字母的大小?
:set 昄讄的所有选项
:set all 昄所有可以设|的选项
文本删除命o
dd 删除当前光标所有的文本?
#dd 删除Q行文本
dw 从文本中删除一个单?
#dw 从文本中删除Q个单词
x 删除光标所在的一个字W?
#x 从文本中删除Q个字符
D 删除当前行上光标后面的部?
:#,#d 例如Q?12,37d 删除第12?7行之间的所有文本,包括W?2?7?
撤销命o
u 撤销。恢复最q一ơ的文本修改操作Q即使已l移动了光标。在Linuxpȝ中,再次使用撤销命o恢复更前一ơ的文本修改操作。在BSD的vi中,W?ơ撤销操作撤销W一ơ撤销操作Q恢复第1ơ撤销前修改的文本
:redo 在Linuxpȝ中,取消撤销操作恢复文本修改。在标准的UNIXpȝ中,W?个u命o取消W?个u命oQ结果就是一个“redo?
U 如果在修改后q没有将光标Ud当前行,则可以撤销对当前行q行的所有的文本修改
向文本中d文本
a(写) 从光标的右侧开始插入文?
A(大写) 从当前行的行末开始添加文?
i(写) 从光标的左侧开始插入文?
I(大写) 从当前行的行首插入文?
o(写) 在光标的下面打开Q或插入Q一个新?
O(大写) 在光标的上面打开一个新?
:#r filename 例如Q?8r report.oldd文greport.oldQƈ它的内Ҏ(gu)到当前文件的W?行之?
Esc 无论使用什么命令进入了q加/插入模式Q都可以通过按Esc键离开q加模式q回到vi的命令模?
Ctrl+V 允许输入控制字符。按Ctrl+V键后再按回R键将把Ctrl+M插入到文件中
在文件中修改文本
cw 仅仅修改光标处的单词Q删除单词,然后q入q加模式中,以在被删除单词的位置d文本Q?
s(写) 替换单个字符
S(大写) 替换整行文本
cc 替换整行文本(同S)
r 用输入的下一个字W替代当前光标处的字W,q自动返回到命o模式
R 编辑器攑ֈ覆盖模式Q用输入的字W来逐个替换光标处的字符
C(大写) 修改行上从光标到行末之间的文?
ct# 修改行上从光标到前向W?个目标字W之间的文本。例如ctY删除当前行上从光标到向前第1个字WY之间的所有文本,q进入追加模式以在删除文本的位置d文本
cf# 修改行上从光标到前向W?个目标字W之间的文本Q包括目标字W)。例如cfY删除当前行上从光标到向前第1个字WY之间Q包括YQ的所有文本,q进入追加模式以在删除文本的位置d文本
cT# 修改行上从光标到后向W?个目标字W之间的文本。例如cTY删除当前行上从光标到向后第1个字WY之间的所有文本,q进入追加模式以在删除文本的位置d文本
cF# 修改行上从光标到后向W?个目标字W之间的文本Q包括目标字W)。例如cFY删除当前行上从光标到向后第1个字WY之间Q包括YQ的所有文本,q进入追加模式以在删除文本的位置d文本
接出和粘贴行的单?
yy 当前行复制或接出到内在~冲区?0yy当前行和它后面?9行(?0行)文本复制到内存。目标行仍然保留在文件中Q可以用p命o这些内存中的文本粘贴到文g?
dd 删除当前行,q将它放Cyy命o使用的相同的内存~冲区。目标行从文件中删除Q但是可以用p命o它_脓(chung)到文件中的其他地?
yw 当前光标所在的单词接出或复制到内在~冲区?yw命o把当前单词和它后面?个(?个)单词复制到内?
dw 删除当前的单词,q将它放Cyw命o使用的相同的内存~冲区。可以用p命o单词粘贴到文g的其他地?
yt# 接出从光标到向前一个字W(不包括该字符Q之间的文本。例如,ytB命o从光标到字WB的下一实例Q不包括字符BQ之间的文本接出或复制到内存
yf# 接出从光标到向前一个字W(包括该字W)之间的文本。例如,yf:命o从光标到字W?的下一个实例(包括字符:Q之间的文本接出或复制到内存
yT# 后向接出Q不包括目标字符Q。例如,yTN命o从光标到字WN的后向第1个实例之间的文本Q不包括字符NQ接出或复制到内?
yF# 后向接出Q包括目标字W)。例如,yFJ命o把从光标到字符N的向后第1个实例之间的文本Q包括字WNQ接出或复制到内?
p 内存中的文本行_脓(chung)到文件中光标所在行的下面,或将内存中的单词_脓(chung)到文件中光标的右?
P(大写) 接出或删除的文本行_脓(chung)到文件中光标所在行的上面。或接出或删除的单词粘贴到文g中光标的左侧
文gUd命o
J 下行文本同当前行合q成一?
:#,# move # 指定的行移到目标位|?12,35 move 58命o第12?5行之间的所有文本移到第58行的后面。羃写ؓmo
:1,26 co 82 第1?6行之间的所有文本复制到W?2行的后面Q可以选择行号Q?
使用可视化编辑器q行全局~辑
:s /target/replacement/ 查找当前行上目标字符串的W?个实例ƈ删除Q然后用字符串replacement替换。只修改当前行上的第1个目标实?
:g /target/s//replacement/ 查找所有行上目标字W串的第1个实例ƈ删除Q然后用字符串replacement替换。修Ҏ(gu)有行上目标的W?个实?
:#,# s/target/replacement/ 在指定的行上q行替换。例如,:7,37 s/march/walk/查扄7?7行之间的所有文本行Qƈ用字W串walk替换每行中的W?个目标字W串march。所有指定行上的W?个目标字W串修改
:#,# s/target/replacement/g 在指定的行上q行全局替换。例如,:1,$ s/fun/joyful/g 在W?行到文g最后一行之间查扄标字W串fun的所有实例ƈ删除Q然后用字符串joyful替换。指定行上的目标字符串的所有实例都被修?
:g /target/s/replacement 查找所有行上目标字W串的第1个实例ƈ删除Q然后用字符串replacement替换。所有行上的W?个目标都被修?
:#,# target/s/replacement/ 在指定的行上q行替换Q例如,:7,37 march/s/walk命o在第7?7行之间每个文本行上查扄标字W串的第1个实例ƈ删除Q然后用字符串walk替换。所有指定行上的W?个目标字W串都被修改
:#,# target/s/replacement/g 在指定的行上q行全局替换。例如,:1,$ fun/s/joyful/g在W?行到文g最后一行之间查扄标字W串fun的所有实例ƈ删除Q然后用字符串joyful替换。指定行上的所有目标字W串都被修改
~辑工具Q映,~写和标?
m# 用字母标记当前行。例如,ma命o表示用a标记当前行。即使移动了标记行,它仍然标CؓaQ可以用a来定位该?
'# 定位标记行。例如,命o'a光标移到标记a的行。命?a,$d删除从标记行到文g末尾之间的所有行
:map # command string 在命令模式中输入Q时Q将其作Z个命令串。例如,:map #o#!/bin/ksh产生一个新的命令模式指令,(zhn)输入#Ӟ它被解释?o打开个新行,q添加文?!/bin/ksh到文件中。ؓ了在命o中包含回车和其他控制字符Q可以在它们的前面用Ctrl+V命o
:ab abbreviation char-string 讄q加模式~写。例如,在命令模式中输入:ab mv Milky Way GalaxyQ则建立~写。如果在q加模式中输入字W串mwQ然后按Esc键,mw被Milky Way Galaxy替代
在vi~辑器中向shell发出命o
:!ls 启动一个shellQƈ让shellq行lsE序。在q行完指定的E序后,必须按回车键以返回到~辑器中
:!ksh 启动一个shellQ它允许q行多个命o。退出shell可以回到~译器中
:Or!speel% 对当前文?%)q行拼写查,q将spell的输到当前文g中,从第1?0行后?开始放|这些输?
:31r!command% q行UNIX命oQ如cal或dateQƈ它的输入到当前文gQ从W?1行开始放|这些输?
Ctrl+Z 用于挂v当前~辑会话q程的csh和ksh命oQ它允许(zhn)向父shell发出命o
fg 重新ȀzLL~辑q程的csh和ksh命o
诅R写和退出编辑器
:wq 保存~辑会话期间Ҏ(gu)件所做的修改Q退出编辑器q回到shell
:q 如果没有Ҏ(gu)件进行修Ҏ(gu)d文gQ可以用q退出对一个文件的~辑
:q! 退出对文g的编辑返回到shell模式Q但是不保存在编辑会话期间对文g所做的修改
:w filename v文件的~冲区副本(修改版本Q保存到一个新文g
[color=#DC143C][b]:#,# w newtest 例如Q?1,6 w newtext命o创徏一个名为newtext的文Ӟq将当前文g的第1?行文本复制到文gnewtext?
:1,6 w >> oldfile 当前文件的W??行文本的一个副本追加到已有文goldfile的末?
:1,6 w! oldfile 用当前文件的W??行文本覆盖文件oldfile



咖啡旉 2006-08-17 17:40 发表评论
]]>
一D判断日期时间是否有效的JavaScripthttp://www.aygfsteel.com/javaruijie/archive/2006/05/16/46464.html咖啡旉咖啡旉Tue, 16 May 2006 11:25:00 GMThttp://www.aygfsteel.com/javaruijie/archive/2006/05/16/46464.htmlhttp://www.aygfsteel.com/javaruijie/comments/46464.htmlhttp://www.aygfsteel.com/javaruijie/archive/2006/05/16/46464.html#Feedback1http://www.aygfsteel.com/javaruijie/comments/commentRss/46464.htmlhttp://www.aygfsteel.com/javaruijie/services/trackbacks/46464.html <script language=javascript>
function strDateTime(str){
var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;
var r = str.match(reg);
if(r==null)return false;
var d= new Date(r[1], r[3]-1,r[4]);
var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate()
return newStr==str
}
alert(strDateTime("2002-1-31"))
alert(strDateTime("2002-1-41"))
</script>
<script language=javascript>
function strDateTime(str){
var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
var r = str.match(reg);
if(r==null)return false;
var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
var newStr=d.getFullYear()+r[2]+(d.getMonth()+1)+r[2]+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()
return newStr==str
}
alert(strDateTime("2002-1-31 12:34:56"))
alert(strDateTime("2001-2-29 12:54:56"))
alert(strDateTime("2002-1-41 12:00:00"))
</script>

<script language="javascript">
var s="2002-4-16"
alert(chkDate(s));
function chkDate(sDate){
var r=/\d{4}(?:-\d{1,2}){0,2}/
//正则表达式,判断是否为yyyy-mm-dd,yyyy-mm,yyyy格式
if(sDate.match(r)==sDate){
 var arr=sDate.split("-")
 switch(arr.length){
 //Ҏ(gu)不同的yyyy-mm-dd,yyyy-mm格式判断q月日数字是否正?
  case 3:
  var tmpDate=new Date(arr[0],arr[1],arr[2]);
  if(tmpDate.getMonth()==arr[1] && tmpDate.getFullYear()==arr[0]) return true;
  break;
  case 2:
  if(arr[1]<13) return true;
  break;
  default:
  return false;
 }
}
return false;
}
</script>

/*
旉有效性判断函?
All by happywinds
*/
function verifyDate(textObj) {
  var str=textObj.value;
textObj.value = textObj.value.replace(/\s+/g,"");
  if(str.search(/^\d{4}-\d{1,2}-\d{1,2}$/) == 0){
 var y = parseInt(str.split("-")[0]);
   var m = parseInt(str.split("-")[1]);
   var d = parseInt(str.split("-")[2]);
 switch(m){
   case 1:
   case 3:
   case 5:
   case 7:
   case 8:
   case 10:
   case 12:
    if(d>31){
    return false;
          textObj.focus();
          textObj.select();
  }else{
    return true;
  }
    break;
  case 2:
    if((y%4==0 && d>29) || ((y%4!=0 && d>28))){
    return false;
          textObj.focus();
          textObj.select();
  }else{
    return true;
  }
    break;
   case 4:
   case 6:
   case 9:
   case 11:
    if(d>30){
    return false;
          textObj.focus();
          textObj.select();
  }else{
    return true;
  }
    break;
  default:
    return false;
          textObj.focus();
          textObj.select();
 }
}else{
   return false;
          textObj.focus();
          textObj.select();
}
}

原文链接

咖啡旉 2006-05-16 19:25 发表评论
]]>
61条面向对象设计的l验原则http://www.aygfsteel.com/javaruijie/archive/2006/03/09/34501.html咖啡旉咖啡旉Thu, 09 Mar 2006 08:45:00 GMThttp://www.aygfsteel.com/javaruijie/archive/2006/03/09/34501.htmlhttp://www.aygfsteel.com/javaruijie/comments/34501.htmlhttp://www.aygfsteel.com/javaruijie/archive/2006/03/09/34501.html#Feedback0http://www.aygfsteel.com/javaruijie/comments/commentRss/34501.htmlhttp://www.aygfsteel.com/javaruijie/services/trackbacks/34501.html
        (1)所有数据都应该隐藏在所在的cȝ内部?
  (2)cȝ使用者必M赖类的共有接口,但类不能依赖它的使用者?
  (3)量减少cȝ协议中的消息?
  (4)实现所有类都理解的最基本公有接口[例如Q拷贝操?深拷贝和拷?、相{性判断、正输出内宏V从ASCII描述解析{等]?
  (5)不要把实现细?例如攄q代码的私有函?攑ֈcȝ公有接口中?
  如果cȝ两个Ҏ(gu)有一D公׃码,那么可以创Z个防止这些公׃码的U有函数?
  (6)不要以用h法用或不感兴趣的东西扰q的公有接口?
  (7)cM间应该零耦合Q或者只有导合关系。也卻I一个类要么同另一个类毫无关系Q要么只使用另一个类的公有接口中的操作?
  (8)cd该只表示一个关键抽象?
  包中的所有类对于同一cL质的变化应该是共同闭的。一个变化若对一个包影响Q则对包中的所有类产生影响Q而对其他的包不造成M影响 .
  (9)把相关的数据和行为集中放|?
  设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这U类型的行ؓ暗示着q条l验原则被违反了?
  (10)把不相关的信息放在另一个类?也即Q互不沟通的行ؓ)?
  朝着E_的方向进行依?
  (11)保你ؓ之徏模的抽象概念是类Q而不只是对象扮演的角艌Ӏ?
  (12)在水qx向上可能统一地分布系l功能,也即Q按照设计,层cd当统一地共享工作?
  (13)在你的系l中不要创徏全能c?对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心?
  规划一个接口而不是实C个接口?
  (14)对公共接口中定义了大量访问方法的cd加小心。大量访问方法意味着相关数据和行为没有集中存放?
  (15)对包含太多互不沟通的行ؓ的类多加心?
  q个问题的另一表现是在你的应用E序中的cȝ公有接口中创Z很多的get和set函数?
  (16)在由同用L面交互的面向对象模型构成的应用程序中Q模型不应该依赖于界面,界面则应当依赖于模型?
  (17)可能地按照现实世界建模(我们常常Z遵守pȝ功能分布原则、避免全能类原则以及集中攄相关数据和行为的原则而违背这条原? ?
  (18)从你的设计中去除不需要的cR?
  一般来_我们会把q个c降U成一个属性?
  (19)去除pȝ外的cR?
  pȝ外的cȝ特点是,抽象地看它们只往pȝ领域发送消息但q不接受pȝ领域内其他类发出的消息?
  (20)不要把操作变成类。质疑Q何名字是动词或者派生自动词的类Q特别是只有一个有意义行ؓ的类。考虑一下那个有意义的行为是否应当迁Ud已经存在或者尚未发现的某个cM?
  (21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段Q我们常会发现很多代理没有用的,应当去除?
  (22)量减少cȝ协作者的数量?
  一个类用到的其他类的数目应当尽量少?
  (23)量减少cd协作者之间传递的消息的数量?
  (24)量减少cd协作者之间的协作量,也即Q减类和协作者之间传递的不同消息的数量?
  (25)量减少cȝ扇出Q也卻I减少cd义的消息数和发送的消息数的乘积?
  (26)如果cd含另一个类的对象,那么包含cd当给被包含的对象发送消息。也卻I包含关系L意味着使用关系?
  (27)cM定义的大多数Ҏ(gu)都应当在大多数时间里使用大多数数据成员?
  (28)cd含的对象数目不应当超q?A target=_blank>开发?/A>短期记忆的容量。这个数目常常是6?
  当类包含多于6个数据成员时Q可以把逻辑相关的数据成员划分ؓ一l,然后用一个新的包含类d含这一l成员?
  (29)让系l功能在H而深的承体pM垂直分布?
  (30)在实现语义约束时Q最好根据类定义来实现。这常常会导致类泛滥成灾Q在q种情况下,U束应当在类的行Z实现Q通常是在构造函C实现Q但不是必须如此?
  (31)在类的构造函C实现语义U束Ӟ把约束测试放在构造函数领域所允许的尽量深的包含层ơ中?
  (32)U束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中?
  (33)U束所依赖的语义信息如果很改变,那么最好分布在U束所涉及的各个类中?
  (34)cdȝ道它包含什么,但是不能知道谁包含它?
  (35)׃n字面范围(也就是被同一个类所包含)的对象相互之间不应当有用关pR?
  (36)l承只应被用来ؓ特化层次l构建模?
  (37)zcdȝ道基c,基类不应该知道关于它们的zcȝM信息?
  (38)基类中的所有数据都应当是私有的Q不要用保护数据?
  cȝ设计者永q都不应该把cȝ使用者不需要的东西攑֜公有接口中?
  (39)在理ZQ承层ơ体pd当深一点,深好?
  (40)在实践中Q承层ơ体pȝ深度不应当超Z个普通h的短期记忆能力。一个广为接受的深度值是6?
  (41)所有的抽象c都应当是基cR?
  (42)所有的基类都应当是抽象cR?
  (43)把数据、行为和/或接口的共性尽可能地放到承层ơ体pȝ高端?
  (44)如果两个或更多个cd享公共数?但没有公p?Q那么应当把公共数据攑֜一个类中,每个׃nq个数据的类都包含这个类?
  (45)如果两个或更多个cL共同的数据和行ؓ(是Ҏ(gu))Q那么这些类的每一个都应当从一个表CZq些数据和方法的公共基类l承?
  (46)如果两个或更多个cd享公共接?指的是消息,而不是方?Q那么只有他们需要被多态地使用Ӟ他们才应当从一个公共基cȝѝ?
  (47)对对象类型的昄的分情况分析一般是错误的。在大多数这L情况下,设计者应当用多态?
  (48)对属性值的昄的分情况分析常常是错误的。类应当解耦合成一个承层ơ结构,每个属性值都被变换成一个派生类?
  (49)不要通过l承关系来ؓcȝ动态语义徏模。试囄静态语义关pL为动态语义徏模会D在运行时切换cd?
  (50)不要把类的对象变成派生类。对M只有一个实例的zc都要多加小心?
  (51)如果你觉得需要在q行时刻创徏新的c,那么退后一步以认清你要创徏的是对象。现在,把这些对象概括成一个类?
  (52)在派生类中用I方?也就是什么也不做的方?来覆写基cM的方法应当是非法的?
  (53)不要把可选包含同对承的需要相h。把可选包含徏模成l承会带来泛滥成灄cR?
  (54)在创建承层ơ时Q试着创徏可复用的框架Q而不是可复用的组件?
  (55)如果你在设计中用了多重l承Q先假设你犯了错误。如果没犯错误,你需要设法证明?
  (56)只要在面向对象设计中用到了承,问自׃个问题:(1)zcL否是它承的那个东西的一个特D类型?(2)基类是不是派生类的一部分Q?
  (57)如果你在一个面向对象设计中发现了多重承关p,保没有哪个基类实际上是另一个基cȝzcR?
  (58)在面向对象设计中如果你需要在包含关系和关联关p间作出选择Q请选择包含关系?
  (59)不要把全局数据或全局函数用于cȝ对象的薄记工作。应当用类变量或类Ҏ(gu)?
  (60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是,在对逻辑设计作出决策的过E中我们l常用到物理设计准则?
  (61)不要l开公共接口M改对象的状态?


咖啡旉 2006-03-09 16:45 发表评论
]]>
JAVA 如何创徏\删除\修改\复制目录及文?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javaruijie/archive/2006/03/09/34487.html</guid><wfw:comment>http://www.aygfsteel.com/javaruijie/comments/34487.html</wfw:comment><comments>http://www.aygfsteel.com/javaruijie/archive/2006/03/09/34487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javaruijie/comments/commentRss/34487.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/javaruijie/services/trackbacks/34487.html</trackback:ping><description><![CDATA[import java.io.*; <P>public class FileOperate {<BR>  public FileOperate() {<BR>  }</P> <P>  /**<BR>   * 新徏目录<BR>   * @param folderPath String ?c:/fqf<BR>   * @return boolean<BR>   */<BR>  public void newFolder(String folderPath) {<BR>    try {<BR>      String filePath = folderPath;<BR>      filePath = filePath.toString();<BR>      java.io.File myFilePath = new java.io.File(filePath);<BR>      if (!myFilePath.exists()) {<BR>        myFilePath.mkdir();<BR>      }<BR>    }<BR>    catch (Exception e) {<BR>      System.out.println("新徏目录操作出错");<BR>      e.printStackTrace();<BR>    }<BR>  }</P> <P>  /**<BR>   * 新徏文g<BR>   * @param filePathAndName String 文g路径及名U?如c:/fqf.txt<BR>   * @param fileContent String 文g内容<BR>   * @return boolean<BR>   */<BR>  public void newFile(String filePathAndName, String fileContent) {</P> <P>    try {<BR>      String filePath = filePathAndName;<BR>      filePath = filePath.toString();<BR>      File myFilePath = new File(filePath);<BR>      if (!myFilePath.exists()) {<BR>        myFilePath.createNewFile();<BR>      }<BR>      FileWriter resultFile = new FileWriter(myFilePath);<BR>      PrintWriter myFile = new PrintWriter(resultFile);<BR>      String strContent = fileContent;<BR>      myFile.println(strContent);<BR>      resultFile.close();</P> <P>    }<BR>    catch (Exception e) {<BR>      System.out.println("新徏目录操作出错");<BR>      e.printStackTrace();</P> <P>    }</P> <P>  }</P> <P>  /**<BR>   * 删除文g<BR>   * @param filePathAndName String 文g路径及名U?如c:/fqf.txt<BR>   * @param fileContent String<BR>   * @return boolean<BR>   */<BR>  public void delFile(String filePathAndName) {<BR>    try {<BR>      String filePath = filePathAndName;<BR>      filePath = filePath.toString();<BR>      java.io.File myDelFile = new java.io.File(filePath);<BR>      myDelFile.delete();</P> <P>    }<BR>    catch (Exception e) {<BR>      System.out.println("删除文g操作出错");<BR>      e.printStackTrace();</P> <P>    }</P> <P>  }</P> <P>  /**<BR>   * 删除文g?BR>   * @param filePathAndName String 文g夹\径及名称 如c:/fqf<BR>   * @param fileContent String<BR>   * @return boolean<BR>   */<BR>  public void delFolder(String folderPath) {<BR>    try {<BR>      delAllFile(folderPath); //删除完里面所有内?BR>      String filePath = folderPath;<BR>      filePath = filePath.toString();<BR>      java.io.File myFilePath = new java.io.File(filePath);<BR>      myFilePath.delete(); //删除I文件夹</P> <P>    }<BR>    catch (Exception e) {<BR>      System.out.println("删除文gҎ(gu)作出?);<BR>      e.printStackTrace();</P> <P>    }</P> <P>  }</P> <P>  /**<BR>   * 删除文g多w面的所有文?BR>   * @param path String 文g夹\??c:/fqf<BR>   */<BR>  public void delAllFile(String path) {<BR>    File file = new File(path);<BR>    if (!file.exists()) {<BR>      return;<BR>    }<BR>    if (!file.isDirectory()) {<BR>      return;<BR>    }<BR>    String[] tempList = file.list();<BR>    File temp = null;<BR>    for (int i = 0; i < tempList.length; i++) {<BR>      if (path.endsWith(File.separator)) {<BR>        temp = new File(path + tempList[i]);<BR>      }<BR>      else {<BR>        temp = new File(path + File.separator + tempList[i]);<BR>      }<BR>      if (temp.isFile()) {<BR>        temp.delete();<BR>      }<BR>      if (temp.isDirectory()) {<BR>        delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文?BR>        delFolder(path+"/"+ tempList[i]);//再删除空文g?BR>      }<BR>    }<BR>  }</P> <P>  /**<BR>   * 复制单个文g<BR>   * @param oldPath String 原文件\?如:c:/fqf.txt<BR>   * @param newPath String 复制后\?如:f:/fqf.txt<BR>   * @return boolean<BR>   */<BR>  public void copyFile(String oldPath, String newPath) {<BR>    try {<BR>      int bytesum = 0;<BR>      int byteread = 0;<BR>      File oldfile = new File(oldPath);<BR>      if (oldfile.exists()) { //文g存在?BR>        InputStream inStream = new FileInputStream(oldPath); //d原文?BR>        FileOutputStream fs = new FileOutputStream(newPath);<BR>        byte[] buffer = new byte[1444];<BR>        int length;<BR>        while ( (byteread = inStream.read(buffer)) != -1) {<BR>          bytesum += byteread; //字节?文g大小<BR>          System.out.println(bytesum);<BR>          fs.write(buffer, 0, byteread);<BR>        }<BR>        inStream.close();<BR>      }<BR>    }<BR>    catch (Exception e) {<BR>      System.out.println("复制单个文g操作出错");<BR>      e.printStackTrace();</P> <P>    }</P> <P>  }</P> <P>  /**<BR>   * 复制整个文g夹内?BR>   * @param oldPath String 原文件\?如:c:/fqf<BR>   * @param newPath String 复制后\?如:f:/fqf/ff<BR>   * @return boolean<BR>   */<BR>  public void copyFolder(String oldPath, String newPath) {</P> <P>    try {<BR>      (new File(newPath)).mkdirs(); //如果文g夹不存在 则徏立新文g?BR>      File a=new File(oldPath);<BR>      String[] file=a.list();<BR>      File temp=null;<BR>      for (int i = 0; i < file.length; i++) {<BR>        if(oldPath.endsWith(File.separator)){<BR>          temp=new File(oldPath+file[i]);<BR>        }<BR>        else{<BR>          temp=new File(oldPath+File.separator+file[i]);<BR>        }</P> <P>        if(temp.isFile()){<BR>          FileInputStream input = new FileInputStream(temp);<BR>          FileOutputStream output = new FileOutputStream(newPath + "/" +<BR>              (temp.getName()).toString());<BR>          byte[] b = new byte[1024 * 5];<BR>          int len;<BR>          while ( (len = input.read(b)) != -1) {<BR>            output.write(b, 0, len);<BR>          }<BR>          output.flush();<BR>          output.close();<BR>          input.close();<BR>        }<BR>        if(temp.isDirectory()){//如果是子文g?BR>          copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);<BR>        }<BR>      }<BR>    }<BR>    catch (Exception e) {<BR>      System.out.println("复制整个文g夹内Ҏ(gu)作出?);<BR>      e.printStackTrace();</P> <P>    }</P> <P>  }</P> <P>  /**<BR>   * Ud文g到指定目?BR>   * @param oldPath String 如:c:/fqf.txt<BR>   * @param newPath String 如:d:/fqf.txt<BR>   */<BR>  public void moveFile(String oldPath, String newPath) {<BR>    copyFile(oldPath, newPath);<BR>    delFile(oldPath);</P> <P>  }</P> <P>  /**<BR>   * Ud文g到指定目?BR>   * @param oldPath String 如:c:/fqf.txt<BR>   * @param newPath String 如:d:/fqf.txt<BR>   */<BR>  public void moveFolder(String oldPath, String newPath) {<BR>    copyFolder(oldPath, newPath);<BR>    delFolder(oldPath);</P> <P>  }<BR>}<BR></P><img src ="http://www.aygfsteel.com/javaruijie/aggbug/34487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javaruijie/" target="_blank">咖啡旉</a> 2006-03-09 15:55 <a href="http://www.aygfsteel.com/javaruijie/archive/2006/03/09/34487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle job 理http://www.aygfsteel.com/javaruijie/archive/2006/03/07/34060.html咖啡旉咖啡旉Tue, 07 Mar 2006 06:24:00 GMThttp://www.aygfsteel.com/javaruijie/archive/2006/03/07/34060.htmlhttp://www.aygfsteel.com/javaruijie/comments/34060.htmlhttp://www.aygfsteel.com/javaruijie/archive/2006/03/07/34060.html#Feedback0http://www.aygfsteel.com/javaruijie/comments/commentRss/34060.htmlhttp://www.aygfsteel.com/javaruijie/services/trackbacks/34060.htmlSVRMGR> select * from dba_jobs;

初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000  ;job_queue_interval = 10  //调度作业h频率Uؓ单位
DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1  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)
2 select job,what,last_date,next_date,interval from  dba_jobs where job in (1,3);


查询job的情c?BR>show paramter background_dump_dest.
看alter.log 和trace


SVRMGR> select * from dba_jobs;

初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000

job_queue_interval = 10  //调度作业h频率Uؓ单位


DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1  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)
2 select job,what,last_date,next_date,interval from  dba_jobs where job in (1,3);


查询job的情c?BR>show paramter background_dump_dest.
看alter.log 和trace


请问我如何停止一个JOB
SQL> exec dbms_job.broken(1,true)

PL/SQL q程已成功完成?BR>SQL>commit  //必须提交否则无效

启动作业
SQL> exec dbms_job.broken(1,false)

PL/SQL q程已成功完成?/P>

停其他用Ljob
SQL>exec sys.dbms_ijob.broken(98,true);
SQL>commit;


============================

exec dbms_job.broken(:job) 停止
exec dbms_job.broken(186,true) //标记位broken
exec dbms_job.broken(186,false)//标记为非broken
exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行旉
exec dbms_job.remove(:job)Q删?BR>exec dbms_job.remove(186);
commitQ?/P>

把一个broken job重新q行


三、查看相关job信息
1、相兌?BR>dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在q行job相关信息


创徏JOB
variable jobno number;
begin
  dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
  commit;
end;
print jobno

例如Q我们已l徏立了一个存储过E,其名UCؓmy_jobQ在sql/plus中以scott用户w䆾dQ执行如下命令:
sql> variable n number;
sql> begin
dbms_job.submit(:n‘my_job;?sysdate,
‘sysdateQ?/360?;
commit;
end;
Sql> print :n;

pȝ提示执行成功?
Sql> print :n;
pȝ打印此Q务的~号Q例如结果ؓ300?


单例?BR>一个简单例子:

创徏试?BR>SQL> create table TEST(a date);

表已创徏?/P>

创徏一个自定义q程
SQL> create or replace procedure MYPROC as
  2  begin
  3  insert into TEST values(sysdate);
  4  end;
  5  /

q程已创建?/P>

创徏JOB
SQL> variable job1 number;
SQL>
SQL> begin
  2  dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分钟Q即一分钟q行testq程一?BR>  3  end;
  4  /

PL/SQL q程已成功完成?/P>

q行JOB
SQL> begin
  2  dbms_job.run(:job1);
  3  end;
  4  /

PL/SQL q程已成功完成?/P>

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 旉 from TEST;


-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24

删除JOB
SQL> begin
  2  dbms_job.remove(:job1);
  3  end;
  4  /

PL/SQL q程已成功完成?/P>

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/P>


a、利用dbms_job.run()立即执行该job
   sql>begin
   sql>dbms_job.run(:jobno) 该jobno为submitq程提交时返回的job number
   sql>end;
   sql>/
b、利用dbms_job.broken()重新broken标记为false
   sql>begin
   sql>dbms_job.broken (:job,false,next_date)
   sql>end;
   sql>/


Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
SQL> create table a(a date);
Table created

创徏一个过E?BR>SQL> create or replace procedure test as
  2  begin
  3  insert into a values(sysdate);
  4  end;
  5  /
Procedure created

提交作业
SQL> declare
  2  job1 number;   //定义一个数字型变量
  3  begin
  4  dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');  //按分钟算一?440分钟
  5  end;
  6  /
PL/SQL procedure successfully completed
job1
---------
4
SQL> commit;
Commit complete

q行作业
SQL> begin
  2  dbms_job.run(4);
  3  end;
  4  /
PL/SQL procedure successfully completed

删除作业
SQL> begin
  2  dbms_job.remove(4);
  3  end;
  4  /
PL/SQL procedure successfully completed
SQL> commit;
Commit complete


job change//修改作业
execute dbms_job.change(186,null,null,'sysdate+3');
execute dbms_job.change(186,'scott.test(update)');


DBA_JOBS
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?BR>字段Q列Q?nbsp;         cd                 描述
JOB                NUMBER          d的唯一标示?
LOG_USER           VARCHAR2(30)    提交d的用?
PRIV_USER          VARCHAR2(30)    赋予d权限的用?
SCHEMA_USER        VARCHAR2(30)    对Q务作语法分析的用h?
LAST_DATE          DATE            最后一ơ成功运行Q务的旉
LAST_SEC           VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小Ӟ分钟和秒
THIS_DATE     DATE            正在q行d的开始时_如果没有q行d则ؓnull
THIS_SEC     VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小Ӟ分钟和秒
NEXT_DATE          DATE            下一ơ定时运行Q务的旉
NEXT_SEC           VARCHAR2(8)     如HH24:MM:SS格式的next_date日期的小Ӟ分钟和秒
TOTAL_TIME         NUMBER          该Q务运行所需要的L_单位为秒
BROKEN             VARCHAR2(1)     标志参数QY标示d中断Q以后不会运?
INTERVAL           VARCHAR2(200)   用于计算下一q行旉的表辑ּ
FAILURES    NUMBER     dq行q箋没有成功的次?
WHAT               VARCHAR2(2000)  执行d的PL/SQL?
CURRENT_SESSION_LABEL RAW          MLSLABEL 该Q务的信QOracle会话W?
CLEARANCE_HI      RAW MLSLABEL     该Q务可信Q的Oracle最大间?
CLEARANCE_LO      RAW              MLSLABEL 该Q务可信Q的Oracle最间?
NLS_ENV           VARCHAR2(2000)   dq行的NLS会话讄
MISC_ENV          RAW(32)          dq行的其他一些会话参?

 

描述                    INTERVAL参数?
每天午夜12?nbsp;           'TRUNC(SYSDATE + 1)'
每天早上8?0?nbsp;        'TRUNC(SYSDATE + 1) + Q?*60+30Q?(24*60)'
每星期二中午12?nbsp;        'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12?nbsp;   'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11?'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6?0?nbsp;   'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + Q?×60+10Q?Q?4×60Q?



咖啡旉 2006-03-07 14:24 发表评论
]]>
触发器介l?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/javaruijie/archive/2006/03/07/34049.html</guid><wfw:comment>http://www.aygfsteel.com/javaruijie/comments/34049.html</wfw:comment><comments>http://www.aygfsteel.com/javaruijie/archive/2006/03/07/34049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/javaruijie/comments/commentRss/34049.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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>触发器介l?/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><!--插入q告JS代码--> <SCRIPT language=javascript src="/AD/200510/2.js"></SCRIPT> </TD></TR></TBODY></TABLE> <P class=MsoNormal>一 触发器介l?/P> <P class=MsoNormal>    触发器是一U特D的存储q程Q它在插入,删除或修改特定表?/P> <P class=MsoNormal>的数据时触发执行Q它比数据库本n标准的功能有更精l和更复杂的</P> <P class=MsoNormal>数据控制能力。数据库触发器有以下的作用:</P> <P class=MsoNormal>    * 安全性。可以基于数据库的g用户h操作数据库的某种?/P> <P class=MsoNormal>利?/P> <P class=MsoNormal>      # 可以Z旉限制用户的操作,例如不允怸班后和节假日</P> <P class=MsoNormal>      修改数据库数据?/P> <P class=MsoNormal>      # 可以Z数据库中的数据限制用L操作Q例如不允许股票</P> <P class=MsoNormal>      的h(hun)格的升幅一ơ超q?0%?/P> <P class=MsoNormal>    * 审计。可以跟t用户对数据库的操作?/P> <P class=MsoNormal>      # 审计用户操作数据库的语句?/P> <P class=MsoNormal>      # 把用户对数据库的更新写入审计表?/P> <P class=MsoNormal>    * 实现复杂的数据完整性规则?/P> <P class=MsoNormal>      # 实现非标准的数据完整性检查和U束。触发器可生比规则</P> <P class=MsoNormal>      更ؓ复杂的限制。与规则不同Q触发器可以引用列或数据库对</P> <P class=MsoNormal>      象。例如,触发器可回退M企图吃进过自己保证金的期货?/P> <P class=MsoNormal>      # 提供可变的缺省倹{?/P> <P class=MsoNormal>    * 实现复杂的非标准的数据库相关完整性规则。触发器可以Ҏ(gu)</P> <P class=MsoNormal>据库中相关的表进行连环更新。例如,在auths表author_code列上?/P> <P class=MsoNormal>删除触发器可D相应删除在其它表中的与之匚w的行?/P> <P class=MsoNormal>      # 在修Ҏ(gu)删除时联修Ҏ(gu)删除其它表中的与之匹配的行?/P> <P class=MsoNormal>      # 在修Ҏ(gu)删除时把其它表中的与之匹配的行设成NULL倹{?/P> <P class=MsoNormal>      # 在修Ҏ(gu)删除时把其它表中的与之匹配的行联设成缺省倹{?/P> <P class=MsoNormal>      # 触发器能够拒l或回退那些破坏相关完整性的变化Q取消试</P> <P class=MsoNormal>      图进行数据更新的事务。当插入一个与其主健不匚w的外部键</P> <P class=MsoNormal>      Ӟq种触发器会起作用。例如,可以在books.author_code</P> <P class=MsoNormal>      列上生成一个插入触发器Q如果新gauths.author_code?/P> <P class=MsoNormal>      中的某g匚wӞ插入被回退?/P> <P class=MsoNormal>    * 同步实时地复制表中的数据?/P> <P class=MsoNormal>    * 自动计算数据|如果数据的DC一定的要求Q则q行?/P> <P class=MsoNormal>定的处理。例如,如果公司的帐号上的资金低?万元则立即给财务?/P> <P class=MsoNormal>员发送警告数据?/P> <P class=MsoNormal>    ORACLE与SYBASE数据库的触发器有一定的区别Q下面将分别讲述</P> <P class=MsoNormal>q两U数据库触发器的作用和写法?/P> <P class=MsoNormal> <?XML:NAMESPACE PREFIX = O /><O:P> </O:P></P> <P class=MsoNormal>?ORACLE 触发?/P> <P class=MsoNormal>    ORACLE产生数据库触发器的语法ؓQ?/P> <P class=MsoNormal>    create [or replace] trigger 触发器名 触发旉 触发事g</P> <P class=MsoNormal>      on 表名</P> <P class=MsoNormal>      [for each row]</P> <P class=MsoNormal>      pl/sql 语句</P> <P class=MsoNormal>    其中Q?/P> <P class=MsoNormal>    触发器名Q触发器对象的名U。由于触发器是数据库自动执行</P> <P class=MsoNormal>              的,因此该名U只是一个名Uͼ没有实质的用途?/P> <P class=MsoNormal>    触发旉Q指明触发器何时执行Q该值可取:</P> <P class=MsoNormal>              before---表示在数据库动作之前触发器执行;</P> <P class=MsoNormal>              after---表示在数据库动作之后出发器执行?/P> <P class=MsoNormal>    触发事gQ指明哪些数据库动作会触发此触发器:</P> <P class=MsoNormal>              insertQ数据库插入会触发此触发器;</P> <P class=MsoNormal>              updateQ数据库修改会触发此触发器;</P> <P class=MsoNormal>              deleteQ数据库删除会触发此触发器?/P> <P class=MsoNormal>    ?nbsp;   名:数据库触发器所在的表?/P> <P class=MsoNormal>    for each rowQ对表的每一行触发器执行一ơ。如果没有这一</P> <P class=MsoNormal>                  选项Q则只对整个表执行一ơ?/P> <P class=MsoNormal>    举例Q下面的触发器在更新表auths之前触发Q目的是不允许在</P> <P class=MsoNormal>          周末修改表:</P> <P class=MsoNormal>    create trigger auth_secure</P> <P class=MsoNormal>      before insert or update or delete  //Ҏ(gu)表更新前触发</P> <P class=MsoNormal>      on auths</P> <P class=MsoNormal>    begin</P> <P class=MsoNormal>      if(to_char(sysdate,'DY')='SUN'</P> <P class=MsoNormal>        RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');</P> <P class=MsoNormal>      end if;</P> <P class=MsoNormal>    end</P> <P class=MsoNormal> <O:P> </O:P></P> <P class=MsoNormal>?SYBASE数据库触发器</P> <P class=MsoNormal>    SYBASE数据库触发器的作用与ORACLE非常cMQ仅有较?yu)的差异?/P> <P class=MsoNormal>    SYBASE产生触发器的语法为:</P> <P class=MsoNormal>    CREATE TRIGGER 触发器名</P> <P class=MsoNormal>      ON 表名</P> <P class=MsoNormal>      FOR INSERTQUPDATEQDELETE</P> <P class=MsoNormal>      AS </P> <P class=MsoNormal>      SQL_statement |</P> <P class=MsoNormal>      FOR INSERTQUPDATE</P> <P class=MsoNormal>      AS</P> <P class=MsoNormal>      IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...</P> <P class=MsoNormal>      SQL_statements</P> <P class=MsoNormal>    上面FOR子句用来指定在触发器上的哪些数据更新命o可激z该</P> <P class=MsoNormal>触发器。IF UPDATE子句查对指定列的操作cdQ在IF UPDATE子句</P> <P class=MsoNormal>中可指定多个列?/P> <P class=MsoNormal>    与ORACLE不同Q对于每条SQL语句Q触发器只执行一ơ。触发器</P> <P class=MsoNormal>在数据更新语句完成以后立x行。触发器和启动它的语句被当作一</P> <P class=MsoNormal>个事务处理,事务可以在触发器中回退?/P> <P class=MsoNormal>    下面举例说明SYBASE触发器的写法?/P> <P class=MsoNormal>    create trigger forinsert_books</P> <P class=MsoNormal>      on books</P> <P class=MsoNormal>      for insert</P> <P class=MsoNormal>      as</P> <P class=MsoNormal>      if(select count(*) from auths,inserted</P> <P class=MsoNormal>        where auths.author_code=insert.author_code)!=@@rowcount</P> <P class=MsoNormal>      begin</P> <P class=MsoNormal>        rollback transaction</P> <P class=MsoNormal>        print "books 表中 author_code 列的值在auths 表中不存在?</P> <P class=MsoNormal>      end</P></TD></TR></TBODY></TABLE> <a HREF="/javaruijie">点击q入<a><img src ="http://www.aygfsteel.com/javaruijie/aggbug/34049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/javaruijie/" target="_blank">咖啡旉</a> 2006-03-07 13:48 <a href="http://www.aygfsteel.com/javaruijie/archive/2006/03/07/34049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 启动参数讄大全http://www.aygfsteel.com/javaruijie/archive/2006/01/19/28679.html咖啡旉咖啡旉Thu, 19 Jan 2006 09:18:00 GMThttp://www.aygfsteel.com/javaruijie/archive/2006/01/19/28679.htmlhttp://www.aygfsteel.com/javaruijie/comments/28679.htmlhttp://www.aygfsteel.com/javaruijie/archive/2006/01/19/28679.html#Feedback0http://www.aygfsteel.com/javaruijie/comments/commentRss/28679.htmlhttp://www.aygfsteel.com/javaruijie/services/trackbacks/28679.htmlEclipse q行命o行参数大?
包括英文版本和中文版本两U的说明, 特别需要值得一提的是那?-nl 参数, 可以指定E序启动时所使用的语a. 例如:
eclipse -nl en_US
启动英文语a, q个Ҏ(gu)在安装了国际化语言包以后特别有? 可以方便的切换各个语a的版? 注意 IBM WSAD v5.1 也支持这个功?

q行 Eclipse
?Eclipse 驱动E序安装Q解压羃Q到某个目录Q例如,c:\eclipseQ中之后Q通过q行安装目录中的 Eclipse 可执行文件来启动"工作?。在 Windows pȝ上,该可执行文gUCؓ eclipse.exeQ而在 Linux pȝ上称?eclipse。注意:下列讨论描述 Windows pȝ上的讄。Linux 上的讄是相似的?BR>
如果(zhn)没有另行指定,则^台将~省工作区目录创Zؓ可执行文件的兄弟目录Q例?c:\eclipse\workspaceQ。此工作区目录用作项目的~省内容区,q用于保存Q何必需的元数据。要q行׃n安装或多工作区安装,应明指出工作区的位|而不是用缺省倹{有两种控制工作Z|的Ҏ(gu)Q用当前工作目录或使用 -data 命o行自变量?BR>
工作区位置讄为在当前工作目录?BR>在此Ҏ(gu)中,工作Z|将是当前工作目录中UCؓ workspace 的目录?BR>
实现此目的最Ҏ(gu)的方法可能是使用下列步骤来创建快h式:

D?Windows 资源理器中?eclipse.exe q用右键拖动来创徏 eclipse.exe 的快h式?
~辑快捷方式的属性,以启动位置Q字D|识工作区位置的父目录Q例如,c:\users\robertQ?
关闭属性对话框q双dh式(如果提供的目录ؓ c:\users\robertQ则工作Z|将?c:\users\robert\workspaceQ?
当然Q?zhn)也可以用命令提C符Q通过目录切换ؓ工作区父目录然后q行 eclipse.exeQ来获得同样的效果?BR>
使用 -data 讄工作区的特定位置
要?-data 命o行自变量Q只要将 -data your_workspace_locationQ例如,-data c:\users\robert\myworkspaceQ添加至快捷方式属性中的目标字D|昑ּ地将它包括在命o行上?BR>
使用 -vm 讄 java VM
昑ּ指定在运?Eclipse 时要使用哪个 Java VM。?-vm 命o行自变量Q例如,-vm c:\jre\bin\javaw.exeQ可以实现此目的。如果不使用 -vmQ则 Eclipse 用在 O/S 路径上找到的一?Java VM。当安装其它产品Ӟ它们可更Ҏ(gu)的\径,D在下一ơ启?Eclipse 时用另一 Java VM?BR>
q行 Eclipse 中的高主题
Eclipse 可执行文件及q_本n提供了h们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运?Eclipse 可执行文件的一般格式是Q?BR>
eclipse [platform options] [-vmargs [Java VM arguments]]
Eclipse 启动参数 命o 描述 原因
-arch architecture
定义 Eclipse q_在其上运行的处理器体pȝ构。Eclipse q_通常使用 Java os.arch 属性的常用值来计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getOSArch() 用于插g。示例值有Q?x86"?sparc"?PA-RISC"?ppc"?2.0
-application applicationId要运行的应用E序。应用程序由?org.eclipse.core.runtime.applications 扩展Ҏ(gu)供扩展的插g来声明。通常不需要此自变量。如果指定了此项Q则该g覆盖配置提供的倹{如果不指定此项Q则会运?Eclipse 工作??1.0
-boot bootJarURLQ徏议不使用Q用 -configuration 代替Q支?1.0 兼容Q。Eclipse q_的引导插件代码(boot.jarQ的位置Q表CZؓ URL。如果指定此,则会用它来ؓ装入 Eclipse q_引导E序c装入器的类装入器设|类路径。仅当更?startup.jar ?boot.jar 的相对位|时才需要它。注意,不允怋用相?URL?*1.0
-classloaderproperties [file]
如果指定的话Q则使用l定位置处的c装入器属性文件来Ȁzd^台类c装入器增强。文件自变量可以是文件\径或 URL。注意,不允怋用相?URL。单L处以获得更多详细信息?2.0.2
-configuration configurationFileURL
Eclipse q_配置文g的位|,表示?URL。配|文件确?Eclipse q_、可用插仉和主要功能部件的位置。注意,不允怋用相?URL。当安装或更?Eclipse q_旉|文件被写至此位|?2.0
-consolelog?Eclipse q_的错误日志镜像到用来q行 Eclipse 的控制台。与 -debug l合时很方便使用?1.0
-data workspacePath
要运?Eclipse q_的工作区的\径。工作区位置也是目的缺省位|。相对于从中启动 eclipse 的目录来解释相对路径?1.0
-debug [optionsFile]
^台置于调试方式,q从l定位置处的文g装入调试选项Q如果指定的话)。此文g指示哪些调试点可用于插g以及是否已启用它们。如果未l出文g位置Q则q_在启?eclipse 的目录中查找UCؓ".options"的文件。URL 和文件系l\径都可作为文件位|?1.0
-dev [classpathEntries]
^台置于开发方式。将可选类路径条目Q用逗号分隔的列表)dx个插件的q行时类路径。例如,当工作区包含要开发的插gӞ指定 -dev bin 会ؓ每个插g目的名?bin 的目录添加类路径条目Q允许在其中存储最新生成的cL件。除M冗余或不存在的类路径条目?1.0
-endsplash params
用于?Eclipse q_启动q运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义?2.0
-feature featureId
主要功能部g的标识。主要功能部件ؓ Eclipse 的已启动实例提供了品个性,q确定用的产品定制信息?2.0
-keyring keyringFilePath
盘上授权数据库Q或"密钥?文gQ的位置。此自变量必M -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径?1.0
-nl locale
定义 Eclipse q_在其上运行的语言环境的名U。Eclipse q_通常自动计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getNL() 用于插g。示例值有Q?en_US"?fr_FR_EURO"?2.0
-nolazyregistrycacheloading
[/color]
取消Ȁz装入优化的q_插g注册表高速缓存。缺省情况下Q仅当需要时才从注册表高速缓存(可用Ӟ中装入扩展的配置元素Q以减少内存占用。此选项在启动时强制完全装入注册表高速缓存?2.1
[color=blue]-noregistrycache
l过d内部插g注册表高速缓存文件?2.0
-nosplash
q行q_而不昄闪屏?1.0
-os operatingSystem定义 Eclipse q_在其上运行的操作pȝ。Eclipse q_通常使用 Java os.name 属性的常用值来计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getOS() 用于插gQƈ用于解析插g清单文g中提及的路径?$os$ 变量的出现。示例值有Q?FONT color=blue>"win32"?linux"?hpux"?solaris"?aix"
?1.0
-password password授权数据库的密码。与 -keyring 选项配合使用?1.0
-perspective perspectiveId
启动时要在活动工作台H口中打开的透视图。如果没有指定该参数Q则打开关闭时活动的透视图?1.0
-plugincustomization       propertiesFile包含插g首选项~省讄的属性文件的位置。这些缺省设|覆盖在主要功能部g中指定的~省讄。相对于从中启动 eclipse 的目录来解释相对路径?2.0
-plugins pluginsFileURLQ徏议不使用Q用 -configuration 代替Q支?1.0 兼容Q?指定 Eclipse q_查找插g的文件的位置Q表CZؓ URL。该文g为属性文件格式,其中键是L用户定义名称Q值是指向 plugin.xml 文g的显式\径或指向包含插g的目录的路径的用逗号分隔的列表。注意,不允怋用相?URL。如果指定此,则此选项会导致创建适当的旉|?*1.0
-refresh 启动时执行工作区的全局h的选项。这从上ơ^台运行以来在文gpȝ中所做的M更改一致?1.0
-showlocation 用于在窗口标题栏中显C工作区的位|的选项。在发行?2.0 中,此选项仅与 -data 命o行自变量一起用?2.0
-showsplash params用于昄闪屏Q由可执行的 Eclipse q_启动器执行)的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义?2.0
-vm vmPath
要用来运?Eclipse q_?Java q行时环?QJREQ的位置。如果不指定此项Q则 JRE 位于 jreQ它?Eclipse 可执行文件的兄弟目录Q。相对于从中启动 eclipse 的目录来解释相对路径?1.0
-ws windowSystem
定义 Eclipse q_在其上运行的 Windows pȝ。Eclipse q_通常使用 Java os.name 属性的常用值来计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getWS() 用于插g、用于配|?SWT 以及用于解析插g清单文g中提及的路径?$ws$ 变量的出现。示例值有Q?FONT color=blue>"win32"?motif"?gtk"?1.0


?FONT color=blue> -vmargs
条目后面的所有自变量Q但不包?-vmargsQ作拟机自变量(卻I在要q行的类的前面)直接传递到所指示?Java VM。注意:如果 Eclipse 启动?Java vm 自变量(-vmargsQ之后提供的自变量(例如Q?dataQ,?Eclipse 不会启动ƈ且?zhn)接收?JVM 已终止。出口代码ؓ 1"的错误?BR>
在不同的 VM 上运?
?J9 上运?Eclipse
当在 J9 版本 1.5 上运?Eclipse Ӟ使用以下 VM 选项Q?

eclipse.exe [eclipse arguments] -vm path_to_j9w.exe         -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000当在 J9 版本 2.0 上运?Eclipse ӞJ9W 选择的缺省自变量应ؓ合适的选项。但是,要覆?Eclipse 可执行文件以内部方式自动讄的参敎ͼ必须指定 -vmargs 不带M参数Q如下所C:

eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs有关q一步信息,参?J9 VM 文档和帮助?BR>
?IBM Developer Kit, Java(TM) Technology Edition VM 上运?Eclipse
IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺?VM 讄适合q行初期研究工作Q但在进行大型开发时是不够的。对于大型开发,应修?VM 自变量以使有更多的堆可用。例如,下列讄允?Java 堆增大ؓ 256MBQ?/FONT>



咖啡旉 2006-01-19 17:18 发表评论
]]>
վ֩ģ壺 ʯ| | | ľ˹| | | | µ| | ǿ| | | | | | | | ¡| ͨ| Ĭ| | | | ״| ӯ| Դ| | | ԫ| | | ײ| | ɽ| | | û| | | ¡| Դ|