??xml version="1.0" encoding="utf-8" standalone="yes"?>三级电影一区,国产日韩精品一区,精品成人在线视频http://www.aygfsteel.com/crazy--liyang/javazh-cnThu, 19 Jun 2025 15:34:22 GMTThu, 19 Jun 2025 15:34:22 GMT60ibatis分页<一>http://www.aygfsteel.com/crazy--liyang/archive/2011/09/14/358644.htmlcrazy-李阳crazy-李阳Wed, 14 Sep 2011 11:11:00 GMThttp://www.aygfsteel.com/crazy--liyang/archive/2011/09/14/358644.htmlhttp://www.aygfsteel.com/crazy--liyang/comments/358644.htmlhttp://www.aygfsteel.com/crazy--liyang/archive/2011/09/14/358644.html#Feedback0http://www.aygfsteel.com/crazy--liyang/comments/commentRss/358644.htmlhttp://www.aygfsteel.com/crazy--liyang/services/trackbacks/358644.html
package com.lxy.dialect;
public abstract interface Dialect {
public boolean supportLimit();
public String getLimitString(String sql,boolean hasoffset);
public String getLimitString(String sql,int offset,int limit);
}


package com.lxy.dialect;
public class MyDialect implements Dialect {
protected static final String SQL_END_DELIMITER = ";";
public String getLimitString(String sql, boolean hasoffset) {
return new StringBuffer(sql.length() + 20).append(trim(sql)).append(
hasoffset ? "limit ?,?" : "limit ?").append(SQL_END_DELIMITER)
.toString();
}
public String getLimitString(String sql, int offset, int limit) {
sql = trim(sql);
StringBuffer sb = new StringBuffer(sql.length() + 20);
sb.append(sql);
if (offset > 0) {
sb.append("limit").append(offset).append(',').append(limit).append(
";");
} else {
sb.append("limit").append(limit).append(";");
}
return sb.toString();
}
public boolean supportLimit() {
return true;
}
private String trim(String sql) {
sql = sql.trim();
if (sql.endsWith(";")) {
sql = sql.substring(0, sql.length() - 1 - ";".length());
}
return sql;
}
}


