<?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-每日一得-随笔分类-dataBase</title><link>http://www.blogjava.net/alex/category/5491.html</link><description>不求多得,只求一得
about java,hibernate,spring,design,database,Ror,ruby,快速开发&lt;br/&gt;&lt;br/&gt;
最近关心的内容关键字:RoR
</description><language>zh-cn</language><lastBuildDate>Tue, 12 Jun 2007 16:18:54 GMT</lastBuildDate><pubDate>Tue, 12 Jun 2007 16:18:54 GMT</pubDate><ttl>60</ttl><item><title>Oracle 自动启动命令</title><link>http://www.blogjava.net/alex/archive/2007/06/12/123519.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 12 Jun 2007 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/06/12/123519.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/123519.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/06/12/123519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/123519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/123519.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">echo&nbsp;"begin&nbsp;to&nbsp;start&nbsp;oracle"<br>lsnrctl&nbsp;start<br>sqlplus&nbsp;/nolog&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">&lt;EOF<br></span><span style="COLOR: #ff0000">connect&nbsp;/as&nbsp;sysdba<br>startup<br>exit<br>exit<br>echo&nbsp;"oracle&nbsp;have&nbsp;started"</span></div>
<img src ="http://www.blogjava.net/alex/aggbug/123519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-06-12 09:13 <a href="http://www.blogjava.net/alex/archive/2007/06/12/123519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]插入图片到数据库(BLOB大字段保存对象)</title><link>http://www.blogjava.net/alex/archive/2007/03/28/107018.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 28 Mar 2007 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/03/28/107018.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/107018.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/03/28/107018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/107018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/107018.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/03/28/107018.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/107018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-03-28 16:55 <a href="http://www.blogjava.net/alex/archive/2007/03/28/107018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>powerdesigner中外建问题</title><link>http://www.blogjava.net/alex/archive/2007/01/31/96861.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 31 Jan 2007 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/01/31/96861.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/96861.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/01/31/96861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/96861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/96861.html</trackback:ping><description><![CDATA[key words: pd, powerdesigner,外建<br /><br />在PD中建立外键碰到一个问题，如: forum(id,name)表，forum_thread(id,forum_id)表，需要将forum的id设为forum_thread的外建，指向forum_id,默认的在 PD中是将主键设为外建.<br /><br />需要如下设置才可以: <br /><br /><img height="522" alt="foreign_key.png" src="http://www.blogjava.net/images/blogjava_net/alex/images/foreign_key.png" width="685" border="0" /><img src ="http://www.blogjava.net/alex/aggbug/96861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-01-31 10:42 <a href="http://www.blogjava.net/alex/archive/2007/01/31/96861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]PowerDesigner 11 使用心得</title><link>http://www.blogjava.net/alex/archive/2007/01/17/94353.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 17 Jan 2007 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/01/17/94353.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/94353.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/01/17/94353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/94353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/94353.html</trackback:ping><description><![CDATA[key words: powerdesign,power , design<br /><br />引言:<br />发现powerdesign的文档真的是不多，不过powerdesign还是很有用的，见到此类文档就收藏下吧.<br /><br />转自<a href="http://blog.csdn.net/edeed/archive/2006/02/10/596271.aspx" target="_blank">edeed</a><br /><br /> 附上一些使用pd11的心得：<br /><br />1、安装PD v11.0版<br /><br />2、由pdm生成建表脚本时，字段超过15字符就发生错误（oracle）<br />原因未知，解决办法是打开PDM后，会出现Database的菜单栏，进入Database － Edit Current DBMS －script－objects－column－maxlen，把value值调大(原为30)，比如改成60。出现表或者其它对象的长度也有这种错误的话都可以选择对应的objects照此种方法更改！<br />或者使用下面的这种方法：<br />生成建表脚本时会弹出Database generation提示框：把options － check model的小勾给去掉，就是不进行检查（不推荐）！<br />或者可以修改C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\DBMS\oracl9i2.xdb文件<br />修改好后，再cdm转为pdm时，选择“Copy the DBMS definition in model”把把这个资源文件拷贝到模型中。<br /><br />3、生成的建表脚本中如何把对象的双引号去掉？<br />打开cdm的情况下，进入Tools－Model Options－Naming Convention，把Name和Code的标签的Charcter case选项设置成Uppercase或者Lowercase，只要不是Mixed Case就行！<br />或者选择Database-&gt;Edit current database-&gt;Script-&gt;Sql-&gt;Format，有一项CaseSensitivityUsingQuote，它的 comment为“Determines if the case sensitivity for identifiers is managed using double quotes”，表示是否适用双引号来规定标识符的大小写，可以看到右边的values默认值为“YES”,改为“No”即可！<br />或者在打开pdm的情况下，进入Tools－Model Options－Naming Convention，把Name和Code的标签的Charcter case选项设置成Uppercase就可以！<br /><br />4、建立一个表后,为何检测出现Existence of index的警告<br />A table should contain at least one column, one index, one key, and one reference.<br />可以不检查 Existence of index 这项，也就没有这个警告错误了！<br />意思是说没有给表建立索引，而一个表一般至少要有一个索引，这是一个警告，不用管也没有关系！<br /><br />5、创建一个表在修改字段的时候，一修改name的内容，code也跟着变化，如何让code不随着name变化<br />Name和Code 的右侧都有一个按钮“＝”，如果需要不同步的话，把这个按钮弹起来就可以了。<br />Tools-&gt;General Options-&gt;Dialog-&gt;Name to Code Mirroring (去掉)<br /><br />6、由CDM生成PDM时，自动生成的外键的重命名<br />PDM Generation Options-&gt;Detail-&gt;FK index names默认是%REFR%_FK，改为FK_%REFRCODE%，其中%REFRCODE%指的就是CDM中Relationship的code！另外自动生成的父字段的规则是PDM Generation Options-&gt;Detail-&gt;FK column name template中设置的，默认是%.3:PARENT%_%COLUMN%，可以改为Par%COLUMN%表示是父字段！<br /><br />7、如何防止一对一的关系生成两个引用（外键）<br />要定义关系的支配方向，占支配地位的实体（有D标志）变为父表。<br />在cdm中双击一对一关系-&gt;Detail-&gt;Dominant role选择支配关系<br /><br />8、修改报表模板中一些术语的定义<br />即文件：C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\Report Languages\Chinese.xrl<br />Tools－Resources－Report Languages－选择Chinese－单击Properties或双击目标<br />修改某些对象的名称：Object Attributes\Physical Data Model\Column\<br />        ForeignKey：外键<br />        Mandatory：为空<br />        Primary：主键<br />        Table：表<br />用查找替换，把“表格”替换成“表”<br />修改显示的内容为别的：Values Mapping\Lists\Standard，添加TRUE的转化列为是，FALSE的转化列为空<br />另外Report－Title Page里可以设置标题信息<img src ="http://www.blogjava.net/alex/aggbug/94353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-01-17 09:55 <a href="http://www.blogjava.net/alex/archive/2007/01/17/94353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不要浪费资源 : 数据库连接池</title><link>http://www.blogjava.net/alex/archive/2007/01/04/91838.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 04 Jan 2007 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/01/04/91838.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/91838.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/01/04/91838.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/91838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/91838.html</trackback:ping><description><![CDATA[key words: 连接池 数据库<br /><br />发现一个有意思的现象，好多人在开发过程中不知道是出于训练自己编码还是为了重新发明轮子，总之明明已经存在的功能他非要自己实现一遍。<br /><br />今天又碰到一个。<br /><br />jdbc的连接，好多人也喜欢自己实现一个连接池，但是对于app server来说本身一般都有支持连接池的，为什么不用呢?<br />写了一通又长又臭的代码，自己以为牛B的很，其实算个球啊。<br /><br /><strong>不要浪费，不要自己发明轮子，你不是最牛的，一定还有比你更牛的！<br /></strong><br />对于weblogic或者oracle以及ibm的产品来说，大家还是比较习惯于用容器的jndi,但是即使对于tomcat，我个人也建议用tomcat自带的。<br /><br />附: jndi连接数据库<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> Connection getConnection(String inputJNDI) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_102_758_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_758_Open_Text.style.display='none'; Codehighlighter1_102_758_Closed_Image.style.display='inline'; Codehighlighter1_102_758_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_102_758_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_758_Closed_Text.style.display='none'; Codehighlighter1_102_758_Open_Image.style.display='inline'; Codehighlighter1_102_758_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />      DBMException </span><span id="Codehighlighter1_102_758_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_102_758_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Connection conn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    String strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_171_571_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_571_Open_Text.style.display='none'; Codehighlighter1_171_571_Closed_Image.style.display='inline'; Codehighlighter1_171_571_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_171_571_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_571_Closed_Text.style.display='none'; Codehighlighter1_171_571_Open_Image.style.display='inline'; Codehighlighter1_171_571_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_171_571_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_171_571_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      Context ctx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> InitialContext();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      _log.debug(ctx);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_268_395_Open_Image" onclick="this.style.display='none'; Codehighlighter1_268_395_Open_Text.style.display='none'; Codehighlighter1_268_395_Closed_Image.style.display='inline'; Codehighlighter1_268_395_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_268_395_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_268_395_Closed_Text.style.display='none'; Codehighlighter1_268_395_Open_Image.style.display='inline'; Codehighlighter1_268_395_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> inputJNDI) </span><span id="Codehighlighter1_268_395_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_268_395_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(inputJNDI.length() </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> inputJNDI;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />          strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dbJndiName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_408_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_408_450_Open_Text.style.display='none'; Codehighlighter1_408_450_Closed_Image.style.display='inline'; Codehighlighter1_408_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_408_450_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_408_450_Closed_Text.style.display='none'; Codehighlighter1_408_450_Open_Image.style.display='inline'; Codehighlighter1_408_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_408_450_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_408_450_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        strConnJNDI </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> dbJndiName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      DataSource ds </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (DataSource) ctx.lookup(strConnJNDI);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      _log.debug(ds);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      conn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ds.getConnection();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_598_715_Open_Image" onclick="this.style.display='none'; Codehighlighter1_598_715_Open_Text.style.display='none'; Codehighlighter1_598_715_Closed_Image.style.display='inline'; Codehighlighter1_598_715_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_598_715_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_598_715_Closed_Text.style.display='none'; Codehighlighter1_598_715_Open_Image.style.display='inline'; Codehighlighter1_598_715_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (Exception ex) </span><span id="Codehighlighter1_598_715_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_598_715_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      _log.error(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">It's error to get connection</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, ex);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DBMException(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Error to get connection</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    _log.debug(conn);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> conn;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />  }</span></span></div><br /><br />以此类推，类似于xml解析等的工作也没有必要自己一步一步地用dom或者什么乱七八糟的sax自己去搞一遍，搞了半天就使为了得到其中的一个value，何苦来着?    如果你不是为了做研究，那么，效率第一，安全第一.<br /><br />随便说说，也许有人不同意我的观点，没关系，尽管谈谈，哈哈  :)<img src ="http://www.blogjava.net/alex/aggbug/91838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-01-04 20:58 <a href="http://www.blogjava.net/alex/archive/2007/01/04/91838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]单用户实例下恢复master的方法</title><link>http://www.blogjava.net/alex/archive/2006/12/21/89289.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 21 Dec 2006 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/12/21/89289.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/89289.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/12/21/89289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/89289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/89289.html</trackback:ping><description><![CDATA[key words: sql server,单用户,master恢复<br /><br /><span style="FONT-SIZE: 12px"> 作者:jankie<br />日期:2006-12-1<br /><br />一、MASTER数据库备份与恢复<br />   1、数据库master正常情况下对master进行(完全)备份;<br />若要恢复:<br />   2、停止SQL Server服务;<br />   3、以单用户实例的方式启动SQL Server,启动时不要把窗口关闭;(具体看二)<br />   4、然后再对MASTE数据库进行恢复即可;<br /><br />二、MSSQL单用户实例的启动方法:<br />  如何在单用户模式下启动SQL Server的命名实例（命令提示符）   <br />  在单用户模式下从命令提示符启动SQL Server 的命名实例     <br />  从命令提示符输入：     <br />  sqlservr.exe -c  -m   -s   {instancename}   <br /><br />例1:<br />  1、sqlserver.exe -c -m 回车(默认实例)<br />  2、sqlserver.exe -c -m -s benet (实例名为benet)<br />   <br />  说明在启动 sqlservr.exe之前，必须在命令窗口中切换到适当的目录<br />如:c:\program files\microsoft sql server\mssql\bin目录下<br /></span><img src ="http://www.blogjava.net/alex/aggbug/89289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-12-21 15:08 <a href="http://www.blogjava.net/alex/archive/2006/12/21/89289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]jdbc如何连接到sql server实例</title><link>http://www.blogjava.net/alex/archive/2006/12/17/88306.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 16 Dec 2006 16:35:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/12/17/88306.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/88306.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/12/17/88306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/88306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/88306.html</trackback:ping><description><![CDATA[
		<script><![CDATA[unction loadTOCNode(){}]]&gt;</script>
		<div class="disclaimer mt">
				<div class="label">注意：这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度，也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。</div>
		</div>
		<div class="articleProperty">
				<br />
		</div>
		<div class="section">
				<h2 class="subTitle" id="tocHeadRef">概要</h2>
				<script type="text/javascript"><![CDATA[oadTOCNode(1, 'summary');]]&gt;</script>
				<div class="sbody">
