﻿<?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-liuquanqi</title><link>http://www.blogjava.net/liuquanqi/</link><description>java</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 12:27:51 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 12:27:51 GMT</pubDate><ttl>60</ttl><item><title>各种数据库如何读取前N条记录 </title><link>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181348.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Fri, 22 Feb 2008 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181348.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/181348.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/181348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/181348.html</trackback:ping><description><![CDATA[<p>各种数据库如何读取前N条记录 <br />
1. ORACLE <br />
Select * FROM TABLE1 Where ROWNUM&lt;=N </p>
<p>2. INFORMIX <br />
Select FIRST N * FROM TABLE1 where 1=1 </p>
<p>3. MYSQL <br />
Select * FROM TABLE1 where 1=1 LIMIT N <br />
(以上三种是俺工作中用到的数据库)</p>
<p>4. DB2 <br />
Select * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM Where ROWNUM&lt;=N <br />
或者<br />
Select COLUMN FROM TABLE where 1=1 FETCH FIRST N ROWS ONLY </p>
<p>5. SQL SERVER <br />
Select TOP N * FROM TABLE1 where 1=1 <br />
or<br />
SET ROWCOUNT N Select * FROM TABLE1 where 1=1 SET ROWCOUNT N1</p>
<p>6. SYBASE <br />
SET ROWCOUNT N Select * FROM TABLE1 where 1=1 SET ROWCOUNT N1</p>
<p><br />
7. FOXPRO <br />
Select * TOP N FROM TABLE orDER BY COLUMN</p>
<p>8. ACCESS <br />
Select TOP N * FROM TABLE1 where 1=1<br />
</p>
  <img src ="http://www.blogjava.net/liuquanqi/aggbug/181348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2008-02-22 11:54 <a href="http://www.blogjava.net/liuquanqi/archive/2008/02/22/181348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2数据库导出表结构与导入、导出表数据 </title><link>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181345.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Fri, 22 Feb 2008 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181345.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/181345.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181345.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/181345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/181345.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">方法一</span></p>