crazy-李阳 2011-09-14 19:11 发表评论
]]>
U程池代?/title><link>http://www.aygfsteel.com/crazy--liyang/archive/2011/09/02/357826.html</link><dc:creator>crazy-李阳</dc:creator><author>crazy-李阳</author><pubDate>Fri, 02 Sep 2011 07:20:00 GMT</pubDate><guid>http://www.aygfsteel.com/crazy--liyang/archive/2011/09/02/357826.html</guid><wfw:comment>http://www.aygfsteel.com/crazy--liyang/comments/357826.html</wfw:comment><comments>http://www.aygfsteel.com/crazy--liyang/archive/2011/09/02/357826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/crazy--liyang/comments/commentRss/357826.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/crazy--liyang/services/trackbacks/357826.html</trackback:ping><description><![CDATA[<div><strong><span style="font-size: 14pt; color: red;">ThreadPoolManager</span><span style="font-size: 14pt;"><br /><br /></span></strong></div><div><strong>package com.threadpool.test;<br />import java.util.LinkedList;<br />import java.util.Queue;<br />import java.util.concurrent.ArrayBlockingQueue;<br />import java.util.concurrent.Executors;<br />import java.util.concurrent.RejectedExecutionException;<br />import java.util.concurrent.RejectedExecutionHandler;<br />import java.util.concurrent.ScheduledExecutorService;<br />import java.util.concurrent.ScheduledFuture;<br />import java.util.concurrent.ThreadPoolExecutor;<br />import java.util.concurrent.TimeUnit;<br /><br />import org.omg.CORBA.TIMEOUT;<br /><br />import com.nio.test.ReadFileThread;<br /><br />public class ThreadPoolManager {<br /><br />    private static ThreadPoolManager tpm = new ThreadPoolManager();<br /><br />    // U程池最线E数<br />    private final static int MIN_SIZE = 4;<br />    // U程池最大线E数<br />    private final static int MAX_SIZE = 10;<br />    // U程池维护线E允许的I闲限制<br />    private final static int KEEP_ACTIVE_TIME = 0;<br />    // U程池用的缓冲队列大?br />    private final static int WORK_QUEUE_SIZE = 10;<br />    // 消息~冲队列<br />    Queue queue = new LinkedList();<br />    <br />    final Runnable accessBuffeThread = new Runnable()<br />    {<br /><br />        public void run() {<br />            <br />            if( hasMoreAcquire() ){<br />                <br />                String msg = ( String ) queue.poll();<br />                Runnable task = new AccessDBThread( msg );<br />                threadpool.execute( task );<br />            }<br />        }<br />        <br />    };<br />    // 无法?ThreadPoolExecutor 执行的Q务的处理E序<br />    final RejectedExecutionHandler handler = new RejectedExecutionHandler()<br />    {<br /><br />        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {<br />            // TODO Auto-generated method stub<br />            System.out.println(((AccessDBThread )r).getMsg()+"消息攑օ队列中重新等待执?);<br />            queue.offer((( AccessDBThread ) r ).getMsg() );<br />        }<br />        <br />    };<br />    <br />    final ThreadPoolExecutor threadpool = new ThreadPoolExecutor(MIN_SIZE, MAX_SIZE, KEEP_ACTIVE_TIME, TimeUnit.SECONDS, new ArrayBlockingQueue(WORK_QUEUE_SIZE),this.handler);<br />    <br />    // 调度U程?br /><br />    final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool( 1 );<br /><br />    final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(accessBuffeThread, 0, 1, TimeUnit.SECONDS);<br />    <br />    public static ThreadPoolManager newinstance()<br />    {<br />        return tpm;<br />    }<br />    <br />    private ThreadPoolManager (){}<br />    <br />    <br />    private boolean hasMoreAcquire()<br />    {<br />        return !queue.isEmpty();<br />    }<br />    <br />    public void addLogMsg(String msg)<br />    {<br />     Runnable task = new AccessDBThread(msg);<br />     threadpool.execute(task);<br />    }<br />}<br /></strong><div><strong><span style="font-size: 18pt; color: red;">AccessDBThread</span></strong></div><strong><div>package com.threadpool.test;<br /><br />public class AccessDBThread implements Runnable{<br /><br />    private String msg;<br />    public String getMsg() {<br />        return msg;<br />    }<br />    public void setMsg(String msg) {<br />        this.msg = msg;<br />    }<br />    <br />    public AccessDBThread(){<br />        super();<br />    }<br />    <br />    public AccessDBThread(String msg)<br />    {<br />        this.msg=msg;<br />    }<br />    public void run() {<br />        // TODO Auto-generated method stub<br />        System.out.println("Added the message: "+msg+" into the Database");<br />    }<br /><br />    <br />}<br /><br /><span style="color: red; font-size: 24pt;">试c:</span><br /><div>package com.threadpool.test;<br /><br /><br />public class TestDriver {<br /><br />    ThreadPoolManager tpm = ThreadPoolManager.newinstance();<br />    <br />    public void addMsg(String msg)<br />    {<br />        tpm.addLogMsg(msg);<br />    }<br />    public static void main(String[] args) {<br />        for(int i=0;i<100;i++)<br />        {<br />            new TestDriver().addMsg(Integer.toString(i));<br />        }<br />    }<br />}<br /></div><br /></div><br /></strong></div><strong><br /></strong><img src ="http://www.aygfsteel.com/crazy--liyang/aggbug/357826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/crazy--liyang/" target="_blank">crazy-李阳</a> 2011-09-02 15:20 <a href="http://www.aygfsteel.com/crazy--liyang/archive/2011/09/02/357826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>U程?/title><link>http://www.aygfsteel.com/crazy--liyang/archive/2011/09/01/357725.html</link><dc:creator>crazy-李阳</dc:creator><author>crazy-李阳</author><pubDate>Thu, 01 Sep 2011 06:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/crazy--liyang/archive/2011/09/01/357725.html</guid><wfw:comment>http://www.aygfsteel.com/crazy--liyang/comments/357725.html</wfw:comment><comments>http://www.aygfsteel.com/crazy--liyang/archive/2011/09/01/357725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/crazy--liyang/comments/commentRss/357725.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/crazy--liyang/services/trackbacks/357725.html</trackback:ping><description><![CDATA[<div><p><strong><a name="1">Z么要用线E池Q?/a></strong></p> <p> 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用E序都面向处理来自某些远E来源的大量短小的Q务。请求以某种方式到达服务器,q种?式可能是通过|络协议Q例?HTTP、FTP ?POPQ、通过 JMS 队列或者可能通过轮询数据库。不请求如何到达,服务器应用程序中l常出现的情冉|Q单个Q务处理的旉很短而请求的数目却是巨大的?/p> <p> 构徏服务器应用程序的一个过于简单的模型应该是:每当一个请求到辑ְ创徏一个新U程Q然后在新线E中求服务。实际上Q对于原型开发这U方法工作得?好,但如果试N|以q种方式q行的服务器应用E序Q那么这U方法的严重不很明显。每个请求对应一个线E(thread-per-requestQ方 法的不之一是:为每个请求创Z个新U程的开销很大Qؓ每个h创徏新线E的服务器在创徏和销毁线E上p的时间和消耗的pȝ资源要比花在处理实际的用 戯求的旉和资源更多?/p> <p> 除了创徏和销毁线E的开销之外Q活动的U程也消耗系l资源。在一?JVM 里创建太多的U程可能会导致系l由于过度消耗内存而用完内存或“切换q度”。ؓ了防止资源不I服务器应用程序需要一些办法来限制Ml定时刻处理的请求数目?/p> <p> U程池ؓU程生命周期开销问题和资源不问题提供了解决Ҏ(gu)。通过对多个Q务重用线E,U程创徏的开销被分摊到了多个Q务上。其好处是,因ؓ在请求到达时 U程已经存在Q所以无意中也消除了U程创徏所带来的gq。这P可以立即ؓh服务Q应用E序响应更快。而且Q通过适当地调整线E池中的U程数目Q也 是当请求的数目过某个阈值时Q就强制其它M新到的请求一直等待,直到获得一个线E来处理为止Q从而可以防止资源不?/p><p> </p><div><p><strong><a name="4">使用U程池的风险</a></strong></p> <p> 虽然U程池是构徏多线E应用程序的强大机制Q但使用它ƈ不是没有风险的。用U程池构建的应用E序Ҏ(gu)遭受M其它多线E应用程序容易遭受的所有ƈ发风险,诸如同步错误和死锁,它还Ҏ(gu)遭受特定于线E池的少数其它风险,诸如与池有关的死锁、资源不_U程泄漏?/p> <p><a name="N100CB">死锁</a></p> <p> M多线E应用程序都有死锁风险。当一l进E或U程中的每一个都在等待一个只有该l中另一个进E才能引L事gӞ我们pq组q程或线E? <em>死锁</em>了。死锁的最单情形是Q线E?A 持有对象 X 的独占锁Qƈ且在{待对象 Y 的锁Q而线E?B 持有对象 Y 的独占锁Q却在等待对?X 的锁。除非有某种Ҏ(gu)来打破对锁的{待QJava 锁定不支持这U方法)Q否则死锁的U程永q等下去? </p> <p> 虽然M多线E程序中都有死锁的风险,但线E池却引入了另一U死锁可能,在那U情况下Q所有池U程都在执行已阻塞的{待队列中另一d的执行结果的dQ?但这一d却因为没有未被占用的U程而不能运行。当U程池被用来实现涉及许多交互对象的模拟,被模拟的对象可以怺发送查询,q些查询接下来作为排队的?务执行,查询对象又同步等待着响应Ӟ会发生这U情c?/p> <p><a name="N100DA">资源不</a></p> <p> U程池的一个优点在于:相对于其它替代调度机Ӟ有些我们已经讨论q)而言Q它们通常执行得很好。但只有恰当地调整了U程池大时才是q样的。线E消耗包括内存和其它pȝ资源在内的大量资源。除? <code>Thread</code> 对象所需的内存之外,每个U程都需要两个可能很大的执行调用堆栈。除此以外,JVM 可能会ؓ每个 Java U程创徏一个本机线E,q些本机U程消耗额外的pȝ资源。最后,虽然U程之间切换的调度开销很小Q但如果有很多线E,环境切换也可能严重地影响E序的性能? </p> <p> 如果U程池太大,那么被那些线E消耗的资源可能严重地媄响系l性能。在U程之间q行切换会费旉Q而且使用出比?zhn)实际需要的U程可能会引赯源匮?问题Q因为池U程正在消耗一些资源,而这些资源可能会被其它Q务更有效地利用。除了线E自w所使用的资源以外,服务h时所做的工作可能需要其它资源,??JDBC q接、套接字或文件。这些也都是有限资源Q有太多的ƈ发请求也可能引v失效Q例如不能分?JDBC q接?/p> <p><a name="N100EA">q发错误</a></p> <p> U程池和其它排队机制依靠使用 <code>wait()</code> ? <code>notify()</code> Ҏ(gu)Q这两个Ҏ(gu)都难于用。如果编码不正确Q那么可能丢失通知Q导致线E保持空闲状态,管队列中有工作要处理。用这些方法时Q必L外小心;即便是专家也可能在它们上面出错。而最好用现有的、已l知道能工作的实玎ͼ例如在下面的 <a >无须~写(zhn)自q?/a>中讨论的 <code>util.concurrent</code> 包? </p> <p><a name="N10103">U程泄漏</a></p> <p> 各种cd的线E池中一个严重的风险是线E泄漏,当从池中除去一个线E以执行一Q务,而在d完成后该U程却没有返回池Ӟ会发生这U情c发生线E泄漏的一U情形出现在d抛出一? <code>RuntimeException</code> 或一? <code>Error</code> 时。如果池cL有捕捉到它们Q那么线E只会退线E池的大将会永久减一个。当q种情况发生的次数够多ӞU程池最l就为空Q而且pȝ停止,因ؓ没有可用的线E来处理d? </p> <p> 有些d可能会永q等待某些资源或来自用户的输入,而这些资源又不能保证变得可用Q用户可能也已经回家了,诸如此类的Q务会怹停止Q而这些停止的d?会引起和U程泄漏同样的问题。如果某个线E被q样一个Q务永久地消耗着Q那么它实际上就被从池除M。对于这LdQ应该要么只l予它们自己的线E,?么只让它们等待有限的旉?/p> <p><a name="N10117">hq蝲</a></p> <p> 仅仅是请求就压垮了服务器Q这U情冉|可能的。在q种情Ş下,我们可能不想每个到来的h都排队到我们的工作队列,因ؓ排在队列中等待执行的d可能?消耗太多的pȝ资源q引赯源缺乏。在q种情Ş下决定如何做取决于?zhn)自己Q在某些情况下,(zhn)可以简单地抛弃hQ依靠更高别的协议E后重试hQ?zhn)也?以用一个指出服务器暂时很忙的响应来拒绝h?/p><p><br /></p></div><div><p><strong><a name="5">有效使用U程池的准则</a></strong></p> <p> 只要(zhn)遵循几条简单的准则Q线E池可以成ؓ构徏服务器应用程序的极其有效的方法:</p> <ul><li>不要寚w些同步等待其它Q务结果的d排队。这可能会导致上面所描述的那UŞ式的死锁Q在那种死锁中,所有线E都被一些Q务所占用Q这些Q务依ơ等待排队Q务的l果Q而这些Q务又无法执行Q因为所有的U程都很忙?</li><li>在ؓ旉可能很长的操作用合用的U程时要心。如果程序必ȝ待诸?I/O 完成q样的某个资源,那么h定最长的{待旉Q以及随后是失效q是Q务重新排队以便稍后执行。这样做保证了:通过某个线E释攄某个可能成功完成的Q务,从而将最l取? <em>某些</em>q展? <br /> </li><li>理解d。要有效地调整线E池大小Q?zhn)需要理解正在排队的d以及它们正在做什么。它们是 CPU 限制的(CPU-boundQ吗Q它们是 I/O 限制的(I/O-boundQ吗Q?zhn)的答案将影响?zhn)如何调整应用程序。如果?zhn)有不同的dc,q些cL着截然不同的特征,那么Z同Q务类讄多个工作?列可能会有意义,q样可以相应地调整每个池?/li></ul></div><br /><p> </p></div><img src ="http://www.aygfsteel.com/crazy--liyang/aggbug/357725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/crazy--liyang/" target="_blank">crazy-李阳</a> 2011-09-01 14:01 <a href="http://www.aygfsteel.com/crazy--liyang/archive/2011/09/01/357725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Į</a>| <a href="http://" target="_blank">÷ӿ</a>| <a href="http://" target="_blank">ղ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ʩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ų</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ף</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӱ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">°Ͷ</a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">ʯɽ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>