tag:blogger.com,1999:blog-88887587401011357752008-10-25T23:48:48.788+08:00我有我的滋味我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-8888758740101135775.post-51618618560535739392008-10-25T23:42:00.001+08:002008-10-25T23:48:48.970+08:002008-10-25T23:48:48.970+08:00利用Ecipse生成Javadoc乱码(编码问题)终极解决方法<span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 21px; ">这里面有两个指定<strong>编码问题</strong>的参数<br />1)  -<strong>encoding</strong> <em>charsetName</em><br />2) -<strong>charset </strong><em>charsetName<br /><br /></em>第一个参数表示<strong>javadoc</strong> 程序<strong>读</strong>取java源文件时候应该采用什么编码<br />第二个参数表示<strong>javadoc</strong> 程序<strong>写</strong>html文件时采用的编码形式,并会在HTML中加入如下标签</span><div><span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 21px;"><br /></span></div><div><span class="Apple-style-span" style="font-family: Arial; font-size: 14px; line-height: 21px;">如果文件格式为UTF8格式的,可以采用如下形式进行Generate Javadoc:<br /><span style="font-size:180%;"><br /><strong>javadoc  -encoding UTF-8 -charset UTF-8</strong> <other></span><br /></span></div>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-45700515824020076292008-07-30T22:33:00.001+08:002008-07-30T22:36:57.811+08:002008-07-30T22:36:57.811+08:00我的Blog访问信息真不错啊,blog流量一直在不段的上涨,为了对的起读者,还有我自己,努力<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_MtNIfG4S-34/SJB8VGtuUTI/AAAAAAAAACg/p1Ex7uXi32I/s1600-h/%E5%9B%BE%E7%89%871.png"><img style="cursor: pointer;" src="http://bp0.blogger.com/_MtNIfG4S-34/SJB8VGtuUTI/AAAAAAAAACg/p1Ex7uXi32I/s400/%E5%9B%BE%E7%89%871.png" alt="" id="BLOGGER_PHOTO_ID_5228815869398634802" border="0" /></a>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-91480370902851046612008-07-21T22:36:00.002+08:002008-07-21T22:43:41.364+08:002008-07-21T22:43:41.364+08:00JDK1.5中的线程池使用简介2<ol class="dp-j" start="1"><li><span><span>ExecutorService pool = Executors.newFixedThreadPool(</span><span class="number">4</span><span>); </span><span class="comment">//创建线程池 4个工作线程</span><span> </span></span></li><li><span> pool.execute(<span class="keyword">new</span><span> RunnableTask()); </span><span class="comment">//向任务队列添加任务,任务是一个Runnbale的实现类</span><span> </span></span></li><li><span> pool.shutdown();<span class="comment">//停止工作线程</span><span> <br /></span></span></li></ol>这样的实现方式和上一篇文章介绍的<a href="http://www.billbai.com/2008/07/jdk15.html">JDK1.5中的线程池使用简介(转)</a>,我对内存的使用情况做了测试,结果是:<span><span>这篇文章的实现再内存上会不段的上涨,到了一个点后,JVM会做GC回收内存,根据我的测试数据来看,每次做了垃圾回收后都在50M左右.然后又继续上涨,不段的重复这个动作.<br />但是上片文章提到的实现方式,一直都在10M-30M直接波动.内存使用不会上涨.<br /></span></span>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-53654240476028356672008-07-21T22:33:00.001+08:002008-07-22T14:21:22.907+08:002008-07-22T14:21:22.907+08:00JDK1.5中的线程池使用简介(转)一、简介<br /> 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:<br /><br /> ThreadPoolExecutor(int corePoolSize,<br /> int maximumPoolSize,<br /> long keepAliveTime, TimeUnit unit,<br /> BlockingQueue workQueue,<br /> RejectedExecutionHandler handler)<br /><br /> * corePoolSize<br /> 线程池维护线程的最少数量<br /> * maximumPoolSiz<br /> 线程池维护线程的最大数量<br /> * keepAliveTime<br /> 线程池维护线程所允许的空闲时间<br /> * unit<br /> 线程池维护线程所允许的空闲时间的单位<br /> * workQueue<br /> 线程池所使用的缓冲队列<br /> * handler<br /> 线程池对拒绝任务的处理策略<br /><br /> 一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。<br /><br /> 当一个任务通过execute(Runnable)方法欲添加到线程池时:<br /><br /> * 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。<br /> * 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。<br /> * 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。<br /> * 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。<br /><br /> 也就是:处理任务的优先级为:<br /> 核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。<br /><br /> 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。<br /><br /> unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:<br /> NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。<br /><br /> workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue<br /><br /> handler有四个选择:<br /><br /> * ThreadPoolExecutor.AbortPolicy()<br /> 抛出java.util.concurrent.RejectedExecutionException异常<br /> * ThreadPoolExecutor.CallerRunsPolicy()<br /> 由调用者执行这个任务<br /> * ThreadPoolExecutor.DiscardOldestPolicy()<br /> 抛弃旧的任务<br /> * ThreadPoolExecutor.DiscardPolicy()<br /> 抛弃当前的任务<br /><br />二、一般用法举例 [下载源代码]<br /><br /> package cn.simplelife.exercise;<br /><br /> import java.util.concurrent.ArrayBlockingQueue;<br /> import java.util.concurrent.ThreadPoolExecutor;<br /> import java.util.concurrent.TimeUnit;<br /><br /> public class TestThreadPool {<br /> private static int produceTaskSleepTime = 2;<br /> public static void main(String[] args) {<br /> //构造一个线程池<br /> ThreadPoolExecutor producerPool = new ThreadPoolExecutor(2, 4, 0,<br /> TimeUnit.SECONDS, new ArrayBlockingQueue(3),<br /> new ThreadPoolExecutor.DiscardOldestPolicy());<br /><br /> //每隔produceTaskSleepTime的时间向线程池派送一个任务。<br /> int i=1;<br /> while(true){<br /> try {<br /> Thread.sleep(produceTaskSleepTime);<br /><br /> String task = "task@ " + i;<br /> System.out.println("put " + task);<br /><br /> producerPool.execute(new ThreadPoolTask(task));<br /><br /> i++;<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> }<br /> }<br /><br /> package cn.simplelife.exercise;<br /><br /> import java.io.Serializable;<br /><br /> /**<br /> * 线程池执行的任务<br /> * @author hdpan<br /> */<br /> public class ThreadPoolTask implements Runnable,Serializable{<br /><br /> //JDK1.5中,每个实现Serializable接口的类都推荐声明这样的一个ID<br /> private static final long serialVersionUID = 0;<br /><br /> private static int consumeTaskSleepTime = 2000;<br /> private Object threadPoolTaskData;<br /><br /> ThreadPoolTask(Object tasks){<br /> this.threadPoolTaskData = tasks;<br /> }<br /><br /> //每个任务的执行过程,现在是什么都没做,除了print和sleep,:)<br /> public void run(){<br /> System.out.println("start .."+threadPoolTaskData);<br /> try {<br /> //便于观察现象,等待一段时间<br /> Thread.sleep(consumeTaskSleepTime);<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> }<br /> threadPoolTaskData = null;<br /> }<br /> }<br /><br /> 对这两段程序的说明:<br /><br /> 1. 在这段程序中,一个任务就是一个Runnable类型的对象,也就是一个ThreadPoolTask类型的对象。<br /> 2. 一般来说任务除了处理方式外,还需要处理的数据,处理的数据通过构造方法传给任务。<br /> 3. 在这段程序中,main()方法相当于一个残忍的领导,他派发出许多任务,丢给一个叫 threadPool的任劳任怨的小组来做。<br /> * 这个小组里面队员至少有两个,如果他们两个忙不过来, 任务就被放到任务列表里面。<br /> * 如果积压的任务过多,多到任务列表都装不下(超过3个)的时候,就雇佣新的队员来帮忙。但是基于成本的考虑,不能雇佣太多的队员, 至多只能雇佣 4个。<br /> * 如果四个队员都在忙时,再有新的任务, 这个小组就处理不了了,任务就会被通过一种策略来处理,我们的处理方式是不停的派发, 直到接受这个任务为止(更残忍!呵呵)。<br /> * 因为队员工作是需要成本的,如果工作很闲,闲到 3SECONDS都没有新的任务了,那么有的队员就会被解雇了,但是,为了小组的正常运转,即使工作再闲,小组的队员也不能少于两个。<br /> 4. 通过调整 produceTaskSleepTime和 consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制, 改变这两个值就可以观察不同速率下程序的工作情况。<br /> 5. 通过调整4中所指的数据,再加上调整任务丢弃策略, 换上其他三种策略,就可以看出不同策略下的不同处理方式。<br /> 6. 对于其他的使用方法,参看jdk的帮助,很容易理解和使用。我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-532244302641393812008-07-19T21:08:00.003+08:002008-07-19T21:17:54.211+08:002008-07-19T21:17:54.211+08:00关于split分割字符串,空结果不能得到的问题(转)<p>先看源代码</p> <div class="dp-highlighter"><ol class="dp-j" start="1"><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * </span> </span></li><li class="alt"><span><span class="comment"> * @author 赵学庆 <a href="http://www.java2000.net/">www.java2000.net</a></span> </span></li><li class=""><span><span class="comment"> *</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="keyword">class</span><span> T { </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String args[]) { </span></span></li><li class=""><span> String num[] = <span class="keyword">new</span><span> String[</span><span class="number">11</span><span>]; </span></span></li><li class="alt"><span> String sLine = <span class="string">"101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||"</span><span>; </span></span></li><li class=""><span> num = sLine.split(<span class="string">"\\|"</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">int</span><span> row = </span><span class="number">1</span><span>; </span></span></li><li class=""><span> <span class="keyword">for</span><span> (String s : num) { </span></span></li><li class="alt"><span> System.out.println(row+++<span class="string">"="</span><span>+s); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre style="display: none;" class="java" name="code">/** * * @author 赵学庆 <a href="http://www.java2000.net/">www.java2000.net</a> * */ class T { public static void main(String args[]) { String num[] = new String[11]; String sLine = "101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||"; num = sLine.split("\\|"); int row = 1; for (String s : num) { System.out.println(row+++"="+s); } } }</pre> <p>运行结果为</p> <p> 1=101494 </p> <p>2=360103660318444 </p> <p>3=2008/06/17 </p> <p>4=周润英 </p> <p>5=1292.0</p> <p> 6=3085.76 </p> <p>7=2778.28 </p> <p>8=912.91 </p> <p>9=106.0 </p> <p>查看API,有一个 </p> <div class="dp-highlighter"><ol class="dp-j" start="1"><li class="alt"><span><span class="keyword">public</span><span> String[] split(String regex, </span><span class="keyword">int</span><span> limit); </span></span></li></ol></div><pre style="display: none;" class="java" name="code">public String[] split(String regex, int limit);</pre> <p>limit 参数控制应用模式的次数,从而影响结果数组的长度。 </p> <p><strong>如果限制 n 大于零</strong>,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入。 </p> <p><strong>如果 n 非正</strong>,那么将应用模式的次数不受限制,并且数组可以为任意长度。 </p> <p><strong>如果 n 为零</strong>,那么应用模式的次数不受限制,数组可以为任意长度,<span style="color: rgb(255, 0, 0);">并且将丢弃尾部空字符串</span>。 修改代码为 </p> <p> </p> <div class="dp-highlighter"><ol class="dp-j" start="1"><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * </span> </span></li><li class="alt"><span><span class="comment"> * @author 赵学庆 <a href="http://www.java2000.net/">www.java2000.net</a></span> </span></li><li class=""><span><span class="comment"> *</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="keyword">class</span><span> T { </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String args[]) { </span></span></li><li class=""><span> String num[] = <span class="keyword">new</span><span> String[</span><span class="number">11</span><span>]; </span></span></li><li class="alt"><span> String sLine = <span class="string">"101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||"</span><span>; </span></span></li><li class=""><span> num = sLine.split(<span class="string">"\\|"</span><span>,-</span><span class="number">1</span><span>); </span><span class="comment">// 这里使用-1作为参数</span><span> </span></span></li><li class="alt"><span> <span class="keyword">int</span><span> row = </span><span class="number">1</span><span>; </span></span></li><li class=""><span> <span class="keyword">for</span><span> (String s : num) { </span></span></li><li class="alt"><span> System.out.println(row+++<span class="string">"="</span><span>+s); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol></div><pre style="display: none;" class="java" name="code">/** * * @author 赵学庆 <a href="http://www.java2000.net/">www.java2000.net</a> * */ class T { public static void main(String args[]) { String num[] = new String[11]; String sLine = "101494|360103660318444|2008/06/17|周润英|1292.0|3085.76|2778.28|912.91|106.0|||"; num = sLine.split("\\|",-1); // 这里使用-1作为参数 int row = 1; for (String s : num) { System.out.println(row+++"="+s); } } }</pre> <p>运行结果</p> <p>1=101494 </p> <p>2=360103660318444 </p> <p>3=2008/06/17 </p> <p>4=周润英 </p> <p>5=1292.0 </p> <p>6=3085.76 </p> <p>7=2778.28 </p> <p>8=912.91 </p> <p>9=106.0 </p> <p>10= </p> <p>11= </p> <p>12= </p> <p> </p> <p>结果正常<br /></p><p><br /></p><p>转载自:<a href="http://blog.csdn.net/java2000_net/archive/2008/07/06/2618813.aspx">http://blog.csdn.net/java2000_net/archive/2008/07/06/2618813.aspx</a><br /></p>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-54522865357975926182008-07-17T16:15:00.004+08:002008-07-17T16:23:08.196+08:002008-07-17T16:23:08.196+08:00jconsole监控截图从下图可以清晰的看到JVM在一段时间内的内存使用率的一个走势.从图中可以看出每隔15分钟左右就会做一次GC,当然也可以手动执GC<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_MtNIfG4S-34/SH7_8aJSb4I/AAAAAAAAACQ/gtBnC-SoMgg/s1600-h/%E5%9B%BE%E7%89%871.png"><img style="cursor: pointer;" src="http://bp3.blogger.com/_MtNIfG4S-34/SH7_8aJSb4I/AAAAAAAAACQ/gtBnC-SoMgg/s400/%E5%9B%BE%E7%89%871.png" alt="" id="BLOGGER_PHOTO_ID_5223894031071866754" border="0" /></a><br />下图为线程监控图.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_MtNIfG4S-34/SH8BCg-nt8I/AAAAAAAAACY/ZGFOeelOSws/s1600-h/%E5%9B%BE%E7%89%872.png"><img style="cursor: pointer;" src="http://bp2.blogger.com/_MtNIfG4S-34/SH8BCg-nt8I/AAAAAAAAACY/ZGFOeelOSws/s400/%E5%9B%BE%E7%89%872.png" alt="" id="BLOGGER_PHOTO_ID_5223895235497015234" border="0" /></a><br /><br />还有很多的其他的,就自己慢慢的去耍了,我就不贴了.我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-47799703088379628632008-07-17T15:23:00.007+08:002008-07-17T16:03:45.604+08:002008-07-17T16:03:45.604+08:00JVM内存监控管理,Tomcat内存的设置<span style="color: rgb(0, 0, 153);">JVM内存监控管理</span><ul><li>首先你要启动Tomcat,只能使用startup.bat的方式启动.</li><li>启动jdk15\bin\jconsole.exe.</li><li>点击连接后,出现管理界面,这个时候我们就可以对内存,线程类等进行查看</li><li>可以手动执GC</li></ul><span style="color: rgb(0, 102, 0);">让</span><span style="color: rgb(0, 102, 0);" class="hilite2">tomcat</span><span style="color: rgb(0, 102, 0);">自己管理</span><span style="color: rgb(0, 102, 0);" class="hilite3">内存</span><span style="color: rgb(0, 102, 0);">,在startup.bat的@echo off下面添加以下代码:</span><br />set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_HOME%\conf\logging.properties"<br /><br /><span style="color: rgb(0, 102, 0);">解决严重: Exception initializing page context java.lang.OutOfMemoryError: Java heap space 的方法.</span><br /><br /> 设置参数JVM参数-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m<br />可以在环境变量中增加CATALINA_OPTS,值为-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m,当然你也可以根据实际的需要加大内存值.<br /><br /> 因为对于操作系统,请求<span class="hilite3">内存</span>的系统调用会占用大量的cpu时间,所以频繁的请求、释放<span class="hilite3">内存</span>将会导致性能的严重下降。所以对于jvm,最好的方式就是尽量多占用<span class="hilite3">内存</span>作为heap,少释放甚至不释放空闲的heap给操作系统以减少消耗在<span class="hilite3">内存</span>请求、释放操作上的cpu时间。<br /> PermGen space的全称是Permanent Generation space,是指<span class="hilite3">内存</span>的永久保存区域OutOfMemoryError: PermGen space从表面上看就是<span class="hilite3">内存</span>益出,解决方法也一定是加大<span class="hilite3">内存</span>。说说为什么会<span class="hilite3">内存</span>益 出:这一部分用于存放Class和Meta的信息,Class在被Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。<br /><br />链接:<br /><h3 style="font-weight: normal;" class="" title=""><span style="font-size:85%;"><a href="http://zjh0588.javaeye.com/blog/151311"><span class="hilite2">Tomcat</span><span class="hilite3">内存</span>释放不了</a></span></h3>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-74091484429828589162008-07-15T13:50:00.004+08:002008-07-15T13:58:09.789+08:002008-07-15T13:58:09.789+08:00让Hibernate支持Informix真正意义上的分页方法<p>这种分页方式只支持10或者10以上的版本.</p><p>建一个类InformixDialect继承org.hibernate.dialect.InformixDialect.</p><p>并重写下面几个方法useMaxForLimit();supportsLimitOffset();(String querySelect, int offset, int limit);</p><p>在Hibernate的配置中hibernate.dialect=您重写的这个类InformixDialect</p><p>具体代码见下:</p><span style="color: rgb(51, 204, 0);">import java.sql.Types;</span><br /><br /><span style="color: rgb(51, 204, 0);">import org.hibernate.Hibernate;</span><br /><br /><span style="color: rgb(51, 204, 0);">public class InformixDialect extends org.hibernate.dialect.InformixDialect {</span><br /><br /><span style="color: rgb(51, 204, 0);"> public InformixDialect() {</span><br /><span style="color: rgb(51, 204, 0);"> super();</span><br /><span style="color: rgb(51, 204, 0);"> registerHibernateType(Types.DECIMAL, Hibernate.BIG_DECIMAL.getName());</span><br /><span style="color: rgb(51, 204, 0);"> }</span><br /><br /><span style="color: rgb(51, 204, 0);"> public boolean useMaxForLimit() {</span><br /><span style="color: rgb(51, 204, 0);"> return false;</span><br /><span style="color: rgb(51, 204, 0);"> }</span><br /><br /><span style="color: rgb(51, 204, 0);"> public boolean supportsLimitOffset() {</span><br /><span style="color: rgb(51, 204, 0);"> return true;</span><br /><span style="color: rgb(51, 204, 0);"> }</span><br /><br /><span style="color: rgb(51, 204, 0);"> public String getLimitString(String querySelect, int offset, int limit) {</span><br /><span style="color: rgb(51, 204, 0);"> // if (offset>0) throw new UnsupportedOperationException("informix has</span><br /><span style="color: rgb(51, 204, 0);"> // no offset");</span><br /><span style="color: rgb(51, 204, 0);"> return new StringBuffer(querySelect.length() + 8).append(querySelect)</span><br /><span style="color: rgb(51, 204, 0);"> .insert(querySelect.toLowerCase().indexOf("select") + 6,</span><br /><span style="color: rgb(51, 204, 0);"> " skip " + offset + " first " + limit).toString();</span><br /><span style="color: rgb(51, 204, 0);"> }</span><br /><br /><span style="color: rgb(51, 204, 0);">}</span>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-53407726336271946302008-07-14T11:18:00.001+08:002008-07-14T11:20:10.428+08:002008-07-14T11:20:10.428+08:00informix数据库下导出表结构<div class="entry"> <p>1)导出数据库中所有的表结构到文件db.sql<br />$>dbschema -d your_database -t all db.sql</p> <p>2)导出数据库中所有的存储过程到文件db.sql<br />$>dbschema -d your_database -f all db.sql</p> <p>3)导出数据库中的所有对象(包含表,存储过程,触发器。。。)到文件db.sql<br />$>dbschema -d your_database db.sql</p> <p>4)导出数据库中一个表的结构到文件db.sql<br />$>dbschema -d your_database_name -t your_table_name db.sql</p> <p>5)导出一个存储过程定义到文件db.sql<br />$>dbschema -d your_database_name -f your_procedure_name db.sql</p> <p>6)如果导出更多的表的信息(EXTENT…)<br />$>dbschema -d your_database_name -ss db.sql</p> <p>7)导出数据库中对用户或角色的授权信息<br />$>dbschema -d your_database_name -p all<br />$>dbschema -d your_database_name -r all</p> <p>8)导出数据库中的同义词<br />$>dbschema -d your_database_name -s all</p> </div>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-55299523269627021832008-07-14T11:11:00.003+08:002008-07-14T11:17:31.874+08:002008-07-14T11:17:31.874+08:00Informix 数据库表迁移工具在实际中的应用<p>本文是 Informix 数据库表迁移工具在实际中的应用的第 2 部分,在 第 1 部分 中我们讨论了 Informix 提供的 onunload/onload、unload/load 等表级迁移工具进行详细探讨:分析两者存在的差异,不同情况适用哪个工具等。本部分文章将从如何提高 unload/load 性能效率及例举了实际测试样例等方面的问题,全面阐述 Informix 数据库表迁移工具.<br />提高 unload/load 性能的技巧</p> <p style="color: rgb(0, 153, 0);">1.去掉数据库(表)日志,提高 load 速度</p> <p>使用 load 工具进行批量装载时,如果数据库有日志,效率很低;尤其数据量较大时,还可能出现锁溢出、长事务等导致装载失败;对于失败的装载为保证数据一致性, IDS 自动回滚。回滚很耗时,尤其当长事务超出排它高水准线( LTXEHWM )时,其他用户的进程将被挂起,性能进一步恶化。这在联机事务处理环境中,势必影响其他业务的正常运行。为此,对有日志的数据库进行大量数据装载时,尽量 去掉数据库日志,提高效率。</p> <p>对于不能去掉日志的数据库环境,如果 Informix 版本为V9系列,可采用表级日志更改功能,即在装载时停止装载表的日志,装载结束后恢复表日志。</p> <p>实施步骤:</p> <p>1) 删除装载表的参照性约束及索引,只能对没有参照性约束及索引的表改变表级日志,所以在装载前先删除表索引及参照性约束,在装载完毕后重新创建。</p> <p>2) 取掉目的表级日志<br />ALTER TABLE TABNAME TYPE(RAW)</p> <p>3) 采用 LOAD 工具装载,创建索引及参照性约束</p> <p>4) 增加目的表表级日志<br />ALTER TABLE TABNAME TYPE(STANDARD)</p> <p style="color: rgb(0, 153, 0);">2.采用多进程,加速 unload/load 卸装速度</p> <p>目前大多数用户数据库服务器配置较高,具有多个 CPU ,物理内存也较大,如果采用单进程卸装海量表,一方面运行速度缓慢,而另一方面大量系统资源闲置。为此,建议采用多进程,加速卸载速度。针对不同的实际情况,可采用不同方法启用多进程:</p> <p>将需要装卸的多张表分配到不同的进程中并发装卸,可减少整体装卸载时间;<br />将海量表分配到多个进程中并发卸装,可减少海量表的卸载时间<br />多进程与单进程卸装速度的见测试6。</p> <p>需要说明的是,多进程适合运行在资源充分、负载较轻、具有多个 CPU 的主机上,而对资源较少,或负载已重的主机,启动多进程反而会降低性能,甚至影响其他应用程序的执行。一般来说,在多 CPU 机器上可启动少于物理 CPU 个进程,同时将分割的多个输入输出文件分布在不同设备上。</p> <p>采用多进程装载海量表,如果装载的数据库有日志,情况较为复杂,需要特别注意锁溢出与长事务的出现,为此采用以下方法:</p> <p>采用小事务,即每个进程每次装载的数据量适当小。<br />多进程并发装载同一表,防止锁溢出,表锁设置为页级锁,而非行锁。<br />去掉表的索引,加速每个进程事务的提交。<br /><span style="color: rgb(0, 153, 0);">3.去掉索引,加速 load 装载速度</span></p> <p>索引的根本目的是提高查询效率,但在插入操作时,索引的存在却严重地影响效率。当插入数据量非常大时,索引页重建量也很大,索引结点的分裂也相当频繁, I/O 操作显著增大。同时索引页的分裂,导致需要更多的内存空间来存放分裂前相同的数据量,从而降低缓存效率。</p> <p>下列情况索引的存在甚至导致装载失败:采用多进程向有日志数据库装载数据时,如果表有索引,锁模式为页锁,则会由于锁碰撞导致装载失败。这是因为每 个进程对其插入的索引页加锁,当其他进程插入的记录需要在加锁的索引页上重建的索引时,势必引起索引页上锁碰撞,导致装载失败。这种情况可将表的锁模式改 为行锁得到解决,但对于海量数据而言,采用行锁模式不仅锁管理开销庞大,性能低下,而且很可能由于锁溢出而装载失败。所以去掉索引,保证装载的成功。</p> <p style="color: rgb(0, 153, 0);">4. 调整 IDS 性能参数,加速索引创建</p> <p>调整 IDS 与性能相关的参数,可加速索引创建:</p> <p>数据表分片,为数据并行扫描提供可能。<br />设置 MAX_PDQPRIORITY 及 PDQPRIORITY 参数,启用 PDQ 功能。需要说明,启动 PDQ 功能,将会给操作系统带来很大的负载, PDQ 将占用更多的内存、 CPU VP 、扫描线程、磁盘 I/O 资源。应充分考虑在 OLTP 环境对应用程序的影响。运用 PDQ 技术应该选择多 CPU 的机器。<br />配置多个临时数据库空间,提高排序速度。<br /> 回页首<br /><br />其他说明</p> <p>使用 unload 工具迁移,对静态表而言,卸载的文本与源表保持一致;对动态表而言,由于表的更新随时发生,从而造成卸载的文本与源表不一致性。为保证数据的一致性,可考 虑将表加锁卸载。加锁会降低并发,需要权衡两方面的因素。装载时如果表有并发追加操作,同样存在上述问题。为此可对表更名装载,核对正确后,再删除原表, 更名新表为目的表。onunload/onload 工具对卸装表加锁,故不存在上述问题。<br /><br /><br />测试</p> <p>1.<span style="color: rgb(0, 153, 0);">onunload/onload 与 unload/load 的装卸载速度测试</span><br />清单1 . 测试1</p> <p> 主 机:HP-V260小型机,配置有8个CPU,8G内存,操作系统为HP UNIX 版 本:informix Dynamic Server Version 7.30 测试表:test1 ,列长:63, 记录数:8900000,有一复合唯一索引。 测试结果: 命令 耗时: real user sys Unload 12:03.47 5:17.41 2:49.06 Onunload 6:08.35 0.02 0.00 Onload 16:22.89 0.01 0.01 Load 22:13.01 11:59.24 42.19 Load后创建索引: 7:11.74 0.00 0.01<br /></p> <p>清单2 . 测试2</p> <p> 主 机:HP V2600小型机,配有4个CPU,8G内存,操作系统为HP UNIX 版 本:informix Dynamic Server Version 9.30 测试表:test2,列长:24, 记录数:5009641,有一复合唯一索引。 测试结果: 命令 耗时: real user sys Unload 6:51.30 5:26.23 16.57 Onunload 1.38.00 0 0 Onload 11:27.62 0.01 0.01 Load 33:17:85 4:02.81 13.59<br /></p> <p>结论:</p> <p>Onload/onunload 比 load/unload 性能差异与数据量、主机有关。<br />理论上讲,如果数据库中索引占用比例较大,用unload卸出速度较快,但装入后创建索引较慢; Onload卸装较稳定,只与数据量大小有关。</p><p><br /><span style="color: rgb(0, 153, 0);">2. onunload 与 unload 卸载数据占用空间大小比较</span></p> <p>测试表 test 2</p> <p>test 2 表列长:24,记录数:5009641,页大小:P=2K,有一复合索引。</p> <p>数据页申请空间 数据页占用空间 索引页占用空间 合计</p> <p>1262696页 1252722页 418004页 (1252722+418004)P=3421646848字节</p> <p>test 2 测试结果</p> <p>Unload 输出文件大小 Onunload 输出文件大小</p> <p>970781283 字节 3422552064 字节</p> <p>结论: unload 卸出的数据文本比 onunload 卸出的二进制数据文件小。</p> <p style="color: rgb(0, 153, 0);">3. 测试 onunload/onload 对磁盘碎片的整理情况</p> <p>1) 测试前统计,测试表 test3 在 sysextents 中有 60 个 extents,说明 extents 不连续。</p> <p>2) 将测试表采用 onunload/onload 卸装。</p> <p>3) 卸装后统计,测试表 test3 在 sysextents 中仅有 5 个 extents,说明对 extents 进行了整理。</p> <p>注意:Extents 个数大于 1,可能是测试表太大, IDS 需要多次分配磁盘空间;也可能有并发进程在同一数据库空间有写操作。</p> <p style="color: rgb(0, 153, 0);">4. onunload 对删除的记录卸装的测试</p> <p>1) 新建一表 test4,装载数据,从而使表每个数据页的 rowid 连续;</p> <p>2) 对 test4 表使用 onunload 卸载,卸出文件占用磁盘空间为 1858076672K;</p> <p>3) 采用 mod(rowid, 3)=1 条件删除 test4 表中大量记录;</p> <p>4) 采用 onload 装载测试表,同时将新装载表更名为 test4_1</p> <p>5) 使用 onunload 卸载 test4_1 表,卸出文件占用磁盘空间仍为 1858076672K;</p> <p>6) 检测 test4、test4_1 表的 rowid ,结果一致</p> <p>结论:onunload/onload 并不清理记录已删除的空间。</p> <p><span style="color: rgb(0, 153, 0);">5. 测试 PDQPRIORITY 的并行效率</span><br />清单 3. 测试 PDQPRIORITY 的并行效率</p> <p> 版 本:informix Dynamic Server Version 9.30 主 机:HP V2600小型机,配有4个CPU,8G内存,操作系统为HP UNIX 表状态:列长:427 记录数:500万 测试序号 测试条件 测试结果 1 set_pdqpriority 0 创建5个索引 24:16 2 set_pdqpriority 100 创建5个索引 07:32<br /></p> <p>结论:启用 PDQ 可加速索引的创建。</p> <p><span style="color: rgb(0, 153, 0);">6. 复杂测试及对比:</span><br />单进程与多进程装载效率比较<br />索引表与无索引表装载效率比较<br />日志与无日志装载效率比较<br />测试环境</p> <p>版 本:Informix Dynamic Server Version 9.30</p> <p>主 机:HP V2600 小型机,配有 4 个CPU,8G 内存,操作系统为 HP UNIX</p> <p>装载文件:行数 rows=8500000,列宽 rowsize=580。<br />表 1. 测试结果对比表</p> <p>序号 日志方式 装载时索引状况 多进程 测试目的 结果<br />1 数据库及表有日志 无索引 单进程 长事务回滚 在耗时 15 分钟、装载 800 多万时出现长事务,回滚耗时 5 小时<br />2 数据库及表有日志 无索引 6 个进程 小事务多进程 12 分钟<br />3 数据库无日志  无索引 1 个进程 无索引非日志单进程装载 18 分钟<br />4 数据库无日志  无索引 6 个进程 无索引非日志多进程装载 4 分钟<br />5 数据库无日志  有索引 6 个进程 有索引非日志多进程装载 18 分钟</p> <p>结论:去掉索引及数据库日志、采用多进程装载时,可显著提高装载效率。<br /><br /><br />附录</p> <p>1.<span style="color: rgb(0, 153, 0);">onunload 工具卸载空间大小的估计</span></p> <p>1) <span style="color: rgb(153, 0, 0);">估算表的数据量</span><br />清单4. 估算表的数据量</p> <p> Select ti_npdata, ti_nrows from sysmaster:systabinfo a, sysmaster:systabnames b where ti_partnum=partnum and tabname=查询的表名 and ti_nkeys=0;<br /></p> <p>2) <span style="color: rgb(153, 0, 0);">估算表的索引数据量</span><br />清单5. 估算表的索引数据量</p> <p> Select ti_npdata from sysmaster:systabinfo a, database_name: systabnames b , database_name:sysindexes c where ti_partnum=c.partnum and b.tabname=表名 and b.tabid=c.tabid;<br /></p> <p>将1),2)结果相加,可近似看作 onunload 卸载文件大小。实际 onunload 卸载文件大小比估计结果略大些。这里注意,需要访问两个数据库的内容: sysmaster,与查询表所在的数据库: database_name。</p> <p style="color: rgb(0, 153, 0);">2.unload 工具卸载文本空间大小的估计</p> <p>1) 统计表的记录数 recnum;</p> <p>2) 统计每条记录占用磁盘空间大小;</p> <p>将1),2)结果相乘,可近似看作 unload 卸载文件大小。</p> <p>3. <span style="color: rgb(0, 153, 0);">查找 extents 个数较多的表</span><br />清单6. 查找 extents 个数较多的表</p> Select tabname, count(*) rec from sysmaster:sysextents group by 1 into temp tj with no log; Select * from tj order by rec desc ;我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-1434607214045069912008-07-13T18:22:00.005+08:002008-07-13T23:05:24.345+08:002008-07-13T23:05:24.345+08:00GlassFish安装1.首先需要安装JDK5或者是JDK6,并设置好环境变量<br />2.安装ant1.6.5以上版本,并设置好ANT_HOME,Path。<br />3.下载GlassFish:<a href="http://download.java.net/javaee5/v2ur2/promoted/WINNT/glassfish-installer-v2ur2-b04-windows-ml.jar">http://download.java.net/javaee5/v2ur2/promoted/WINNT/glassfish-installer-v2ur2-b04-windows-ml.jar</a><br />4.安装GlassFish<br /><ul><li>把下载后的文件放到D:\或者是其他目录</li><li>运行cmd,进入D:\</li><li>执行 java -Xmx256m -jar <i>filename.jar</i></li><li><i>运行 </i>cd glassfish</li><li>运行ant -f setup.xml</li><li><tt>增加新的环境变量GLASSFISH_HOME,</tt><tt>并再path后增加%</tt><tt>GLASSFISH_HOME</tt><tt>%\bin</tt></li></ul>5.应用服务器管理<br /><ul><li><tt>启动asadmin start-domain domain1</tt></li><li><tt>停止</tt><tt>asadmin stop-domain domain1</tt></li><li><tt>管理登录http://localhost:4848 admin/adminadmin<br /></tt></li></ul>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-28832018090969792232008-07-13T09:15:00.010+08:002008-07-13T18:01:50.359+08:002008-07-13T18:01:50.359+08:00GlassFish v2资料汇总(不段更新)<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_MtNIfG4S-34/SHlZ9-11VbI/AAAAAAAAAA8/FKTNu6go3XM/s1600-h/open_pro.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_MtNIfG4S-34/SHlZ9-11VbI/AAAAAAAAAA8/FKTNu6go3XM/s320/open_pro.gif" alt="" id="BLOGGER_PHOTO_ID_5222304164288484786" border="0" /></a><br />GlassFish v2资料汇总<br /><span class="hilite1">1GlassFish</span>.org官方网站消息,由于中文用户增加,为了提供一个一站式的中文产品和社区,<span class="hilite1">GlassFish</span>中文网站上线:<a href="http://cn.glassfish.org/" target="_blank">http://cn.<span class="hilite1">glassfish</span>.org</a><br />2.GlassFish v2: 明智选择:<a href="http://developers.sun.com.cn/Java/GFv2OpenforBusiness.html#whatgf">http://developers.sun.com.cn/Java/GFv2OpenforBusiness.html#whatgf</a><br />主要讲述了下面几个方面:<br /><ul><li>什么是 GlassFish?</li><li>GlassFish v2 及其商业发行版</li><li>高可用性和可伸缩性</li><li>企业级性能</li><li>集中管理和监控</li><li>使用配置文件实现简单一步配置</li><li>与 .NET 的互操作性</li><li>JBI 就绪</li><li>高级消息处理</li><li>具有吸引力的支持报价</li></ul>3.在GlassFish Version 2中实现集群:<a href="http://developers.sun.com.cn/Java/glassfishcluster.html">http://developers.sun.com.cn/Java/glassfishcluster.html</a><br /><br />主要讲述了下面几个方面:<br /><ul><li>基本概念</li><li>域管理体系结构</li><li>集群体系结构</li><li>典型的故障转移场景</li><li>集群动态变形</li><li>组管理服务</li><li>内存复制配置</li><li>内存复制实现</li><li>应用服务器安装</li><li>集群配置</li><li>域检查</li><li>为现有域启用集群支持</li><li>HTTP负载平衡器插件 </li></ul>4.<a href="http://www.javaeye.com/topic/141589"><span style="font-size:small;">用 <span class="hilite1"><span class="hilite1">GlassFish</span></span> v2 替换 Tomcat 5.x</span></a><br /><br />5.GlassFish系列文章<a href="http://www.javaeye.com/news/2880"> http://www.javaeye.com/news/2880</a>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-14063459058843684852008-07-12T21:30:00.001+08:002008-07-12T21:32:13.974+08:002008-07-12T21:32:13.974+08:00tar命令参数列表<div class="entry"> <p>1.压缩一组文件为tar.gz后缀。<br /># tar cvf backup.tar /etc<br />#gzip -q backup.tar<br />或<br /># tar cvfz backup.tar.gz /etc/<br />2.释放一个后缀为tar.gz的文件。<br />#gunzip backup.tar.gz<br />#tar xvf backup.tar<br />或<br /># tar xvfz backup.tar.gz</p> <p>3.用一个命令完成压缩<br />#tar cvf - /etc/ | gzip -qc > backup.tar.gz</p> <p>4.用一个命令完成释放<br /># gunzip -c backup.tar.gz | tar xvf -</p> <p>5.如何解开tar.Z的文件?<br /># tar xvfz backup.tar.Z<br />或<br /># uncompress backup.tar.Z<br />#tar xvf backup.tar</p> <p>6.如何解开.tgz文件?<br />#gunzip backup.tgz</p> </div>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-18191964541649014182008-07-12T21:16:00.002+08:002008-07-12T21:23:09.392+08:002008-07-12T21:23:09.392+08:00SVN 增加用户<div class="entry"> <p>htpasswd的几个参数<br />1. -m将密码以加密形式存放<br />htpasswd -m passwordfile.conf username</p> <p>2. -n如果口令文件不存在那么创建一个新的</p> <p>3. -b直接在控制台上输入口令,而不是以*号显示<br />htpasswd -mb passwordfile.conf username pass</p> </div>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-13109904710891931452008-07-12T21:09:00.012+08:002008-07-12T21:26:00.663+08:002008-07-12T21:26:00.663+08:00Linux/Unix下怎么将一个数据文件分成多个文件<div class="entry"> <p>1.进入文件所在的目录 cd 目录</p> <p>2.执行 split -l 记录数(小文件记录数) 需要拆分的文件</p> <p>3.ls x* > xxx.sql</p> <p>4.vi xxx.sql</p> <p>5. :1,$ s/^/ load from /g</p> <p>6. :1,$ s/$/ insert into 表名; /g</p> </div>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-30357449378454571122008-07-12T16:48:00.002+08:002008-07-12T21:21:39.683+08:002008-07-12T21:21:39.683+08:00Hibernate参数设置<div class="entry"> <p>属性名 用途<br />hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值full.classname.of.Dialect<br />hibernate.show_sql 输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为debug。 eg.true | false<br />hibernate.format_sql 在log和console中打印出更漂亮的SQL。 取值true | false<br />hibernate.default_schema 在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. 取值SCHEMA_NAME<br />hibernate.default_catalog 在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. 取值CATALOG_NAME<br />hibernate.session_factory_name SessionFactory 创建后,将自动使用这个名字绑定到JNDI中. 取值jndi/composite/name<br />hibernate.max_fetch_depth 为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取. 取值 建议在0到3之间取值<br />hibernate.default_batch_fetch_size 为Hibernate关联的批量抓取设置默认数量. 取值 建议的取值为4, 8, 和16<br />hibernate.default_entity_mode 为由这个SessionFactory打开的所有Session指定默认的实体表现模式. 取值dynamic-map, dom4j, pojo<br />hibernate.order_updates 强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 取值true | false<br />hibernate.generate_statistics 如果开启, Hibernate将收集有助于性能调节的统计数据. 取值true | false<br />hibernate.use_identifer_rollback 如果开启, 在对象被删除时生成的标识属性将被重设为默认值. 取值true | false<br />hibernate.use_sql_comments 如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为false. 取值true | false</p> <p>表 3.4. Hibernate JDBC和连接(connection)属性</p> <p>属性名 用途<br />hibernate.jdbc.fetch_size 非零值,指定JDBC抓取数量的大小 (调用Statement.setFetchSize()).<br />hibernate.jdbc.batch_size 非零值,允许Hibernate使用JDBC2的批量更新. 取值 建议取5到30之间的值<br />hibernate.jdbc.batch_versioned_data 如果你想让你的JDBC驱动从executeBatch()返回正确的行计数 , 那么将此属性设为true(开启这个选项通常是安全的). 同时,Hibernate将为自动版本化的数据使用批量DML. 默认值为false. eg.true | false<br />hibernate.jdbc.factory_class 选择一个自定义的Batcher. 多数应用程序不需要这个配置属性. eg.classname.of.Batcher<br />hibernate.jdbc.use_scrollable_resultset 允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时,这个选项才是必要的, 否则Hibernate会使用连接的元数据. 取值true | false<br />hibernate.jdbc.use_streams_for_binary 在JDBC读写binary (二进制)或serializable (可序列化) 的类型时使用流(stream)(系统级属性). 取值true | false<br />hibernate.jdbc.use_get_generated_keys 在数据插入数据库之后,允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题,请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. 取值true|false<br />hibernate.connection.provider_class 自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接. 取值classname.of.ConnectionProvider<br />hibernate.connection.isolation 设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. 取值1, 2, 4, 8<br />hibernate.connection.autocommit 允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). 取值true | false<br />hibernate.connection.release_mode 指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement, 这样在每次JDBC调用后,都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction. 取值on_close | after_transaction | after_statement | auto<br />hibernate.connection.</p> <propertyname> 将JDBC属性propertyName传递到DriverManager.getConnection()中去.<br />hibernate.jndi. <propertyname> 将属性propertyName传递到JNDI InitialContextFactory中去. <p>表 3.5. Hibernate缓存属性</p> <p>属性名 用途<br />hibernate.cache.provider_class 自定义的CacheProvider的类名. 取值classname.of.CacheProvider<br />hibernate.cache.use_minimal_puts 以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中,这个设置对的集群缓存非常有用, 对集群缓存的实现而言,默认是开启的. 取值true|false<br />hibernate.cache.use_query_cache 允许查询缓存, 个别查询仍然需要被设置为可缓存的. 取值true|false<br />hibernate.cache.use_second_level_cache 能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<cache>的类,会默认开启二级缓存. 取值true|false<br />hibernate.cache.query_cache_factory 自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache. 取值classname.of.QueryCache<br />hibernate.cache.region_prefix 二级缓存区域名的前缀. 取值prefix<br />hibernate.cache.use_structured_entries 强制Hibernate以更人性化的格式将数据存入二级缓存. 取值true|false</cache></p> <p>表 3.6. Hibernate事务属性</p> <p>属性名 用途<br />hibernate.transaction.factory_class 一个TransactionFactory的类名, 用于Hibernate Transaction API (默认为JDBCTransactionFactory). 取值classname.of.TransactionFactory<br />jta.UserTransaction 一个JNDI名字,被JTATransactionFactory用来从应用服务器获取JTA UserTransaction. 取值jndi/composite/name<br />hibernate.transaction.manager_lookup_class 一个TransactionManagerLookup的类名 - 当使用JVM级缓存,或在JTA环境中使用hilo生成器的时候需要该类. 取值classname.of.TransactionManagerLookup<br />hibernate.transaction.flush_before_completion 如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。取值true | false<br />hibernate.transaction.auto_close_session 如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。取值true | false</p> <p>表 3.7. 其他属性</p> <p>属性名 用途<br />hibernate.current_session_context_class 为”当前” Session指定一个(自定义的)策略。eg.jta | thread | custom.Class<br />hibernate.query.factory_class 选择HQL解析器的实现. 取值org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory<br />hibernate.query.substitutions 将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). 取值hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC<br />hibernate.hbm2ddl.auto 在SessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema. 取值validate | update | create | create-drop<br />hibernate.cglib.use_reflection_optimizer 开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性. 取值true | false</p> <p>3.4.1. SQL方言 你应当总是为你的数据库将hibernate.dialect属性设置成正确的 org.hibernate.dialect.Dialect子类. 如果你指定一种方言, Hibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫.</p> <p>表 3.8. Hibernate SQL方言 (hibernate.dialect)</p> <p>RDBMS 方言<br />DB2 org.hibernate.dialect.DB2Dialect<br />DB2 AS/400 org.hibernate.dialect.DB2400Dialect<br />DB2 OS390 org.hibernate.dialect.DB2390Dialect<br />PostgreSQL org.hibernate.dialect.PostgreSQLDialect<br />MySQL org.hibernate.dialect.MySQLDialect<br />MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect<br />MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect<br />Oracle (any version) org.hibernate.dialect.OracleDialect<br />Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect<br />Sybase org.hibernate.dialect.SybaseDialect<br />Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect<br />Microsoft SQL Server org.hibernate.dialect.SQLServerDialect<br />SAP DB org.hibernate.dialect.SAPDBDialect<br />Informix org.hibernate.dialect.InformixDialect<br />HypersonicSQL org.hibernate.dialect.HSQLDialect<br />Ingres org.hibernate.dialect.IngresDialect<br />Progress org.hibernate.dialect.ProgressDialect<br />Mckoi SQL org.hibernate.dialect.MckoiDialect<br />Interbase org.hibernate.dialect.InterbaseDialect<br />Pointbase org.hibernate.dialect.PointbaseDialect<br />FrontBase org.hibernate.dialect.FrontbaseDialect<br />Firebird org.hibernate.dialect.FirebirdDialect</p> <p>表 3.9. Hibernate日志类别</p> <p>类别 功能<br />org.hibernate.SQL 在所有SQL DML语句被执行时为它们记录日志<br />org.hibernate.type 为所有JDBC参数记录日志<br />org.hibernate.tool.hbm2ddl 在所有SQL DDL语句执行时为它们记录日志<br />org.hibernate.pretty 在session清洗(flush)时,为所有与其关联的实体(最多20个)的状态记录日志<br />org.hibernate.cache 为所有二级缓存的活动记录日志<br />org.hibernate.transaction 为事务相关的活动记录日志<br />org.hibernate.jdbc 为所有JDBC资源的获取记录日志<br />org.hibernate.hql.AST 在解析查询的时候,记录HQL和SQL的AST分析日志<br />org.hibernate.secure 为JAAS认证请求做日志<br />org.hibernate 为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助)</p> <p>表 3.10. JTA TransactionManagers</p> <p>Transaction工厂类 应用程序服务器<br />org.hibernate.transaction.JBossTransactionManagerLookup JBoss<br />org.hibernate.transaction.WeblogicTransactionManagerLookup Weblogic<br />org.hibernate.transaction.WebSphereTransactionManagerLookup WebSphere<br />org.hibernate.transaction.WebSphereExtendedJTATransactionLookup WebSphere 6<br />org.hibernate.transaction.OrionTransactionManagerLookup Orion<br />org.hibernate.transaction.ResinTransactionManagerLookup Resin<br />org.hibernate.transaction.JOTMTransactionManagerLookup JOTM<br />org.hibernate.transaction.JOnASTransactionManagerLookup JOnAS<br />org.hibernate.transaction.JRun4TransactionManagerLookup JRun4<br />org.hibernate.transaction.BESTransactionManagerLookup Borland ES</p> <p>//山风小子注:在agile_boy的《Hibernate调优小记》中看到《Hibernate 参数设置一览表》,觉得不错,拿来与大家分享<br />原文地址:<a href="http://www.ideagrace.com/html/doc/2007/01/30/08608.html" target="_blank">http://www.ideagrace.com/html/doc/2007/01/30/08608.html</a> </p></propertyname></propertyname></div>我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0tag:blogger.com,1999:blog-8888758740101135775.post-68936273697788520932008-07-12T15:20:00.001+08:002008-07-12T21:21:02.946+08:002008-07-12T21:21:02.946+08:00Blog搬家很早就在Blog,因为各种原因到现在都没有一个固定的家,现在终于可以安到这里了。我有我的滋味http://www.blogger.com/profile/06795722099448830943noreply@blogger.com0