<p><span style="font-family: 宋体">在控制中心的对象视图窗口中，选择所要导出表结构的数据表，按住</span>Ctrl<span style="font-family: 宋体">或</span>Shift<span style="font-family: 宋体">可多选，单击鼠标右键，选择－</span>&gt;<span style="font-family: 宋体">生成</span>DDL<span style="font-family: 宋体">即可。</span></p>
<p><span style="font-family: 宋体">方法二</span></p>
<p><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">第一步：打开</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'">DB2</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">的命令行工具，在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'">DB2</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">安装目录的</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'">BIN</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">文件夹下新建一个文件夹</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'">data</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">，并且进入该目录。</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'"><br />
</span><span style="font-size: 8.5pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'"><br />
</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">创建该目录：</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'"> mkdir data<br />
</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">进入该目录：</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'"> cd data<br />
</span><span style="font-size: 8.5pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'">|</span></p>
<p><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">第二步：导出表结构，命令行如下：</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'"><br />
db2look -d dbname -e -a -x -i username -w password -o ddlfile.sql<br />
</span><span style="font-size: 9pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'"><br />
<br />
</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">执行成功之后，你会在刚才新建的文件夹下找到该</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'">sql</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">文件。</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Verdana','sans-serif'"><br />
<br />
</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">第三步：</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">导出数据，命令行如下：</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 'Arial','sans-serif'"><br />
db2move databasename export -u username -p password<br />
</span><span style="font-size: 9pt; color: #4b4b4b; font-family: 'Arial','sans-serif'"><br />
</span></p>
<p><span style="font-size: 8.5pt; color: #4b4b4b; font-family: 宋体">至此，导出数据结束。</span></p>
<p>2<span style="font-family: 宋体">导出表中数据</span></p>
<p>export to [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.ixf)] of ixf select [<span style="font-family: 宋体">字段</span>(<span style="font-family: 宋体">例</span>: * or col1,col2,col3)] from TABLE1;</p>
<p>export to [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.del)] of del select [<span style="font-family: 宋体">字段</span>(<span style="font-family: 宋体">例</span>: * or col1,col2,col3)] from TABLE1;</p>
<p><span style="font-family: 宋体">导入表的数据</span></p>
<p>import from [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.ixf)] of ixf insert into TABLE1;</p>
<p>load from [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.ixf)] of ixf insert into TABLE1;</p>
<p>load from [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.ixf)] of ixf replace into TABLE1; // <span style="font-family: 宋体">装入数据前，先删除已存在记录</span></p>
<p>load from [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.ixf)] of ixf restart into TABLE1; // <span style="font-family: 宋体">当装入失败时，重新执行，并记录导出结果和错误信息</span></p>
<p>import from [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.ixf)] of ixf savecount 1000 messages [path(<span style="font-family: 宋体">例</span>:D:"msg.txt)] insert into TABLE1;// <span style="font-family: 宋体">其中，</span>savecount<span style="font-family: 宋体">表示完成每</span>1000<span style="font-family: 宋体">条操作，记录一次</span>.</p>
<p><span style="font-family: 宋体">存在自增长字段的数据导入：</span></p>
<p>load from [path(<span style="font-family: 宋体">例</span>:D:"TABLE1.ixf)] of ixf modified by identityignore insert into TABLE1;// <span style="font-family: 宋体">加入</span>modified by identityignore.</p>
<p><span style="font-family: 宋体">解除装入数据时，发生的检查挂起</span>.</p>
<p>SET INTEGRITY FOR&nbsp;TABLE1 CHECK IMMEDIATE UNCHECKED;</p>
<p><span style="font-family: 宋体">命令只对数据通过约束检查的表有效，如果执行还不能解除，有必要检查数据的完整性，是否不符合约束条件，并试图重新整理数据，再执行装入操作</span>.</p>
<p><span style="font-family: 宋体">另外，对</span>load<span style="font-family: 宋体">和</span>import<span style="font-family: 宋体">，字面上的区别是</span>:<span style="font-family: 宋体">装入和导入，但仍未理解两者之间的区别</span>.</p>
<p><span style="font-family: 宋体">只是性能上</span>load<span style="font-family: 宋体">显然优于</span>import.<span style="font-family: 宋体">（</span>load <span style="font-family: 宋体">需要更多的权限）</span></p>
 <img src ="http://www.blogjava.net/liuquanqi/aggbug/181345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2008-02-22 11:53 <a href="http://www.blogjava.net/liuquanqi/archive/2008/02/22/181345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux下创建CVS用户：</title><link>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181338.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Fri, 22 Feb 2008 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181338.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/181338.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/181338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/181338.html</trackback:ping><description><![CDATA[<p><br />
在Linux下创建CVS用户：<br />
1、<br />
cd /home/cvsroot&nbsp; 进入cvs根目录<br />
ls</p>
<p>2、<br />
perl passwdgen.pl "密码"&nbsp; 创建密码并生成加密文件</p>
<p>3、<br />
vi cvsRoot/passwd&nbsp;&nbsp; 打开文件</p>
<p>4、<br />
name:第2步生成的密码:cvsroot</p>
<p>5、<br />
:s&nbsp; 保存</p>
<img src ="http://www.blogjava.net/liuquanqi/aggbug/181338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2008-02-22 11:42 <a href="http://www.blogjava.net/liuquanqi/archive/2008/02/22/181338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将.class文件打成Jar包</title><link>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181337.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Fri, 22 Feb 2008 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181337.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/181337.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/181337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/181337.html</trackback:ping><description><![CDATA[在命令行中进入.class文件所在的文件夹下，<br />
输入 &nbsp;jar cvf 名称.jar *.*&nbsp; 回车即可。
<img src ="http://www.blogjava.net/liuquanqi/aggbug/181337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2008-02-22 11:41 <a href="http://www.blogjava.net/liuquanqi/archive/2008/02/22/181337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>环境变量的配置</title><link>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181336.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Fri, 22 Feb 2008 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181336.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/181336.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/181336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/181336.html</trackback:ping><description><![CDATA[<p>1. (新建)JAVA_HOME:<br />
变量名：JAVA_HOME<br />
变量值：C:\Program Files\Java\jdk1.5.0_05<br />
</p>
<p><br />
2. (新建)CLASSPATH:<br />
变量名：CLASS_PATH<br />
变量值：.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(注意：点号不能省略，表示当前目录)<br />
<br />
3. 编辑PATH的变量值，在后面加上 ;%JAVA_HOME%\bin （注意：要有分号隔开）<br />
变量名：Path<br />
变量值：;%JAVA_HOME%\bin;%TOMCAT_HOME%\bin</p>
<p>变量名：TOMCAT_HOME<br />
变量值：D:\Tomcat 5.5</p>
<br />
完成后用命令简单测试一下: java -version <br />
<img src ="http://www.blogjava.net/liuquanqi/aggbug/181336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2008-02-22 11:35 <a href="http://www.blogjava.net/liuquanqi/archive/2008/02/22/181336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse性能提升</title><link>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181334.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Fri, 22 Feb 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181334.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/181334.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2008/02/22/181334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/181334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/181334.html</trackback:ping><description><![CDATA[<p>1. 加大JVM的非堆内存，<br />
在eclipse的目录下打开eclipse.ini，如果其中没有以下代码，将下列代码加入即可。<br />
-vmargs<br />
-Xms128M<br />
-Xmx512M<br />
-XX:PermSize=64M<br />
-XX:MaxPermSize=128M</p>
<p>2. 去除不需要加载的模块<br />
一个系统20%的功能往往能够满足80%的需求，MyEclipse也不例外，我们在大多数时候只需要20%的系统功能，所以可以将一些不使用的模块禁止加载启动。通过Windows - Preferences打开配置窗口，依次选择左侧的General - Startup and Shutdown，这个时候在右侧就显示出了Eclipse启动时加载的模块，可以根据自己的实际情况去除一些模块。</p>
<p>3. 取消MyEclipse在启动时自动验证项目配置文件<br />
默认情况下MyEclipse在启动的时候会自动验证每个项目的配置文件，这是一个非常耗时的过程，可以在Preferences窗口依次选择MyEclipse - Validation，然后在右侧的Validator列表中只保留 Manual 项就可以了。如果需要验证的时候只需要选中文件，然后右键选择 MyEclipse - Run Validation就可以了。</p>
<img src ="http://www.blogjava.net/liuquanqi/aggbug/181334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2008-02-22 11:33 <a href="http://www.blogjava.net/liuquanqi/archive/2008/02/22/181334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的一级缓存和二级缓存</title><link>http://www.blogjava.net/liuquanqi/archive/2008/01/24/177590.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Thu, 24 Jan 2008 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2008/01/24/177590.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/177590.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2008/01/24/177590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/177590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/177590.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;缓存是介于应用程序和物理数据源之间，其作用是为了降低应用程序对物理数据源访问的频次，从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制，应用程序在运行时从缓存读写数据，在特定的时刻或事件会同步缓存和物理数据源的数据。 <br />
<br />
　　缓存的介质一般是内存，所以读写速度很快。但如果缓存中存放的数据量非常大时，也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质，还要考虑到管理缓存的并发访问和缓存数据的生命周期。<br />
<br />
　　Hibernate的缓存包括Session的缓存和SessionFactory的缓存，其中SessionFactory的缓存又可以分为两类：内置缓存和外置缓存。Session的缓存是内置的，不能被卸载，也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似，前者是SessionFactory对象的一些集合属性包含的数据，后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句，映射元数据是映射文件中数据的拷贝，而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来，SessionFactory的内置缓存是只读的，应用程序不能修改缓存中的映射元数据和预定义SQL语句，因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下，SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝，外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。<br />
<br />
　　Hibernate的这两级缓存都位于持久化层，存放的都是数据库数据的拷贝，那么它们之间的区别是什么呢？为了理解二者的区别，需要深入理解持久化层的缓存的两个特性：缓存的范围和缓存的并发访问策略。<br />
<br />
　　持久化层的缓存的范围<br />
<br />
　　缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三类。<br />
<br />
　　1 事务范围：缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期，当事务结束时，缓存也就结束生命周期。在此范围下，缓存的介质是内存。事务可以是数据库事务或者应用事务，每个事务都有独自的缓存，缓存内的数据通常采用相互关联的的对象形式。<br />
<br />
　　2 进程范围：缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存，因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期，进程结束时，缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据，所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据，但是对象分解为松散的算法比对象序列化的算法要求更快。<br />
<br />
　　3 集群范围：在集群环境中，缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点，进程间通过远程通信来保证缓存中的数据的一致性，缓存中的数据通常采用对象的松散数据形式。<br />
<br />
　　对大多数应用来说，应该慎重地考虑是否需要使用集群范围的缓存，因为访问的速度不一定会比直接访问数据库数据的速度快多少。<br />
<br />
　　持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据，还可以到进程范围或集群范围的缓存内查询，如果还是没有查到，那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存，通常它是必需的；进程范围或集群范围的缓存是持久化层的第二级缓存，通常是可选的。<br />
<br />
　　持久化层的缓存的并发访问策略<br />
<br />
　　当多个并发的事务同时访问持久化层的缓存的相同数据时，会引起并发问题，必须采用必要的事务隔离措施。<br />
<br />
　　在进程范围或集群范围的缓存，即第二级缓存，会出现并发问题。因此可以设定以下四种类型的并发访问策略，每一种策略对应一种事务隔离级别。<br />
<br />
　　事务型：仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读和不可重复读这类的并发问题。<br />
<br />
　　读写型：提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读这类的并发问题。<br />
<br />
　　非严格读写型：不保证缓存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能，必须为该数据配置一个很短的数据过期时间，从而尽量避免脏读。对于极少被修改，并且允许偶尔脏读的数据，可以采用这种并发访问策略。 　　只读型：对于从来不会修改的数据，如参考数据，可以使用这种并发访问策略。<br />
<br />
　　事务型并发访问策略是事务隔离级别最高，只读型的隔离级别最低。事务隔离级别越高，并发性能就越低。<br />
<br />
　　什么样的数据适合存放到第二级缓存中？<br />
<br />
　　1、很少被修改的数据 <br />
<br />
　　2、不是很重要的数据，允许出现偶尔并发的数据<br />
<br />
　　3、不会被并发访问的数据<br />
<br />
　　4、参考数据<br />
<br />
　　不适合存放到第二级缓存的数据？<br />
<br />
　　1、经常被修改的数据<br />
<br />
　　2、财务数据，绝对不允许出现并发<br />
<br />
　　3、与其他应用共享的数据。<br />
<br />
　　Hibernate的二级缓存<br />
<br />
　　如前所述，Hibernate提供了两级缓存，第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务，因此它的缓存是事务范围的缓存。第一级缓存是必需的，不允许而且事实上也无法比卸除。在第一级缓存中，持久化类的每个实例都具有唯一的OID。<br />
<br />
　　第二级缓存是一个可插拔的的缓存插件，它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应，因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题，因此需要采用适当的并发访问策略，该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的，可以在每个类或每个集合的粒度上配置第二级缓存。<br />
<br />
　　Hibernate的二级缓存策略的一般过程如下：<br />
<br />
　　1) 条件查询的时候，总是发出一条select * from table_name where &#8230;. （选择所有字段）这样的SQL语句查询数据库，一次获得所有的数据对象。 <br />
<br />
　　2) 把获得的所有数据对象根据ID放入到第二级缓存中。 <br />
<br />
　　3) 当Hibernate根据ID访问数据对象的时候，首先从Session一级缓存中查；查不到，如果配置了二级缓存，那么从二级缓存中查；查不到，再查询数据库，把结果按照ID放入到缓存。 <br />
<br />
　　4) 删除、更新、增加数据的时候，同时更新缓存。<br />
<br />
　　Hibernate的二级缓存策略，是针对于ID查询的缓存策略，对于条件查询则毫无作用。为此，Hibernate提供了针对条件查询的Query缓存。<br />
<br />
　　Hibernate的Query缓存策略的过程如下： <br />
<br />
　　1) Hibernate首先根据这些信息组成一个Query Key，Query Key包括条件查询的请求一般信息：SQL, SQL需要的参数，记录范围（起始位置rowStart，最大记录个数maxRows)，等。 <br />
<br />
　　2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在，那么返回这个结果列表；如果不存在，查询数据库，获取结果列表，把整个结果列表根据Query Key放入到Query缓存中。 <br />
<br />
　　3) Query Key中的SQL涉及到一些表名，如果这些表的任何数据发生修改、删除、增加等操作，这些相关的Query Key都要从缓存中清空。<br />
<img src ="http://www.blogjava.net/liuquanqi/aggbug/177590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2008-01-24 22:19 <a href="http://www.blogjava.net/liuquanqi/archive/2008/01/24/177590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts-config.xml拆分问题</title><link>http://www.blogjava.net/liuquanqi/archive/2007/06/01/121323.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Fri, 01 Jun 2007 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2007/06/01/121323.html</guid><description><![CDATA[有两种方法,一种是直接在web.xml中定义&nbsp;&nbsp;&nbsp;<br>一种方法：&nbsp; <br>&lt;param-name&gt;config&lt;/param-name&gt; &nbsp; <br>&nbsp; &lt;param-value&gt;/ &nbsp; <br>&nbsp; WEB-INF/struts-config.xml,/WEB-INF/struts-one.xml,/WEB-INF/struts-two.xml &nbsp; <br>&nbsp; &lt;/param-value&gt;&nbsp;&nbsp;&nbsp;<br>另一种方法：&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-name&gt;config&lt;/param-name&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-value&gt;/WEB-INF/conf/struts-default.xml&lt;/param-value&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/init-param&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;init-param&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-name&gt;config/module1&lt;/param-name&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-value&gt;/WEB-INF/conf/struts-module1.xml&lt;/param-value&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/init-param&gt; &nbsp; <br>&nbsp; 后一种方法我觉得多用于分模块，前一种方法直接简便！&nbsp;&nbsp; <br>
<img src ="http://www.blogjava.net/liuquanqi/aggbug/121323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2007-06-01 11:11 <a href="http://www.blogjava.net/liuquanqi/archive/2007/06/01/121323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork 中文乱码问题 表单字段验证 标签的用法</title><link>http://www.blogjava.net/liuquanqi/archive/2007/03/19/104692.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Mon, 19 Mar 2007 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2007/03/19/104692.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/104692.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2007/03/19/104692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/104692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/104692.html</trackback:ping><description><![CDATA[1.<font color="#ff0000">WebWork中文问题解决</font>: <br />a)在webwork.properties文件中，添加： <br />webwork.i18n.encoding = UTF-8 <br />它主要是用来设置WebWork UI标签库的编码， <br />要保持你的页面和编码与你在encoding设置的一致,否则重复编码出现乱码. <br />如果不设置它将通过System.getProperty("file.encoding"来获取默认字符编码。<br /> <br />PS:2.1.6版本中存在BUG，不能够使用定义的encoding. <br /><br />b)写一个Filter，将编码设置为UTF-8。 <br />例如SetCharacterEncodingFilter。它解决Action数据传递时的编码,但是不能解决属性在Action或是Model赋值的编码. <br />c)velocity.properties文件中，添加： <br />input.encoding=UTF-8 <br />output.encoding=UTF-8 <br />default.contentType=text/html; charset=UTF-8 <br />它是用来设置.vm页面的编码方式. <br /><br />d)使用freemarker作为view层,可以再web.xml中指定字符属性;<br /><br />&lt;servlet&gt;<br />        &lt;servlet-name&gt;freemarker&lt;/servlet-name&gt;<br />        &lt;servlet-class&gt;com.opensymphony.webwork.views.freemarker.FreemarkerServlet&lt;/servlet-class&gt;<br />        &lt;!-- FreemarkerServlet settings: --&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;TemplatePath&lt;/param-name&gt;<br />            &lt;param-value&gt;/templates/&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;NoCache&lt;/param-name&gt;<br />            &lt;param-value&gt;true&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;ContentType&lt;/param-name&gt;<br />            &lt;param-value&gt;text/html&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />       &lt;!--        指定编码         --&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;default_encoding&lt;/param-name&gt;<br />            &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br /><br />        &lt;init-param&gt;<br />            &lt;param-name&gt;number_format&lt;/param-name&gt;<br />            &lt;param-value&gt;0.##########&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />    &lt;/servlet&gt;<br /><br />2.<font color="#ff0000">WebWork表单字段验证</font>: <br />a)Action必须继承ActionSurport; <br />b)在xwork.xml文件必须定义 <br />&lt;action name="hello" class="test.HelloAction"&gt; <br />   &lt;result name="success"&gt;/result.jsp&lt;/result&gt;    <br />   &lt;result name="input"&gt; <br />        &lt;param value="/location"&gt;/index.jsp&lt;/param&gt; <br />   &lt;/result&gt;   <br />   &lt;interceptor-ref name="validationWorkflowStack"/&gt; <br />&lt;/action&gt; <br />其中<font color="#ff0000">input 是必须定义的，另外要使用 <br />&lt;param value="location"&gt;/index.jsp&lt;/param&gt; <br />才可以在验证错误后回到输入页面。</font> <br />c)<font color="#ff0000">在Action类名-validation.xml文件必须与Action类在同一目录下</font>, <br />d)定义的&lt;message/&gt;元素,当提示消息为中文时候必须在文件头定义: <br />&lt;?xml version="1.0" encoding="GBK"?&gt; <br /><br />3.<font color="#ff0000">WebWork的标签的用法</font>: <br />a)需要提交的表单项<font color="#ff0000">name属性值均为常量，因此均以单引号包围</font>，以与Model中的变量相匹配,<br /><br />&lt;ww:form namespace="'/test'" action="'ftltest'" method="'POST'"&gt;<br />               &lt;ww:textfield name="'msg'" label="消息"&gt;&lt;/ww:textfield&gt;<br />               &lt;ww:submit value="/提交" /&gt;<br />    &lt;/ww:form&gt;<br />b)&lt;ww:radio/&gt;和&lt;ww:select/&gt;标签中的list的属性可以使用Map类型,以key和value对应listKey,listValue属性.<br /><br />第一种写法:<br /><br />&lt;ww:select label="'Months'" <br />        name="'months'" <br />            list="#{'01':'Jan', '02':'Feb', []}" <br />        value="/01"<br />        required="true" <br />/&gt;<br /><br />第二种写法:<br /><br />&lt;ww:select label="'Pets'" <br />        name="'petIds'" <br />        list="petDao.pets" <br />        listKey="id" <br />        listValue="name" <br />        multiple="true" <br />        size="3" <br />        required="true" <br />/&gt;<br /><br />&lt;!--petDao.pets为普通对象,使用其id为KEY,name为value--&gt;<br />&lt;!--如果petDao.pets为Map类型,则可省略listKey和listValue属性--&gt;<br /><br />c)WebWork2中的UI标签的模板定制,可以在webwork.properties文件中指定相关属性,并且定制模板文件;<br /><br />webwork.ui.theme=xhtml     //可用的theme还有simple;<br />webwork.ui.templateDir=template    //模板路径;<br />#sets the default template type. Either vm or jsp<br />webwork.ui.templateSuffix=vm   //模板类型,还支持JSP模板,开发可以使用FreeMarker定制模板;<br /><br /><br />4.WebWork的国际化使用: <br />a)&lt;ww:i18 name="'message'"&gt; <br />        &lt;ww:text name="'key'"/&gt; <br />  &lt;/ww:i18&gt; <br />使用message_zh_CN.properties中包含key=****; <br /><br />b)在Action中的getText()方法资源来自Action的类名.properties<br /><br />c)在Action中可以使用getTexts()获得具体的ResourceBundle;<br /><br />d)在view层一样可以使用getText()方法;<br /><br /><br />        &lt;ww:i18n name="'messages'"&gt;<br />            &lt;!--在messages.properties文件中有key-&gt;index_msg--&gt;        <br />                &lt;ww property value="getText('index_msg')"/&gt;<br />        &lt;/ww:i18n&gt; <img src ="http://www.blogjava.net/liuquanqi/aggbug/104692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2007-03-19 11:18 <a href="http://www.blogjava.net/liuquanqi/archive/2007/03/19/104692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>身份证验证</title><link>http://www.blogjava.net/liuquanqi/archive/2007/03/19/104689.html</link><dc:creator>☆℡齐</dc:creator><author>☆℡齐</author><pubDate>Mon, 19 Mar 2007 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/liuquanqi/archive/2007/03/19/104689.html</guid><wfw:comment>http://www.blogjava.net/liuquanqi/comments/104689.html</wfw:comment><comments>http://www.blogjava.net/liuquanqi/archive/2007/03/19/104689.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/liuquanqi/comments/commentRss/104689.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuquanqi/services/trackbacks/104689.html</trackback:ping><description><![CDATA[
		<p>/**<br /> 身份证<br /> **/</p>
		<p>function checkIdcard(idcard){<br />var Errors=new Array(<br />"true",<br />"身份证号码位数不对!",<br />"身份证号码出生日期超出范围或含有非法字符!",<br />"身份证号码校验错误!",<br />"身份证地区非法!"<br />);<br />var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} </p>
		<p>var idcard,Y,JYM;<br />var S,M;<br />var idcard_array = new Array();<br />idcard_array = idcard.split("");<br />//地区检验<br />if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];<br />//身份号码位数及格式检验<br />switch(idcard.length){<br />case 15:<br />if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 &amp;&amp; (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){<br />ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性<br />} else {<br />ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性<br />}<br />if(ereg.test(idcard)) return Errors[0];<br />else return Errors[2];<br />break;<br />case 18:<br />//18位身份号码检测<br />//出生日期的合法性检查 <br />//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))<br />//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))<br />if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 &amp;&amp; parseInt(idcard.substr(6,4))%4 == 0 )){<br />ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式<br />} else {<br />ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式<br />}<br />if(ereg.test(idcard)){//测试出生日期的合法性<br />//计算校验位<br />S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7<br />+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9<br />+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10<br />+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5<br />+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8<br />+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4<br />+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2<br />+ parseInt(idcard_array[7]) * 1 <br />+ parseInt(idcard_array[8]) * 6<br />+ parseInt(idcard_array[9]) * 3 ;<br />Y = S % 11;<br />M = "F";<br />JYM = "10X98765432";<br />M = JYM.substr(Y,1);//判断校验位</p>
		<p>ZJJYW = idcard_array[17].toUpperCase();<br />if(M == ZJJYW) return Errors[0]; //检测ID的校验位<br />else return Errors[3];<br />}<br />else return Errors[2];<br />break;<br />default:<br />return Errors[1];<br />break;<br />}</p>
		<p>} </p>
<img src ="http://www.blogjava.net/liuquanqi/aggbug/104689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuquanqi/" target="_blank">☆℡齐</a> 2007-03-19 11:10 <a href="http://www.blogjava.net/liuquanqi/archive/2007/03/19/104689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>