Microsoft SQL Server 2000 支持同一计算机上同时运行的多个 SQLServer 数据库引擎实例。 以下是两种类型的
SQLServer 数据库引擎实例： 默认和命名。 只能有, 任何计算机上运行一个默认实例并且由默认实例运行计算机上的名称标识它。
通常指定以下列格式： 计算机名和实例名称
<pre class="in_text">computer_name\instance_name<br /></pre>

要 MicrosoftSQLServer2000JDBC, 连接命名实例通过 SQL 服务器 2000 MicrosoftTextDriver 必须指定端口号与命名实例, 代替的命名实例名称相关联如前面。
</div>
				<h2 class="subTitle" id="tocHeadRef">更多信息</h2>
				<script type="text/javascript"><![CDATA[oadTOCNode(1, 'moreinformation');]]&gt;</script>
				<div class="sbody">
要查找 SQLServer 实例端口号, 请按照下列步骤：
<table class="list ol"><tbody><tr><td class="number"><font color="#ff1493">1.</font></td><td class="text"><font color="#ff1493">在 Microsoft SQL Server 2000 服务器, 启动 SQL Server 网络实用工具。</font></td></tr><tr><td class="number"><font color="#ff1493">2.</font></td><td class="text"><font color="#ff1493">要从  实例  下拉菜单实例依次,  常规  选项卡。</font></td></tr><tr><td class="number"><font color="#ff1493">3.</font></td><td class="text"><font color="#ff1493">TCP/IP, 依次  属性 。 注意， 在  属性  对话框中出现端口号为此实例。</font></td></tr></tbody></table><br />
当您连接到 SQLServer 通过 JDBC 连接 URL 中使用只要有该值,。 下面是典型连接 URL 的示例：<br /><br /><div class="indent">
jdbc:microsoft:sqlserver： / 1433;  yourServerName  / 用户 =  yourUser  ； 密码 =  yourPwd ：</div>
在本示例, 使用默认端口是 1433。 将此默认替换端口号为您命名实例。
</div>
		</div>
<img src ="http://www.blogjava.net/alex/aggbug/88306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-12-17 00:35 <a href="http://www.blogjava.net/alex/archive/2006/12/17/88306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql的外键问题</title><link>http://www.blogjava.net/alex/archive/2006/11/07/79523.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 07 Nov 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/11/07/79523.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/79523.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/11/07/79523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/79523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/79523.html</trackback:ping><description><![CDATA[key words: mysql,外键,fm150<br /><br />这次在mysql中建立外键关联时发现问题:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">table</span><span style="color: rgb(0, 0, 0);"> CHILD </span><span style="color: rgb(0, 0, 255);">add</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">constraint</span><span style="color: rgb(0, 0, 0);"> FK3D1FCFC74B18345 </span><span style="color: rgb(0, 0, 255);">foreign</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">key</span><span style="color: rgb(0, 0, 0);"> (PARENTID) </span><span style="color: rgb(0, 0, 255);">references</span><span style="color: rgb(0, 0, 0);"> PARENT;         <br /></span></div><br /><br />提示..fm150错误,最后发现是mysql的版本问题，我用的是4.1的，对外键不知道是不支持还是支持的有问题，下载5.0的解决.<br /><img src ="http://www.blogjava.net/alex/aggbug/79523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-11-07 09:44 <a href="http://www.blogjava.net/alex/archive/2006/11/07/79523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle分页的一个问题</title><link>http://www.blogjava.net/alex/archive/2006/09/20/70817.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 20 Sep 2006 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/09/20/70817.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/70817.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/09/20/70817.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/70817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/70817.html</trackback:ping><description><![CDATA[key words :Oracle分页 视图<br /><br />google了一下关于Oracle的分页方法，方法还不少，大多数效果差不多-有点恶心. 恶心也要作，不过后来就是大家都用得这种方式在我这里出现了新问题，奇怪的是怎么没有别人碰到?<br /><br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">String condition </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> teacher_id = </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> userId </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and school_id=</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">siteId;<br />sql </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> select * </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> from your_table where </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rowid not in ( select rowid from your_table where</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> (pageIndex </span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">) </span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">) </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS ;</span></div><br />现在的问题是我需要按照table的某个字段排序，于是改成如下:<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">String condition </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> teacher_id = </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> userId </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and school_id=</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">siteId;<br />sql </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> select * </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> from your_table where </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rowid not in ( select rowid from your_table where</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> condition </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> (pageIndex </span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">) </span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><font color="#ff1493">order by id desc</font>) </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"><br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> and rownum &lt;= </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> Constants.PAGE_NUMS + " <font color="#ff1493">order by id desc</font>";</span></div><br />这个sql有问题么?<br />答案是可能有问题，也可能没有问题，因为据说在8i的Oracle版本之前都不行，实际上也不尽然，在我的9i和10g我得到的是同样的错误 "<b>missing right parenthesis</b>",还有一位兄弟估计是DBA建议我去metalink打一个patch,埃，动作太大了，不敢动。<br /><br />问题还是要解决，试了下类似于select a.*,rownum r from (select * from table where ...) a where rownum &lt; 10 等的方法，效果一样，就是不能加嵌套的order by<br />最后，用视图的方法间接解决问题，因为我要解决的问题实际就是按某个字段排序，那么在视图里先对table进行排序，再在视图的基础上作操作就OK了.<br /><br />另，还有一种不错的实现方法，即用OracleCachedRowSet,分页也比较简单，有点类似于hibernate,由于时间关系没有时间去看，感兴趣的朋友可以看一下.<br /><br /><br />BTW: 对于视图可能rowid有问题，可以改成视图的某个主键替换<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">String condition </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> teacher_id = </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> userId </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and school_id=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">siteId;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />sql </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> select * </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> from your_table where </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> condition </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and <strong>id</strong> not in ( select <strong>id</strong> from your_table where</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> condition </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and rownum &lt;= </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> (pageIndex </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> Constants.PAGE_NUMS </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">order by id desc) </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> and rownum &lt;= </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> Constants.PAGE_NUMS </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> order by id desc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;</span></div><br /><br /><br /><img src ="http://www.blogjava.net/alex/aggbug/70817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-09-20 15:36 <a href="http://www.blogjava.net/alex/archive/2006/09/20/70817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]JDBMonitor全攻略</title><link>http://www.blogjava.net/alex/archive/2006/08/31/66800.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 31 Aug 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/08/31/66800.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/66800.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/08/31/66800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/66800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/66800.html</trackback:ping><description><![CDATA[JDBMonitor是一个开源项目。使用它开发者可以很轻松为系统增加数据库执行日志功能。它使用十分方便，您所需要做的唯一事情就是在您系统的JDBC连接字符串前增加类似于 
"listenerconfig=/config.xml:url=" 的字符即可，不用写任何代码。 
<p>使用 
JDBMonitor，您可以把数据库执行情况记录通过各种方式记录下来，比如打印到控制台、输出到文件或者通过socket传送给远程客户端。JDBMonitor是可扩展的，您可以扩展它来将执行情况通过其他方式记录下来，您所需要做的就是写一个实现IDBListener接口的类即可。</p><p>JDBMonitor遵守 GNU Lesser General Public Licence (LGPL)协议。此协议包含在发行包中。</p><h2>入门</h2><p>几乎所有大型数据库应用都包含有自己的SQL执行日志功能，此功能不仅能帮助开发人员调试，而且可以为DBA（数据库管理员）提供系统的运行信息。</p><p>（1）很难将业务逻辑同日志代码分离</p><p>（2）降低了代码的可读性。</p><p>（3）降低了系统的运行速度。在记录日志的时候，程序会暂停运行等待直到记录完成，而I/O操作是相当耗时的。</p><p>（4）很难记录运行耗时、语句参数等其他信息</p><p>（5）很难为我们无法修改代码的系统（例如没有源代码的系统）或者很难增加记录日志功能代码的系统（比如系统使用了ORMapping）增加日志功能。</p><p>JDBMonitor 则不同：</p><p>（1）您最多只需要修改一行代码。您需要修改的代码就是这一行:Class.forName("com.cownew.JDBMonitor.jdbc.DBDriver") 
,然后再修改一下 JDBC连接字符串，只要从 “jdbc:db2://10.74.198.247:50000/app”修改成” 
listenerconfig=config.xml:url= 
jdbc:db2://10.74.198.247:50000/app”就可以了。在您使用WebLogic 
,Tomcat或其他服务器的数据源功能的时候，连修改代码这一步都是无需的。</p><p>（2）JDBMonitor另起一个线程来记录SQL，所以它不会对程序运行速度有任何影响。</p><p>（3）它是高度可扩展的，所以您可以扩展它来把执行情况通过其他方式记录。比如，您可以写一个扩展类，来通过电子邮件将日志发送出去。</p><h2>取得 JDBMonitor</h2><p>JDBMonitor的最新稳定版本可以在JDBMonitor的网站上取得：</p><p>http://www.cownew.com/JDBMonitor</p><h2>使用 JDBMonitor</h2><p>1 将 jdbmonitor.jar放到您系统的类路径下。</p><p>2 让系统加载 JDBMonitor的JDBC驱动。</p><p>这一步将会依您系统加载JDBC驱动的方式的不同而不同。</p><p>（1）如果您通过代码的形式加载JDBC驱动，例如：</p><p>   Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);<br />   
Connection cn = DriverManager.getConnection(……);</p><p>在这种情况下 ，您必须修改 
“Class.forName”这一句来加载JDBMonitor的JDBC驱动（“com.cownew.JDBMonitor.jdbc.DBDriver”），而非以前的数据库JDBC驱动。</p><p>例如：</p><p>Class.forName(“com.cownew.JDBMonitor.jdbc.DBDriver”);<br />   Connection cn = 
DriverManager.getConnection(……);</p><p>（2）如果您在配置文件中指定JDBC驱动，比如，数据源配置文件或者其他类似的文件。</p><p>请修改原来的  JDBC驱动类为 “com.cownew.JDBMonitor.jdbc.DBDriver” 。 <br /></p><p>3 让 JDBMonitor加载能够加载原来的JDBC驱动</p><p>JDBMonitor的工作原理就是截获JDBC驱动的SQL语句调用、记录SQL语句，然后将SQL语句重新转发给原来的JDBC驱动，所以JDBMonitor必须首先向DriverManager注册JDBC驱动。</p><p>原来的JDBC驱动定义在配置文件的“JdbcDrivers” 段中。 <br />&lt;JdbcDrivers&gt;<br />    
&lt;JdbcDriver class=" com.mysql.jdbc.Driver"/&gt;<br />  &lt;/JdbcDrivers&gt;</p><p>4 在原来的JDBC连接字符串前增加 JDBMonitor所需的信息。</p><p>您所需要做的就是将” listenerconfig=&lt;configfilepath&gt;:url=” 
增加到原来的JDBC连接字符串前。“&lt;configfilepath&gt;”代表配置文件的路径，下面集中路径都是合法的：</p><p>/com/jdbmonitor/config.xml <br />com/jdbmonitor/config.xml<br />c:/ jdbmonitor 
/config.xml</p><p>JDBMoinitor使用getClass().getResourceAsStream加载类似于“/com/jdbmonitor/config.xml” 
and “com/jdbmonitor/config.xml” 的类路径文件，使用 FileInputStream加载类似于 “c:/ jdbmonitor 
/config.xml”的配置文件。<br /></p><p>5 指定您要使用监听器：</p><p>您可以把数据库执行情况记录通过各种方式记录下来，比如打印到控制台、输出到文件或者通过socket传送给远程客户端。</p><p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、 
SocketDBListene、DataBaseDBListener。当然您也可以开发满足您要求的监听器。<br />监听器定义在配置文件的 
“Listeners”段中：</p><p>&lt;Listeners&gt;<br />    &lt;!--ConsoleDBListener no arguments--&gt;<br />    
&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" 
arg=""/&gt;<br />    <br />    &lt;!--the arguments of FileDBListener is the file to 
log the SQL statement --&gt;<br />    &lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/aaa.txt"/&gt;<br />    <br />    &lt;!--the arguments of SocketDBListener is 
the bound socket port of the listener server --&gt;<br />    &lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.SocketDBListener" arg="9527"/&gt;<br />  
&lt;/Listeners&gt;</p><p>搞定！启动您的系统。耶！SQL语句被记录下来了，我们可以在控制台、文件甚至远程监视器中看到日志了。</p><h2>举例</h2><h3>mvnforum的例子：</h3><p>您可以从http://www.mvnForum.com得到mvnforum。我演示用的版本是1.0。</p><p>(1)打开webapp\WEB-INF\classes\ mvncore.xml，重新配置：</p><p>修改之前：</p><p>&lt;driver_class_name&gt;com.mysql.jdbc.Driver&lt;/driver_class_name&gt;<br />&lt;database_url&gt;listenerconfig=c:/log/jdbmonitor/config.xml:url= 
jdbc:mysql://localhost/mvnforum?useUnicode=true&amp;amp;characterEncoding=utf-8&lt;/database_url&gt;</p><p>修改之后： <br />&lt;driver_class_name&gt; com.cownew.JDBMonitor.jdbc.DBDriver 
&lt;/driver_class_name&gt;<br />        
&lt;database_url&gt;jdbc:mysql://localhost/mvnforum?useUnicode=true&amp;amp;characterEncoding=utf-8&lt;/database_url&gt;</p><p>(2)创建文件 c:/log/jdbmonitor/config.xml。我只想将SQL语句记录到文本文件中，所以我做如下配置： 
<br />&lt;config&gt;<br />  &lt;Listeners&gt;<br />    &lt;!--the arguments of 
FileDBListener is the file to log the SQL statement --&gt;<br />    &lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/log.txt"/&gt;<br />  &lt;/Listeners&gt;<br />  &lt;JdbcDrivers&gt;<br />    
&lt;JdbcDriver class="com.mysql.jdbc.Driver"/&gt;<br />  
&lt;/JdbcDrivers&gt;<br />&lt;/config&gt;<br />(3) 将 
jdbmonitor.jar放到webapp\WEB-INF\lib下。<br />(4) 搞定！</p><p>Jive的例子：</p><p>您可以从http://www.jivesoftware.com得到Jive。我演示用的版本是 Jive 2.0 beta版。</p><h3>(1)打开<a href="http://localhost:8080/jive/admin/">http://localhost:8080/jive/admin/</a></h3><h3>“jdbc” 填为：com.cownew.JDBMonitor.jdbc.DBDriver</h3><h3>“server” 
填为：c:/log/jdbmonitor/config.xml:url=jdbc:mysql://locahost/jive<br />(2)将 
jdbmonitor.jar放到WEB-INF\lib下<br />(3) 象mvnforum中一样创建同样的 
c:/log/jdbmonitor/config.xml 文件.<br />(4) 搞定!</h3><p>代码方式的例子：</p><p>尽管直接在代码中指定系统所用的JDBC驱动类名和JDBC连接字符串是不推荐的，但是仍然有系统是这么做的。</p><p>比如：</p><p><strong>              
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");</strong><br /><strong>              
Connection conn = null;</strong><br /><strong>              PreparedStatement ps = 
null;</strong><br /><strong>              try</strong><br /><strong>              
{</strong><br /><strong>                     conn = 
DriverManager</strong><br /><strong>                                   
.getConnection("jdbc:odbc:MQIS");</strong><br /><strong>                     for 
(int i = 0; i &lt; 1000; i++)</strong><br /><strong>                     
{                    </strong><br /><strong>                            ps = 
conn.prepareStatement("update T_Material set 
fid=fid");</strong><br /><strong>                            
ps.execute();</strong><br /><strong>                            
ps.close();</strong><br /><strong>                     
}</strong><br /><strong>              } finally</strong><br /><strong>              
{</strong><br /><strong>                     ....          
</strong><br /><strong>              }</strong></p><p>（1）修改一下代码为：<br /> <strong>              
Class.forName("com.cownew.JDBMonitor.jdbc.DBDriver");</strong><br /><strong>              
Connection conn = null;</strong><br /><strong>              PreparedStatement ps = 
null;</strong><br /><strong>              try</strong><br /><strong>              
{</strong><br /><strong>                     conn = 
DriverManager.getConnection("listenerconfig= 
c:/log/jdbmonitor/config.xml:url=jdbc:odbc:MQIS");</strong><br /><strong>                     
for (int i = 0; i &lt; 1000; i++)</strong><br /><strong>                     
{</strong><br /><strong>                            ps = 
conn.prepareStatement("update T_Material set 
fid=fid");</strong><br /><strong>                            
ps.execute();</strong><br /><strong>                            
ps.close();</strong><br /><strong>                     
}</strong><br /><strong>              } finally</strong><br /><strong>              
{</strong><br /><strong>                     ....          
</strong><br /><strong>              }</strong></p><p>（2）创建c:/log/jdbmonitor/config.xml文件。我想记录SQL语句到文本文件中同时输出到控制台，这样可以辅助我进行调试，所以我配置如下： 
<br />&lt;config&gt;<br />  &lt;Listeners&gt;<br />    &lt;!--the arguments of 
FileDBListener is the file to log the SQL statement --&gt;<br />&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/log.txt"/&gt;</p><p>&lt;!--ConsoleDBListener no arguments--&gt;<br />&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" arg=""/&gt;<br />  
&lt;/Listeners&gt;<br />  &lt;JdbcDrivers&gt;<br />    &lt;JdbcDriver 
class="com.mysql.jdbc.Driver"/&gt;<br />  
&lt;/JdbcDrivers&gt;<br />&lt;/config&gt;<br />(3) 将 jdbmonitor.jar放到类路径下。<br />(4) 
搞定!</p><h2>监听器</h2><p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、 
SocketDBListener、DataBaseDBListener。</p><p><strong>1、ConsoleDBListener 控制台监听器</strong></p><p>ConsoleDBListener会将SQL语句打印到控制台中。</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113131636.jpg" twffan="done" height="113" width="579" /></p><p>这个监听器很容易配置：</p><p>&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" 
arg=""/&gt;</p><p><strong>2、FileDBListener 文件监听器</strong></p><p>FileDBListener 会将SQL语句保存到文本文件中。</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113136883.jpg" twffan="done" height="347" width="316" /></p><p>如下配置：</p><p>&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" 
arg="c:/aaa.txt"/&gt;</p><p><strong><em>arg="c:/aaa.txt"</em></strong>表示日志将保存到文件<strong><em>c:/aaa.txt</em></strong>中。</p><p><strong>3、SocketDBListener Socket监听器</strong></p><p>SocketDBListener是一个socket服务器，客户端连接到它上边以后就可以接收到它发出的SQL语句。</p><p>如下配置：</p><p>&lt;Listener class="com.cownew.JDBMonitor.listenerImpl.SocketDBListener" 
arg="9527"/&gt;</p><p><em><strong>arg="9527"</strong></em>表示服务器将在9527端口监听。</p><p>我们已经开发了如下两种客户端：SocketConsoleClient（Socket控制台客户端） 和 SocketSwingClient（Socket 
Swing客户端）。</p><p>SocketConsoleClient工作在控制台中：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113136805.jpg" twffan="done" height="223" width="665" /></p><p>SocketSwingClient是一个Swing GUI客户端：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137863.jpg" twffan="done" height="300" width="495" /></p><p>您可以运行<em><strong>"java -classpath jdbmonitor.jar 
com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketConsoleClient" 
</strong></em>来启动<em><strong>SocketConsoleClient</strong></em>，运行<em><strong>"java 
-classpath jdbmonitor.jar 
com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketSwingClient"</strong></em>启动<em><strong>SocketSwingClient</strong></em>。</p><p>您可以编写符合您自己要求的客户端，具体细节请参考<em><strong>com.cownew.JDBMonitor.listenerImpl.sckListenerClient.ListenerClient</strong></em>和<em><strong>com.cownew.JDBMonitor.listenerImpl.sckListenerClient.IDBSocketClientListener</strong></em>.</p><p><strong>4、DataBaseDBListener</strong></p><p>DataBaseDBListener将会把SQL语句记录到数据库中：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137930.jpg" twffan="done" height="194" width="851" /></p><p>如下配置：</p><p><em><strong>&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.DataBaseDBListener" 
<br />arg="dburl=jdbc:odbc:MQIS;user=;password=;logtable=T_Log_SQLLog"/&gt; 
</strong></em></p><p><em><strong>"dburl=jdbc:odbc:MQIS;user=;password=;"</strong></em>表示目标数据库的JDBC连接字符串。<em><strong>"logtable=T_Log_SQLLog"</strong></em> 
表示SQL记录将被保存到哪个表中，默认的是<em><strong>T_Log_SQLLog</strong></em>。</p><p>如果目标数据库用的JDBC驱动与被监控的数据库不同，请将它加入配置文件的 "JdbcDrivers" 部分，例如：</p><p><em><strong>&lt;config&gt;<br />&lt;Active&gt;true&lt;/Active&gt;<br />&lt;Listeners&gt;</strong></em></p><p><em><strong>&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" 
arg=""/&gt;<br /><br />&lt;Listener 
class="com.cownew.JDBMonitor.listenerImpl.DataBaseDBListener" 
<br />arg="dburl=jdbc:odbc:MQIS;user=;password=;logtable=T_Log_SQLLog"/&gt;<br />&lt;/Listeners&gt;<br />&lt;JdbcDrivers&gt;<br />&lt;JdbcDriver 
class="com.microsoft.jdbc.sqlserver.SQLServerDriver"/&gt;<br />&lt;JdbcDriver 
class="sun.jdbc.odbc.JdbcOdbcDriver"/&gt;<br />&lt;/JdbcDrivers&gt;<br />&lt;/config&gt;</strong></em></p><p>"<em><strong>T_Log_SQLLog</strong></em>"的结构是：</p><p><img src="http://java.chinaitlab.com/UploadFiles_8734/200605/20060515113137716.jpg" twffan="done" height="110" width="243" /></p><p>"<em><strong>T_Log_SQLLog</strong></em>"的建库脚本在<em><strong>com/cownew/JDBMonitor/listenerImpl/dataBaseListener</strong></em>,(db2.sql,mssqlserver.sql,oracle.sql)。</p><p>DataBaseDBListener是跨数据库的，你可以把记录SQL到任何关系数据库中。</p><h2>FAQ:</h2><p>1 如果我暂时不想记录SQL语句执行怎么办？难道我要重新修改成原来的样子？</p><p>答：无须如此。您只要修改config.xml，增加<strong><em>&lt;Active&gt;false&lt;/Active&gt;</em></strong>到文件中即可。</p><p>如下： </p><p><strong><em>&lt;config&gt;</em></strong><br /><strong><em>  &lt;Active&gt; 
false &lt;/Active&gt;</em></strong><br /><strong><em>  
&lt;Listeners&gt;</em></strong><br /><strong><em>......</em></strong><br /><strong><em>&lt;/config&gt;</em></strong><strong></strong></p><h2>如何扩展JDBMonitor？</h2><p>我们已经开发了如下常用的监听器：FileDBListener、ConsoleDBListener、 
SocketDBListener、DataBaseDBListener。当然您也可以开发满足您要求的监听器。所有的监听器必须实现接口：com.cownew.JDBMonitor.commo. 
IDBListener。IDBListener有两个方法需要实现：</p><p><strong><em>public void init(String arg);</em></strong><br /><strong><em>public 
void logSql(SQLInfo info);</em></strong></p><p>JDBMonitor会将配置文件中监听器定义中“arg”的值传递给 
“init”方法、将代表SQL语句执行信息的SQLInfo传递给“logSql”方法。</p><p>更多信息请参考API文档。</p><img src ="http://www.blogjava.net/alex/aggbug/66800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-08-31 10:59 <a href="http://www.blogjava.net/alex/archive/2006/08/31/66800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]JDBC连接数据库经验集萃</title><link>http://www.blogjava.net/alex/archive/2006/08/29/66520.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 29 Aug 2006 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/08/29/66520.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/66520.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/08/29/66520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/66520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/66520.html</trackback:ping><description><![CDATA[
		<span style="font-family: 宋体;" lang="EN-US">
				<font size="4">Java
数据库连接（JDBC）由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的
API，使他们能够用纯Java API
来编写数据库应用程序。然而各个开发商的接口并不完全相同，所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。<br />一、连接各种数据库方式速查表<br />    下面罗列了各种数据库使用JDBC连接的方式，可以作为一个手册使用。<br /><br />    1</font>
		</span>
		<span style="font-family: 宋体;">
				<font size="4">、<span lang="EN-US">Oracle8/8i/9i</span>数据库（<span lang="EN-US">thin</span>模式）<span lang="EN-US"> <br />Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <br />String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl</span>为数据库的<span lang="EN-US">SID <br />String user="test"; <br />String password="test"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /><br />    2</span>、<span lang="EN-US">DB2</span>数据库<span lang="EN-US"> <br />Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <br />String url="jdbc:db2://localhost:5000/sample"; //sample</span>为你的数据库名<span lang="EN-US"> <br />String user="admin"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /><br />    3</span>、<span lang="EN-US">Sql Server7.0/2000</span>数据库<span lang="EN-US"> <br />Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <br />String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; <br />//mydb</span>为数据库<span lang="EN-US"> <br />String user="sa"; <br />String password=""; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /><br />    4</span>、<span lang="EN-US">Sybase</span>数据库<span lang="EN-US"> <br />Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <br />String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB</span>为你的数据库名<span lang="EN-US"> <br />Properties sysProps = System.getProperties(); <br />SysProps.put("user","userid"); <br />SysProps.put("password","user_password"); <br />Connection conn= DriverManager.getConnection(url, SysProps); <br /><br />    5</span>、<span lang="EN-US">Informix</span>数据库<span lang="EN-US"> <br />Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = <br />"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword"; //myDB</span>为数据库名<span lang="EN-US"> <br />Connection conn= DriverManager.getConnection(url); <br /><br />    6</span>、<span lang="EN-US">MySQL</span>数据库<span lang="EN-US"> <br />Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <br />String url ="jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <br />//myDB</span>为数据库名<span lang="EN-US"> <br />Connection conn= DriverManager.getConnection(url); <br /><br />    7</span>、<span lang="EN-US">PostgreSQL</span>数据库<span lang="EN-US"> <br />Class.forName("org.postgresql.Driver").newInstance(); <br />String url ="jdbc:postgresql://localhost/myDB" //myDB</span>为数据库名<span lang="EN-US"> <br />String user="myuser"; <br />String password="mypassword"; <br />Connection conn= DriverManager.getConnection(url,user,password); <br /></span></font>
		</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">
						<span lang="EN-US">
								<font size="4">
										<br />    8、access</font>
						</span>
						<font size="4">数据库直连用ODBC的<span lang="EN-US"><br />Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;<br />String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");<br />Connection conn = DriverManager.getConnection(url,"","");<br /> Statement stmtNew=conn.createStatement() ;<br /><o:p><br />二、JDBC连接MySql方式<br />    下面是使用JDBC连接MySql的一个小的教程     </o:p></span></font>
				</span>
		</p>
		<p>
				<font size="4">    1、查找驱动程序<br />    MySQL目前提供的java驱动程序为Connection/J，可以从MySQL官方网站下载，并找到mysql-connector-java-3.0.15-ga-bin.jar文件，此驱动程序为纯java驱动程序，不需做其他配置。<br /><br />    2、动态指定classpath<br />    <font color="#ff0000">如果需要执行时动态指定classpath，就在执行时采用－cp方式。否则将上面的.jar文件加入到classpath环境变量中。</font><br /><br />    3、加载驱动程序<br />try{<br />    Class.forName(com.mysql.jdbc.Driver);<br />    System.out.println(Success loading Mysql Driver!);<br />}catch(Exception e)<br />{<br />    System.out.println(Error loading Mysql Driver!);<br />    e.printStackTrace();<br />} <br /><br />    4、设置连接的url<br />    jdbc：mysql：//localhost/databasename[?pa=va][＆pa=va]<br /><br />三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧，这些技巧能够使我们更好地发挥系统的性能和实现更多的功能（系转载）。</font>
		</p>
		<p>
				<font size="4">　　1、在客户端软件开发中使用Thin驱动程序</font>
		</p>
		<p>
				<font size="4">　　在开发Java软件方面，Oracle的数据库提供了四种类型的驱动程序，二种用于应用软件、applets、
servlets等客户端软件，另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中，我们可以选择OCI驱动程序或Thin
驱动程序。OCI驱动程序利用Java本地化接口（JNI），通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序，它直
接与数据库进行通讯。为了获得最高的性能，Oracle建议在客户端软件的开发中使用OCI驱动程序，这似乎是正确的。但我建议使用Thin驱动程序，因
为通过多次测试发现，在通常情况下，Thin驱动程序的性能都超过了OCI驱动程序。</font>
		</p>
		<p>
				<font size="4">　　2、关闭自动提交功能，提高系统性能</font>
		</p>
		<p>
				<font size="4">　　在第一次建立与数据库的连接时，在缺省情况下，连接是在自动提交模式下的。为了获得更好的性能，可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能，如下所示：</font>
		</p>
		<p>
				<font size="4">　　conn.setAutoCommit(false);</font>
		</p>
		<p>
				<font size="4">　　值得注意的是，一旦关闭了自动提交功能，我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。</font>
		</p>
		<p>
				<font size="4">　　3、在动态SQL或有时间限制的命令中使用Statement对象</font>
		</p>
		<p>
				<font size="4">　　在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用
Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象
时，每次执行一个SQL命令时，都会对它进行解析和编译。这可能会使你认为，使用PreparedStatement对象比使用Statement对象的
速度更快。然而，我进行的测试表明，在客户端软件中，情况并非如此。因此，在有时间限制的SQL操作中，除非成批地处理SQL命令，我们应当考虑使用
Statement对象。</font>
		</p>
		<p>
				<font size="4">　　此外，使用Statement对象也使得编写动态SQL命令更加简单，<b>因为我们可以将字符串连接在一起，建立一个有效的SQL命令</b>。因此，我认为，<font color="#ff0000">Statement对象可以使动态SQL命令的创建和执行变得更加简单。</font></font>
		</p>
		<p>
				<font size="4">　　4、利用helper函数对动态SQL命令进行格式化</font>
		</p>
		<p>
				<font size="4">　　在创建使用Statement对象执行的动态SQL命令时，我们需要处理一些格式化方面的问题。例如，如果我们
想创建一个将名字O'Reilly插入表中的SQL命令，则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是
创建一个完成替换操作的helper方法，然后在连接字符串心服用公式表达一个SQL命令时，使用创建的helper方法。与此类似的是，我们可以让
helper方法接受一个Date型的值，然后让它输出基于Oracle的to_date()函数的字符串表达式。</font>
		</p>
		<p>
				<font size="4">　　5、利用PreparedStatement对象提高数据库的总体效率</font>
		</p>
		<p>
				<font size="4">　　在使用PreparedStatement对象执行SQL命令时，命令被数据库进行解析和编译，然后被放到命令
缓冲区。然后，每当执行同一个PreparedStatement对象时，它就会被再解析一次，但不会被再次编译。在缓冲区中可以发现预编译的命令，并且
可以重新使用。在有大量用户的企业级应用软件中，经常会重复执行相同的SQL命令，使用PreparedStatement对象带来的编译次数的减少能够
提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务，我会建议在除动
态SQL命令之外的所有情况下使用PreparedStatement对象。</font>
		</p>
		<p>
				<font size="4">　　6、<font color="#ff0000">在成批处理重复的插入或更新操作中使用PreparedStatement对象</font></font>
		</p>
		<p>
				<font size="4">　　如果成批地处理插入和更新操作，就能够显著地减少它们所需要的时间。Oracle提供的Statement和
CallableStatement并不真正地支持批处理，只有PreparedStatement对象才真正地支持批处理。我们可以使用
addBatch()和executeBatch()方法选择标准的JDBC批处理，或者通过利用PreparedStatement对象的
setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批
处理机制，可以以如下所示的方式调用setExecuteBatch()：<br />PreparedStatement pstmt3D null;<br />try {<br />((OraclePreparedStatement)<br />pstmt).setExecuteBatch(30);<br />...<br />pstmt.executeUpdate();<br />} <br /></font>
		</p>
		<p>
				<font size="4">　　调用setExecuteBatch()时指定的值是一个上限，当达到该值时，就会自动地引发SQL命令执行，
标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch
()方法随时传输批处理任务。</font>
		</p>
		<p>
				<font size="4">　　7、使用Oracle locator方法插入、更新大对象（LOB）</font>
		</p>
		<p>
				<font size="4">　　Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理，尤其是
Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的
值，也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。
可以使用PreparedStatement对象插入或更新LOB，但需要使用locator才能获取LOB的值。<i><font color="#ff0000">由于存在这二个问题，因此，我建议使用
locator的方法来插入、更新或获取LOB的值。</font></i></font>
		</p>
		<p>
				<font size="4">　　8、使用SQL92语法调用存储过程</font>
		</p>
		<p>
				<font size="4">　　在调用存储过程时，我们可以使用SQL92或Oracle PL/SQL，由于使用Oracle PL/SQL并没有什么实际的好处，而且会给以后维护你的应用程序的开发人员带来麻烦，因此，我建议在调用存储过程时使用SQL92。</font>
		</p>
		<p>
				<font size="4">　　9、使用Object SQL将对象模式转移到数据库中</font>
		</p>
		<p>
				<font size="4">　　既然可以将Oracle的数据库作为一种面向对象的数据库来使用，就可以考虑将应用程序中的面向对象模式转到数
据库中。目前的方法是创建Java
bean作为伪装的数据库对象，将它们的属性映射到关系表中，然后在这些bean中添加方法。尽管这样作在Java中没有什么问题，但由于操作都是在数据
库之外进行的，因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术，可以通过创建一个新的数据库对象类型在数据库中模
仿其数据和操作，然后使用JPublisher等工具生成自己的Java
bean类。如果使用这种方式，不但Java应用程序可以使用应用软件的对象模式，其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的
对象模式。</font>
		</p>
		<p>
				<font size="4">　　10、利用SQL完成数据库内的操作</font>
		</p>
		<p>
				<font size="4">　　我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求，而不是使用Java等过程化的编程语言。</font>
		</p>
		<p>
				<font size="4">　　如果编程人员要在一个表中查找许多行，结果中的每个行都会查找其他表中的数据，最后，编程人员创建了独立的
UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的
SQL命令中完成任务，何必要让数据在网上流来流去的？我建议用户认真学习如何最大限度地发挥SQL的功能。 </font>
		</p>
<img src ="http://www.blogjava.net/alex/aggbug/66520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-08-29 22:01 <a href="http://www.blogjava.net/alex/archive/2006/08/29/66520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle中查询被锁的表并释放session</title><link>http://www.blogjava.net/alex/archive/2006/08/21/64895.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 21 Aug 2006 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/08/21/64895.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/64895.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/08/21/64895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/64895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/64895.html</trackback:ping><description><![CDATA[key words: 锁表 解锁<br />查询sql:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">SELECT</span><span style="color: rgb(0, 0, 0);"> A.OWNER,<br />A.</span><span style="color: rgb(255, 0, 255);">OBJECT_NAME</span><span style="color: rgb(0, 0, 0);">,<br />B.XIDUSN,<br />B.XIDSLOT,<br />B.XIDSQN,<br />B.SESSION_ID,<br />B.ORACLE_USERNAME, <br />B.OS_USER_NAME,<br />B.PROCESS, <br />B.LOCKED_MODE, <br />C.MACHINE,<br />C.STATUS,<br />C.SERVER,<br />C.SID,<br />C.SERIAL#,<br />C.PROGRAM<br /></span><span style="color: rgb(0, 0, 255);">FROM</span><span style="color: rgb(0, 0, 0);"> ALL_OBJECTS A,<br />V$LOCKED_OBJECT B,<br />SYS.GV_$SESSION C <br /></span><span style="color: rgb(0, 0, 255);">WHERE</span><span style="color: rgb(0, 0, 0);"> ( A.</span><span style="color: rgb(255, 0, 255);">OBJECT_ID</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"> B.</span><span style="color: rgb(255, 0, 255);">OBJECT_ID</span><span style="color: rgb(0, 0, 0);"> )<br /></span><span style="color: rgb(128, 128, 128);">AND</span><span style="color: rgb(0, 0, 0);"> (B.PROCESS </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"> C.PROCESS )<br /></span><span style="color: rgb(0, 0, 255);">ORDER</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">BY</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0); font-weight: bold;">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">2</span><span style="color: rgb(0, 0, 0);"> </span></div><br />释放session Sql:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> system </span><span style="color: rgb(0, 0, 255);">kill</span><span style="color: rgb(0, 0, 0);"> session </span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">sid, serial#</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /><br /></span><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> system </span><span style="color: rgb(0, 0, 255);">kill</span><span style="color: rgb(0, 0, 0);"> session </span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">379, 21132</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">alter</span><span style="color: rgb(0, 0, 0);"> system </span><span style="color: rgb(0, 0, 255);">kill</span><span style="color: rgb(0, 0, 0);"> session </span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">374, 6938</span><span style="color: rgb(255, 0, 0);">'</span></div><br /><img src ="http://www.blogjava.net/alex/aggbug/64895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-08-21 21:58 <a href="http://www.blogjava.net/alex/archive/2006/08/21/64895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle函数</title><link>http://www.blogjava.net/alex/archive/2006/07/31/61040.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Mon, 31 Jul 2006 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/31/61040.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/61040.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/31/61040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/61040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/61040.html</trackback:ping><description><![CDATA[Oracle常用的函数:<br /><br />sysdate<br />systimestamp<br />to_char <br />to_date:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> to_date(</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">06-5月-1957</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">DD-Mon-YY</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> dual;</span></div><br />nvl:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> nvl(sal,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">空</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> emp;</span></div><br /><br />decode:<br /><u><b><font color="#0000ff">decode</font></b></u>(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)<br /><br />该函数的含义如下：<br />IF 条件=值1 THEN<br />　　　　RETURN(翻译值1)<br />ELSIF 条件=值2 THEN<br />　　　　RETURN(翻译值2)<br />　　　　......<br />ELSIF 条件=值n THEN<br />　　　　RETURN(翻译值n)<br /><br />ELSE<br />　　　　RETURN(缺省值)<br />END IF<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">String sql </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"><br />        "</span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> product_name,</span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+chargePeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,charge))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> cur_charge,<br /></span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+lastPeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,charge))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> last_charge, "<br />        </span><span style="color: rgb(128, 128, 128);">+</span><span style="color: rgb(0, 0, 0);"><br />        " </span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+chargePeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,bill_time_len))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">60</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> cur_time,<br /></span><span style="color: rgb(255, 0, 255);">sum</span><span style="color: rgb(0, 0, 0);">(decode(bill_month,</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">"+lastPeriod+"</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,bill_time_len))</span><span style="color: rgb(128, 128, 128);">/</span><span style="color: rgb(128, 0, 0); font-weight: bold;">60</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> last_time "<br />        </span><span style="color: rgb(128, 128, 128);">+</span><span style="color: rgb(0, 0, 0);"><br />        " </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> tl_acc_report "<br />        </span><span style="color: rgb(128, 128, 128);">+</span><span style="color: rgb(0, 0, 0);"><br />        " </span><span style="color: rgb(0, 0, 255);">group</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">by</span><span style="color: rgb(0, 0, 0);"> product_name ";<br /><br /><br /></span><span style="color: rgb(0, 0, 255);">SELECT</span><span style="color: rgb(0, 0, 0);"> sid,serial#,username,<br /><br />DECODE(command<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">0</span><span style="color: rgb(0, 0, 0);">,’None’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">2</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Insert</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">3</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Select</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">6</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Update</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">7</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Delete</span><span style="color: rgb(0, 0, 0);">’<br /><br />,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">8</span><span style="color: rgb(0, 0, 0);">,’</span><span style="color: rgb(0, 0, 255);">Drop</span><span style="color: rgb(0, 0, 0);"><br /><br />,’Other’) cmd </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> des<br /></span></div><br /><img src ="http://www.blogjava.net/alex/aggbug/61040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-31 16:34 <a href="http://www.blogjava.net/alex/archive/2006/07/31/61040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle表连接</title><link>http://www.blogjava.net/alex/archive/2006/07/27/60426.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 27 Jul 2006 13:21:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/27/60426.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/60426.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/27/60426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/60426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/60426.html</trackback:ping><description><![CDATA[key words: 表连接 <br />内连接<br /><br />select statement from table1 join table2 on table1.fieled1 = table2.field2<br /><br />select statement from table1 ,table2 where table1.field1 = table2.field2<br /><br /><br />左连接<br /><br />select .....table1 left outer join table2 on table1....= table2.field<br /><br />select .... table1 ,table2 where table1.field1= table2.field(+)<br /><br />合并查询<br />union:获得并集，并自动去掉重复行，并且会以第一列的结果进行排序<br />union all: 获得并集，但不去掉重复行，也不排序<br /><br />子查询:<br />对于多行子查询，必须要用多行运算符(IN,NOT IN,EXISTS,NOT EXISTS,ALL,ANY)<br /><br /><img src ="http://www.blogjava.net/alex/aggbug/60426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-27 21:21 <a href="http://www.blogjava.net/alex/archive/2006/07/27/60426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]DB2与Oracle数据库之间远程复制</title><link>http://www.blogjava.net/alex/archive/2006/07/27/60409.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 27 Jul 2006 11:54:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/27/60409.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/60409.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/27/60409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/60409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/60409.html</trackback:ping><description><![CDATA[key words: 数据库复制  <br /><b class="art_title f18">come from <a href="http://www.pconline.com.cn/pcjob/other/data/db2/0607/822326_1.html">here</a></b><br /><br />一、背景 <br />　　DB2 联合数据库是分布式数据库管理的特殊形式。在联合数据库系统中，可以通过一个 SQL
命令来发出对多个数据源的命令请求。DB2 与非 DB2 数据库之间进行复制之前，首先需要保证非 DB2 数据源可以被 DB2 ESE
Version 8 federated database访问。对于DB2 Replication Version 8
所需的联合数据库功能可以在现有发布的 DB2 ESE Version 8 和 DB2 Connect Enterprise Edition
Version 8 中提供。<br /><br />　　"SQL复制"又称为"DB2复制"，是为 DB2 开发的两种数据复制类型中的一种，它是通过
SQL 进行的复制。在这里简单提一下，DB2 复制中的另一种"Q复制"是通过 Websphere MQ 消息队列进行的。在进行 SQL
复制时，Capture 程序读取 DB2 恢复日志以获取对指定源表的更改。该程序将更改保存到传输表格中，也称作变化数据表（changed
data table），Apply 程序并行读取更改并应用于目标事务，见图1。<br /><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz1.jpg" border="0" /></p><p><br /><br /><br />　　图1：SQL复制的结构<br /><br />　　WebSphere II 全球信息集成复制，通过不同数据库之间的复制，有效的利用了数据资源，为提高效率提供了良好的平台。<br /><br />　　DB2 与非 DB2 数据库之间的复制需要用到 WebSphere II。本文力争通过复制实例让读者对不同数据库之间的复制有一个整体的概念。<br /><br />二、动机<br /><br />　　商业上出于很多原因使用复制，可以归纳为：<br /><br />分散：把数据分散到各个位置； <br />整合：把其他位置的数据联合起来； <br />交换：与其他位置进行双向的数据交换； <br />灵活应用：对上面提到的方式进行一些改变或者结合。<br /><br />　
　联合 (Federated)
数据库系统的诞生，利用了现有的数据资源，把不同商业数据库软件的数据整合到一起，很大程度的提高了数据利用率。联合数据库可以用一个SQL语句对分布在
不同地点的多种数据源发出请求。联合数据库系统可以把本地表和远程数据源联接起来，就像数据都在本地一样，并且可以通过对数据源进行分布请求来提高数据源
处理能力，还可以通过在联合服务器处理部分分布请求来补充数据源的 SQL 限制。<br /><br />　　联合数据库具有两个与其他应用服务器不同的特点：<br /><br />联合服务器可以被配置为接收全部或接收部分针对数据源的请求。联合服务器把这些请求分散到数据源。 <br />与其他应用服务器一样，一个联合服务器用 DRDA 通信协议（例如 SNA 和 TCP/IP）与 DB2 家族实例通信。然而，与其他应用服务器不同的是，与非 DB2 家族实例通信时用其他协议。<br /><br />　　图2描述了联合数据库系统的设置流程：<br /></p><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz2.jpg" border="0" /></p><br />　　图2：联合数据库系统的设置流程<br /><br /><br />　
　WebSphere II 包括两种包装器（Wrapper），一种为关系型包装器，负责DB2 UDB, Informix, Oracle,
Microsoft SQL Server, Sybase, ODBC, OLE DB 等数据的复制。另一种为非关系型包装器，负责
Flatfile, Excel, XML 等非关系型数据的复制。<br /><br />　　包装器定义了一个负责本地数据库与远程数据库通信的库。包装器执
行很多任务，比如：它可以连接到数据源，包装器应用了数据源的标准连接API。它还可以给数据源提交请求。联合数据库系统可以操作远程联合系统的表。远程
表在本地联合数据库中虚拟存在，客户应用程序可以操作这些虚拟表，但是它们真正存在于远端数据库中。每个远程虚拟数据库，把联合数据库当作数据库客户端，
他们只对数据库客户端的请求有回应。因此联合数据库需要下载各种远程数据库的客户端。<br /><br />一个联合系统的构造，需要一个作为联合服务器的 DB2 实例，一个作为联合数据库的数据库，一个或多个数据源，和可以存取数据库和数据源的客户（用户和应用）。如果要完成远程不同数据库之间的复制，还需要应用DB2的数据复制功能。<br /><br />IBM
DB2 复制（在一些平台上被称为数据传播）是一个从一个位置到另一个位置复制 DB2
和/或其他数据库厂商数据的强大的，灵活的工具。IBM的复制支持数据转换，数据连接和过滤数据。可以在不同的平台之间搬运数据，也可以把数据分散到不同
的地点或从分散的地方把数据聚合到一个地方。可以在不同的系统之间交换数据。<br /><br />　　IBM复制由四个主要部分组成：管理 (Administrator)，Capture，Apply，警报监视器 (Alert Monitor)。<br /><br />　　管理的部分主要通过复制中心的图形界面来实现。通过复制中心可以定义复制源，定义从数据源到目标数据的地图。它也用来管理和监控本地和远程的 Capture 和 Apply 进程。从图3中可以看出复制中心图形界面对其他几个部分的支持关系。<br /><br /><br />　　图3：复制中心的应用<br /><br /><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz3.jpg" border="0" /></p><br />　
　在源数据服务器上运行的 Capture 程序可以获取 DB2 源数据表中的变化。DB2 的源数据服务器可以为 DB2 在 z/os,
os/390 上的版本 6，7和8，也可以是 iseries 在 os/400 V5R2，或 DB2 在 Windows, Unix
系统中的版本 8。当定义数据源的时候会自动生成相应的触发器 (Triggers)，可以用来捕获数据源的变化。要复制的数据可以在 Capture
进程中通过选择列来进行过滤。被捕获的更改信息首先存放到本地的源数据所在的数据库的表中并且当更改应用到目标数据中之后会自动删除。<br /><br />　
　当对源表进行改动时，DB2 把相关的记录写入日志。这些日志服务于数据库发现和复制。Capture
程序通过数据库自动连接并获取日志记录。每个源表都有相应的 CD (change data)
表来获取数据的变化。当定义一个复制数据源时，复制中心自动生成 CD 表。<br /><br />对于 Apply 部分，捕获的改变通过 Apply 程序应用到目标表中。Apply
程序可以在任何服务器上运行并且必须对所用到的源服务器和目标服务器都有连通性。数据可以通过列，行进行过滤，可以进行合并（例如通过视图），也可以在
Apply 过程中通过 SQL 表达式进行传送。DB2
与其他相关的数据间进行复制的时候，必须通过联合数据库系统来进行昵称的创建。在本地机器上需要安装关系型包装器和非关系型包装器。对于本例中
db2&lt;-&gt;ORACLE之间的复制，需要安装关系型包装器。见图4。<br /><br />　　图4：进行远程复制关系图<br /><p align="center"><img alt="" src="http://www.pconline.com.cn/pcjob/other/data/db2/0607/pic/eyrgkwz4.jpg" border="0" /></p><p><br /><br />　　报警监视器用来进行对Capture和Apply部分的错误监控。</p><br /><p><br /></p><p><br /></p><br /><img src ="http://www.blogjava.net/alex/aggbug/60409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-27 19:54 <a href="http://www.blogjava.net/alex/archive/2006/07/27/60409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]在Oracle里设置访问多个SQL Server</title><link>http://www.blogjava.net/alex/archive/2006/07/27/60408.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 27 Jul 2006 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/27/60408.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/60408.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/27/60408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/60408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/60408.html</trackback:ping><description><![CDATA[
		<span class="main">
				<span class="myp111">
						<font id="zoom">如何在Oracle里设置访问多个SQL Server数据库？假设我们要在ORACLE里同时能访问SQL Server里默认的pubs和Northwind两个数据库。 <br /><br /><b>1、
在安装了ORACLE9i Standard Edition或者ORACLE9i Enterprise
Edition的windows机器上(IP:192.168.0.2), 产品要选了透明网关(Oracle Transparent
Gateway)里访问Microsoft SQL Server数据库</b><br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>$ORACLE9I_HOME\tg4msql\admin下新写initpubs.ora和initnorthwind.ora配置文件.<br />initpubs.ora内容如下:<br />HS_FDS_CONNECT_INFO="SERVER=SQLSERVER_HOSTNMAE;DATABASE=pubs"<br />HS_DB_NAME=pubs<br />HS_FDS_TRACE_LEVEL=OFF<br />HS_FDS_RECOVERY_ACCOUNT=RECOVER<br />HS_FDS_RECOVERY_PWD=RECOVER<br />initnorthwind.ora内容如下:<br />HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=Northwind"<br />HS_DB_NAME=Northwind<br />HS_FDS_TRACE_LEVEL=OFF<br />HS_FDS_RECOVERY_ACCOUNT=RECOVER<br />HS_FDS_RECOVERY_PWD=RECOVER<br /><br />$ORACLE9I_HOME\network\admin 下listener.ora内容如下:<br />LISTENER =<br />  (DESCRIPTION_LIST =<br />   (DESCRIPTION =<br />    (ADDRESS_LIST =<br />    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />  )<br />  )<br />  )<br /><br />SID_LIST_LISTENER =<br />  (SID_LIST =<br />  (SID_DESC =<br />  (GLOBAL_DBNAME = test9)<br />  (ORACLE_HOME = d:\oracle\ora92)<br />  (SID_NAME = test9)<br /> )<br />  (SID_DESC=<br />  (SID_NAME=pubs)<br />  (ORACLE_HOME=d:\Oracle\Ora92) <br />  (PROGRAM=tg4msql)<br />  )<br />  (SID_DESC=<br />  (SID_NAME=northwind)<br />  (ORACLE_HOME=d:\Oracle\Ora92) <br /> (PROGRAM=tg4msql)<br />    )<br />  )</ccid_code></pre></td></tr></tbody></table><br /><br />重启动这台做gateway的windows机器上(IP:192.168.0.2)TNSListener服务. <br /><br />(凡是按此步骤新增可访问的SQL Server数据库时，TNSListener服务都要重启动) <br /><br /><b>2、ORACLE8I，ORACLE9I的服务器端配置tnsnames.ora, 添加下面的内容:</b><br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>pubs =<br />  (DESCRIPTION =<br />  (ADDRESS_LIST =<br />    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />    )<br />    (CONNECT_DATA =<br />    (SID = pubs)<br />    )<br />    (HS = pubs) <br />   )<br /><br />northwind =<br />  (DESCRIPTION =<br />  (ADDRESS_LIST =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />    )<br />    (CONNECT_DATA =<br />    (SID = northwind)<br />    )<br />    (HS = northwind) <br />   )   <br /> 保存tnsnames.ora后,在命令行下<br /> tnsping pubs<br /> tnsping northwind</ccid_code></pre></td></tr></tbody></table><br /><br />出现类似提示，即为成功 <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>Attempting to contact (DESCRIPTION = (ADDRESS_LIST = <br />(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)<br />(PORT = 1521))) (CONNECT_DATA = (SID = pubs)) (HS = pubs))<br />OK（20毫秒）<br />Attempting to contact (DESCRIPTION = (ADDRESS_LIST =<br /> (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)<br />(PORT = 1521))) (CONNECT_DATA = (SID = northwind)) (HS = northwind))<br />OK（20毫秒）</ccid_code></pre></td></tr></tbody></table><br /><br />设置数据库参数global_names=false。 <br /><br />设置global_names=false不要求建立的数据库链接和目的数据库的全局名称一致。global_names=true则要求, 多少有些不方便。 <br /><br />oracle9i和oracle8i都可以在DBA用户下用SQL命令改变global_names参数 <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>alter system set global_names=false;</ccid_code></pre></td></tr></tbody></table><br /><br />建立公有的数据库链接: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>create public database link pubs <br />connect to testuser identified by testuser_pwd using 'pubs';<br />create public database link northwind <br />connect to testuser identified by testuser_pwd using 'northwind';<br />(假设SQL Server下pubs和northwind已有足够权限的用户登陆testuser,<br />密码为testuser_pwd)</ccid_code></pre></td></tr></tbody></table><br /><br />访问SQL Server下数据库里的数据: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>select * from stores@pubs;<br />...... 	......<br />select * from region@northwind;<br />......  ......</ccid_code></pre></td></tr></tbody></table><br /><br /><b>3、使用时的注意事项</b><br /><br />ORACLE通过访问SQL Server的数据库链接时，用select * 的时候字段名是用双引号引起来的。 <br /><br />例如： <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>create table stores as select * from stores@pubs;<br />select zip from stores；<br />ERROR 位于第 1 行:<br />ORA-00904: 无效列名<br />select "zip" from stores;<br />zip<br />-----<br />98056<br />92789<br />96745<br />98014<br />90019<br />89076</ccid_code></pre></td></tr></tbody></table><br /><br />已选择6行。 <br /><br />用SQL Navigator或Toad看从SQL Server转移到ORACLE里的表的建表语句为: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>CREATE TABLE stores<br />    ("stor_id"                      CHAR(4) NOT NULL,<br />    "stor_name"                    VARCHAR2(40),<br />    "stor_address"                 VARCHAR2(40),<br />    "city"                         VARCHAR2(20),<br />    "state"                        CHAR(2),<br />    "zip"                          CHAR(5))<br />  PCTFREE     10<br />  PCTUSED     40<br />  INITRANS    1<br />  MAXTRANS    255<br />  TABLESPACE  users<br />  STORAGE   (<br />    INITIAL     131072<br />    NEXT        131072<br />    PCTINCREASE 0<br />    MINEXTENTS  1<br />    MAXEXTENTS  2147483645<br />  )<br />/</ccid_code></pre></td></tr></tbody></table><br /><br /><b>总结:</b><br /><br />WINDOWS下ORACLE9i网关服务器在$ORACLE9I_HOME\tg4msql\admin目录下的initsqlserver_databaseid.ora <br /><br />WINDOWS下ORACLE9i网关服务器listener.ora里面 <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code>(SID_DESC=<br />     		(SID_NAME=sqlserver_databaseid)<br />      		(ORACLE_HOME=d:\Oracle\Ora92) <br />      		(PROGRAM=tg4msql)<br />   	)<br />   	UNIX或WINDOWS下ORACLE8I,ORACLE9I服务器tnsnames.ora里面<br />	northwind =<br />	  (DESCRIPTION =<br />(ADDRESS_LIST =<br />	(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))<br />	    )<br />	(CONNECT_DATA =<br />	(SID = sqlserver_databaseid)<br />    		)<br />	(HS = sqlserver_databaseid) <br />   	   )</ccid_code></pre></td></tr></tbody></table><br /><br />sqlserver_databaseid一致才行.</font>
				</span>
		</span>
<img src ="http://www.blogjava.net/alex/aggbug/60408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2006-07-27 19:49 <a href="http://www.blogjava.net/alex/archive/2006/07/27/60408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]优化Oracle库表设计的若干方法</title><link>http://www.blogjava.net/alex/archive/2006/07/19/59052.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Wed, 19 Jul 2006 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2006/07/19/59052.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/59052.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2006/07/19/59052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/59052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/59052.html</trackback:ping><description><![CDATA[
		<p>key words: oracle优化 优化oracle  表设计优化 powerdesigner<br /><font class="f14" id="zoom"><strong></strong></font></p>
		<p>
				<font class="f14" id="zoom">
						<strong>
								<br />
						</strong>
				</font>
		</p>
		<p>
				<font class="f14" id="zoom">
						<strong>前言<br /><br /></strong>绝
大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的，只有少部分问题根植于Database Buffer、Share
Pool、Redo Log
Buffer等内存模块配置不合理，I/O争用，CPU争用等DBA职责范围上。所以除非是面对一个业已完成不可变更的系统，否则我们不应过多地将关注点
投向内存、I/O、CPU等性能调整项目上，而应关注数据库表本身的设计是否合理，库表设计的合理性才是程序性能的真正执牛耳者。<br /><br />合理的数据库设计需要考虑以下的方面：<br /><br />·业务数据以何种方式表达。如一个员工有多个Email，你可以在T_EMPLOYEE表中建立多个Email字段如email_1、email_2、 email_3，也可以创建一个T_EMAIL子表来存储，甚至可以用逗号分隔开多个Email地址存放在一个字段中。<br /><br />·数据以何种方式物理存储。如大表的分区，表空间的合理设计等。<br /><br />·如何建立合理的数据表索引。表索引几乎是提高数据表查询性能最有效的方法，Oracle拥有类型丰富的数据表索引类型，如何取舍选择显得特别重要。<br /><br />本
文我们将目光主要聚焦于数据表的索引上，同时也将提及其他两点的内容。通过对一个简单的库表设计实例的分析引出设计中的不足，并逐一改正。考虑到手工编写
库表的SQL脚本原始且低效，我们将用目前最流行的库表设计工具PowerDesigner
10来讲述表设计的过程，所以在本文中你还会了解到一些相关的PowerDesigner的使用技巧。<br /><br /><strong>一个简单的例子</strong><br /><br />某个开发人员着手设计一个订单的系统，这个系统中有两个主要的业务表，分别是订单基本信息表和订单条目表，这两张表具有主从关系的表，其中T_ORDER是订单主表，而T_ORDER_ITEM是订单条目表。数据库设计人员的设计成果如图 1所示：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 554px; height: 116px;" alt="合理设计优化Oracle库表设计的若干方法" src="http://www.51cto.com/files/uploadimg/20051031/1736190.gif" border="1" hspace="0" /><br /><br />图 1 订单主从表</div></td></tr></tbody></table><br /><br />ORDER_ID
是订单号，为T_ORDER的主键，通过名为SEQ_ORDER_ID的序列产生键值，而ITEM_ID是T_ORDER_ITEM表的主键，通过名为
SEQ_ORDER_ITEM的序列产生键值，T_ORDER_ITEM通过ORDER_ID外键关联到T_ORDER表。<br /><br />需求文档指出订单记录将通过以下两种方式来查询数据：<br /><br />·CLIENT + ORDER_DATE+IS_SHPPED：根据"客户＋订货日期+是否发货"条件查询订单及订单条目。<br /><br />·ORDER_DATE+IS_SHIPPED：根据"订货日期+是否发货"条件查询订单及订单条目。<br /><br />数
据库设计人员根据这个要求，在T_ORDER表的CLIENT、
ORDER_DATE及IS_SHPPED三字段上建立了一个复合索引IDX_ORDER_COMPOSITE；在T_ORDER_ITEM为外键
ORDER_ID建立IDX_ORDER_ITEM_ORDER_ID索引。<br /><br />让我们看一下该份设计的最终SQL脚本：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>/*订单表*/ <br /><br />create table T_ORDER (<br /><br />ORDER_ID NUMBER(10) not null, <br /><br />ADDRESS VARCHAR2(100), <br /><br />CLIENT VARCHAR2(60), <br /><br />ORDER_DATE CHAR(8), <br /><br />IS_SHIPPED CHAR(1), <br /><br />constraint PK_T_ORDER primary key (ORDER_ID)<br /><br />);<br /><br />create index IDX_CLIENT on T_ORDER (<br /><br />　CLIENT ASC, <br /><br />　ORDER_DATE ASC, <br /><br />　IS_SHIPPED ASC);<br /><br />/*订单条目子表*/<br /><br />create table T_ORDER_ITEM (<br /><br />　ITEM_ID NUMBER(10) not null,<br /><br />　ORDER_ID NUMBER(10), <br /><br />　ITEM VARCHAR2(20), <br /><br />　COUNT NUMBER(10), <br /><br />　constraint PK_T_ORDER_ITEM primary key (ITEM_ID)<br /><br />);<br /><br />create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM (<br /><br />　ORDER_ID ASC);<br /><br />　alter table T_ORDER_ITEM add constraint FK_T_ORDER__REFERENCE_T_ORDER foreign key (ORDER_ID) references T_ORDER (ORDER_ID);</td></tr></tbody></table></font>
				<font class="f14" id="zoom">
				</font>
		</p>
		<p>
				<font class="f14" id="zoom">
						<br />
						<br />我们承认在ER关系上，这份设计并不存在的缺陷，但却存在以下有待优化的地方：<br /><br />·没有将表数据和索引数据存储到不同的表空间中，而不加区别地将它们存储到同一表空间里。这样，不但会造成I/O竞争，也为数据库的维护工作带来不便。<br /><br />·ORACLE会自动为表的主键列创建一个普通B-Tree索引，但由于这两张表的主键值都通过序列提供，具有严格的顺序性（升序或降序），此时手工为其指定一个反键索引（reverse key index）将更加合理。<br /><br />·
在子表T_ORDER_ITEM外键列ORDER_ID上建立的IDX_ORDER_ITEM_ORDER_ID的普通B-Tree索引非常适合设置为压
缩型索引，即建立一个压缩型的B-Tree索引。因为一份订单会对应多个订单条目，这就意味着T_ORDER_ITEM表存在许多同值的
ORDER_ID列值，通过将其索引指定为压缩型的B-Tree索引，不但可以减少IDX_ORDER_ITEM_ORDER_ID所需的存储空间，还将
提高表操作的性能。<br /><br />·企图仅通过建立一个包含3字段IDX_ORDER_COMPOSITE复合索引满足如前所述的两种查询条件方式的索引是有问题的，事实上使用ORDER_DATE+IS_SHIPPED复合条件的查询将利用不到IDX_ORDER_COMPOSITE索引。 </font>
		</p>
		<p>
				<!--StartFragment -->
				<font class="f14" id="zoom"> <font class="f14" id="zoom"><strong>优化设计<br /><br /></strong>1、将表数据和索引数据分开表空间存储<br /><br />1.1 表数据和索引为何需要使用独立的表空间<br /><br />Oracle
强烈建立，任何一个应用程序的库表至少需要创建两个表空间，其中之一用于存储表数据，而另一个用于存储表索引数据。因为如果将表数据和索引数据放在一起，
表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争，降低系统的响应效率。将表数据和索引数据存放在不同的表空间中（如一个为
APP_DATA，另一个为APP_IDX），并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上，就可以避免这种竞争了。<br /><br />拥有独立的表空间，就意味着可以独立地为表数据和索引数据提供独立的物理存储参数，而不会发生相互影响，毕竟表数据和索引数据拥有不同的特性，而这些特性又直接影响了物理存储参数的设定。<br /><br />此外，表数据和索引数据独立存储，还会带来数据管理和维护上的方面。如你在迁移一个业务数据库时，为了降低数据大小，可以只迁出表数据的表空间，在目标数据库中通过重建索引的方式就可以生成索引数据了。<br /><br />1.2 表数据和索引使用不同表空间的SQL语法<br /><br />指定表数据及索引数据存储表空间语句最简单的形式如下。<br /><br />将表数据存储在APP_DATA表空间里：<br /><br />create table T_ORDER ( ORDER_ID NUMBER(10) not null, …)tablespace APP_DATA;<br /><br />将索引数据存储在APP_IDX表空间里：<br /><br />create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM ( ORDER_ID ASC)tablespace APP_IDX;<br /><br />1.3 PowerDesigner中如何操作<br /><br />1) 首先，必须创建两个表空间。通过Model-&gt;Tablespace...在List of Tablespaces中创建两个表空间：<br /><br /></font></font>
		</p>
		<table align="center" border="0" width="90%">
				<tbody>
						<tr>
								<td>
										<div align="center">
												<img style="width: 518px; height: 335px;" alt="合理设计优化Oracle库表设计的若干方法(2)" src="http://www.51cto.com/files/uploadimg/20051031/1736191.jpg" border="1" hspace="0" />
												<br />
												<br />图 2 创建表空间</div>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font class="f14" id="zoom">
						<font class="f14" id="zoom">
								<br />
								<br />2) 为每张表指定表数据存储的表空间。在设计区中双击表，打开Table Properties设计窗口，切换到options 页，按图 3所示指定表数据的存储表空间。<br /><br /></font>
				</font>
		</p>
		<table align="center" border="0" width="90%">
				<tbody>
						<tr>
								<td>
										<div align="center">
												<img style="width: 554px; height: 338px;" alt="合理设计优化Oracle库表设计的若干方法(2)" src="http://www.51cto.com/files/uploadimg/20051031/1736192.jpg" border="1" hspace="0" />
												<br />
												<br />图 3 指定表数据的存储表空间</div>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font class="f14" id="zoom">
						<font class="f14" id="zoom">
								<br />
								<br />3) 为每个索引指定索引数据的存储表空间。在Table Properties中切换到Indexes页，在这里列出了表的所有索引，双击需设置表空间的索引，在弹出的Index Properties窗口中切换到Options页，按如下方式指定索引的存储表空间。</font>
				</font>
		</p>
		<p>
				<br />
		</p>
		<p>
				<span class="top11">
						<br />
						<table align="center" border="0" width="90%">
								<tbody>
										<tr>
												<td>
														<div align="center">
																<img style="width: 498px; height: 382px;" alt="合理设计优化Oracle库表设计的若干方法(2)" src="http://www.51cto.com/files/uploadimg/20051031/1736193.jpg" border="1" hspace="0" />
																<br />
																<br />图 4 指定索引数据的存储表空间</div>
												</td>
										</tr>
								</tbody>
						</table>
						<p>
								<br />
								<br />将表空间的问题延展一下：一个应用系统库表的表空间可以进行更精细的划分。<br /><br />首先，如果表中存在LOB类型的字段，有为其指定一个特定的表空间，因为LOB类型的数据在物理存储结构的管理上和一般数据的策略有很大的不同，将其放在一个独立的表空间中，就可方便地设置其物理存储参数了。<br /><br />其
次，需要考虑库表数据的DML操作特性：根据DML（INSERT,UPDATE,DELETE）操作频繁程度，将几乎不发生任何DML操作的数据放在独
立的表空间中，因为极少DML操作的表可设置符合其特性的物理参数：如PCTFREE可置为0，其BUFFER_POOL指定为KEEP，以便将数据缓存
在KEEP数据缓存区中等等，不一而足。<br /><br />此外，还可以考虑按业务需要将不同的业务模块分开存放，这主要是考虑到备份问题。假设我们有一部分业务数据重要性很强，而其他的业务数据重要性相对较弱，这样就可以将两者分开存储，以便设置不同的备份策略。 <br /><br />当然，无节制的细化表空间也将带来管理上和部署上的复杂，根据业务需求合理地规划表空间以达到管理和性能上的最佳往往需要更多的权衡。</p>
						<p>
								<!--StartFragment --> <font class="f14" id="zoom">2、显式为主键列建立反向键索引<br /><br />2.1 反向键索引的原理和用途<br /><br />我
们知道Oracle会自动为表的主键列建立索引，这个默认的索引是普通的B-Tree索引。对于主键值是按顺序(递增或递减)加入的情况，默认的B-
Tree索引并不理想。这是因为如果索引列的值具有严格顺序时，随着数据行的插入，索引树的层级增长很快。搜索索引发生的I/O读写次数和索引树的层级数
成正比，也就是说，一棵具有5个层级的B-Tree索引，在最终读取到索引数据时最多可能发生多达5次I/O操作。因而，减少索引的层级数是索引性能调整
的一个重要方法。<br /><br />如果索引列的数据以严格的有序的方式插入，那么B-Tree索引树将变成一棵不对称的"歪树"，如图 5所示：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 212px; height: 209px;" alt="合理设计优化Oracle库表设计的若干方法(3)" src="http://www.51cto.com/files/uploadimg/20051031/1736194.gif" border="1" hspace="0" /><br /><br />图 5不对称的B-Tree索引</div></td></tr></tbody></table><br /><br />而如果索引列的数据以随机值的方式插入，我们将得到一棵趋向对称的索引树，如图 6所示：<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 201px; height: 119px;" alt="合理设计优化Oracle库表设计的若干方法(3)" src="http://www.51cto.com/files/uploadimg/20051031/1736195.gif" border="1" hspace="0" /><br /><br />图 6对称的B-Tree索引 </div></td></tr></tbody></table><br /><br />比较图 5和图 6，在图 5中搜索到A块需要进行5次I/O操作，而图 6仅需要3次I/O操作。<br /><br />既
然索引列数据从序列中获取，其有序性无法规避，但在建立索引时，Oracle允许对索引列的值进行反向，即预先对列值进行比特位的反向，如
1000,10001,10011,10111,1100经过反向后的值将是0001,1001,1101,0011。显然经过位反向处理的有序数据变得
比较随机了，这样所得到的索引树就比较对称，从而提高表的查询性能。<br /><br />但反向键索引也有它局限性：如果在WHERE语句中，需要对索引列的
值进行范围性的搜索，如BETWEEN、&lt;、&gt;等，其反向键索引无法使用，此时，Oracle将执行全表扫描；只有对反向键索引列进行
&lt;&gt; 和 = 的比较操作时，其反向键索引才会得到使用。<br /><br />2.2 反向键索引的SQL语句<br /><br />回到我们上面的例子，由于T_ORDER和T_ORDER_ITEM的主键值来源于序列，主键值是有严格顺序的，所以我们应该摒弃默认的Oracle所提供的索引，而采取显式为主键指定一个反向键索引的方式。<br /><br />ORDER_ID为T_ORDER表的主键，主键名为PK_ORDER，我们为ORDER_ID列上建立一个反向键索引IDX_ORDER_ID，并使PK_ORDER_ID使用这个索引，其SQL语句如下：<br /><br /><table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"><tbody><tr><td>create table T_ORDER ( <br /><br />　ORDER_ID NUMBER(10) not null,<br /><br />　CLIENT VARCHAR2(60), <br /><br />　ADDRESS VARCHAR2(100),<br /><br />　ORDER_DATE CHAR(8));<br /><br />create
unique index IDX_ORDER_ID on T_ORDER ( ORDER_ID ASC) reverse;alter
table T_ORDER add constraint PK_ORDER primary key (ORDER_ID) using
index IDX_ORDER_ID;</td></tr></tbody></table><br /><br />要保证创建IDX_ORDER_ID的SQL语句在创建PK_ORDER主键的SQL语句之前，因为主键需要引用到这个反向键索引。<br /><br />由于主键列的数据是唯一的，所以为IDX_ORDER_ID加上unique限定，使其成为唯一型的索引。<br /><br />2.3 PowerdDesigner如何操作<br /><br />1)
首先，需要为ORDER_ID列建立一个反向键索引。打开T_ORDER的Table
Properties的窗口，切换到Indexes页，新建一个名为IDX_ORDER_ID的索引。填写完索引的名称后，双击这个索引，弹出Index
Properties窗口，在这个窗口的Columns中选择ORDER_ID列。然后，切换到Options页，按图 7的方式将其设置为反向键索引。<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 546px; height: 428px;" alt="合理设计优化Oracle库表设计的若干方法(3)" src="http://www.51cto.com/files/uploadimg/20051031/1736196.jpg" border="1" hspace="0" /><br /><br />图 7 设置反向键索引</div><div align="center"> </div></td></tr></tbody></table></font></p>
						<!--StartFragment -->
2) 显式指定主键PK_ORDER使用这个索引。在Table
Properties窗口中切换到Keys页，默认情况下，PowerDesigner为T_ORDER所指定的主键名为Key1，我们将其更名为
PK_ORDER，双击这个主键，弹出Key Properties窗口，切换到Options页，按图
8的方式为PK_ORDER指定IDX_ORDER_ID。<br /><br /><table align="center" border="0" width="90%"><tbody><tr><td><div align="center"><img style="width: 505px; height: 381px;" alt="合理设计优化Oracle库表设计的若干方法(4)" src="http://www.51cto.com/files/uploadimg/20051031/1736197.jpg" border="1" hspace="0" /><br /><br />图 8 为主键指定特定的索引</div></td></tr></tbody></table><br /><br />不可否认PowerDesigner确实是目前业界最强