<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    JBOSS調(diào)優(yōu)

    WEB程序調(diào)優(yōu)

    1.純JSP比JSF性能要好
    2.樹(shù)形數(shù)據(jù)的顯示如果用JSF性能要差,不如用低層次的JAVASCRIPT
    WEB SERVICE調(diào)優(yōu)
    1.性能不太好,尤其依賴(lài)于傳輸?shù)腟OAP大小,因?yàn)樵赬ML與JAVA OBJECT的轉(zhuǎn)換中消耗太多
    2.加緩存在SOAP上
    3.JBOSS的WEB SERVICE有三個(gè)實(shí)現(xiàn),原生的、CXF和METRO,性能最好的是METRO,最差是原生的

    JBOSS中的TOMCAT調(diào)優(yōu)

    1.CONNECTOR參數(shù)
    當(dāng)進(jìn)入JBOSS的請(qǐng)求到達(dá)maxThreads,且又高于acceptCount的時(shí)候,用戶(hù)就會(huì)收到Connection refused的錯(cuò)誤信息,當(dāng)HTTP請(qǐng)求的線(xiàn)程空閑了maxIdleTime時(shí),系統(tǒng)就會(huì)殺掉這些線(xiàn)程,直到到達(dá)minSpareThreads數(shù)為止
    2.如何計(jì)算程序就需的線(xiàn)程數(shù)
    CPU數(shù)*200,如4核的設(shè)800
    可以通過(guò)域名為jboss.web,name=http-127.0.0.1-8080,type=ThreadPool的MBEAN觀(guān)察實(shí)際的線(xiàn)程數(shù)
    3.處理周期長(zhǎng)的WEB線(xiàn)程
    WEB線(xiàn)程處理請(qǐng)求時(shí),并不會(huì)馬上結(jié)束,還會(huì)繼續(xù)傳遞到EJB層,這樣如果EJB層處理周期長(zhǎng),會(huì)導(dǎo)致WEB層請(qǐng)求數(shù)增長(zhǎng)來(lái)處理新進(jìn)來(lái)的請(qǐng)求
    4.如何增大線(xiàn)程最大處理數(shù)
    這完全依賴(lài)于CPU、RAM和SOCKET數(shù)
    5.使用APACHE PORTABLE RUNTIME
    增加APR包能提高性能20%,如果是WINDOWS系統(tǒng)則不建議
    6.整合APACHE WEBSERVER與JBOSS SERVER
    使用APACHE WEBSERVER作為JBOSS的前端,以達(dá)到HA的效果,又能提高20%的性能
    結(jié)合方式是使用mod_jk mod_proxy_ajp mod_proxy_http
    7.三種方式的比較
    mod_proxy_ajp要高于其他兩種
    8.引入mod_cluster
    9.web.xml中關(guān)于JSP的調(diào)優(yōu)
    development=false,避免訪(fǎng)問(wèn)前的檢查
    checkInterval=0,避免JSP需要重新編譯
    trimSpaces=true,刪除JSP中的空格
    genStringAsCharArray=true

    JBOSS中SERVICE的調(diào)優(yōu)

    SESSION BEAN
    1.stateless session bean在池中數(shù)量大小的配置
    每建一個(gè)SESSION BEAN,就會(huì)在jboss.j2ee域下建一個(gè)MBEAN,通過(guò)查看其信息得知BEAN的處理統(tǒng)計(jì)時(shí)間來(lái)調(diào)整BEAN數(shù)量大小,配置文件:/deploy/ejb3-interceptors-aop.xml
    2.stateful session bean
    SFSB是被JBOSS緩存在容器中,因此客戶(hù)端的每個(gè)請(qǐng)求都會(huì)立即響應(yīng),同樣也是通過(guò)SLSB的方式查看并調(diào)整CACHE的數(shù)量大小
    3.SFSB與 SLSB的比較
    SFSB性能要差10%
    4.事務(wù)
    EJB與普通RMI SERVICE相比,就是有完整的事務(wù)支持,如果EJB采用CMT,則可以保證其方法是在全局的事務(wù)上下文中被執(zhí)行的,但開(kāi)啟事務(wù)的成本太高,如果不需用到事務(wù)的方法需將事務(wù)關(guān)閉
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    5.自定義EJB容器
    JBOSS是以攔截器的方式運(yùn)行EJB的,如果EJB中不需要事務(wù)的支持,可將這個(gè)INTERCEPTOR注釋掉
    <interceptor-ref name="org.jboss.aspects.
    tx.TxPropagationInterceptor"
    />
    6.比較軟的方式自定義EJB容器
    將定義寫(xiě)在新的XML文件中,以覆蓋原先的設(shè)定
    <?xml version="1.0" encoding="UTF-8"?>
    <aop xmlns="urn:jboss:aop-beans:1.0">
    <domain name="Non Tx Stateless Bean" extends="Intercepted Bean"
    inheritBindings
    ="false">
    <bind pointcut="execution(public * *->*(..))">
    <interceptor-ref name="org.jboss.ejb3.stateless.
    StatelessInstanceInterceptor"
    />
    <interceptor-ref name="org.jboss.ejb3.
    AllowedOperationsInterceptor"
    />
    <stack-ref name="EJBInterceptors"/>
    </bind>
    </domain>
    </aop>

    JMS
    1.基本概念
    JMS provider:JMS系統(tǒng)
    Messages:客戶(hù)端交流的載體
    Connection factories:產(chǎn)生鏈接的工廠(chǎng)
    Destinations:有Queues和Topics
    Queues:含有一堆Messag的隊(duì)列,只能發(fā)給一個(gè)客戶(hù)端
    Topics:可以發(fā)給多個(gè)客戶(hù)端
    JMS clients:生產(chǎn)和消費(fèi)Message的東西
    MDB:一個(gè)特殊的consumer
    2.JMS架構(gòu)
    如果客戶(hù)端和服務(wù)器端同一個(gè)JBOSS,則通過(guò)JCA作通訊,通過(guò)調(diào)整deploy/jca-jboss-beans.xml中的WorkManagerThreadPool的參數(shù)來(lái)調(diào)優(yōu),
    如果不在一個(gè)JBOSS內(nèi),則通過(guò)遠(yuǎn)程框架進(jìn)行通訊,通過(guò)調(diào)整deploy\messaging\remoting-bisocket-service.xml中的org.jboss.remoting.transport.Connector里的參數(shù)大小來(lái)調(diào)優(yōu)
    3.調(diào)優(yōu)JBoss Messaging Connectionfactory
    deploy\messaging\connection-factories-service.xml
    4.調(diào)優(yōu)JBoss Messaging destinations
    在deploy/messaging中增加*–service.xml文件,從而增加MBEAN,來(lái)增加隊(duì)列,再調(diào)整其參數(shù)
    5.HornetQ
    是JBOSS 6.0之后的JMS服務(wù)器,沒(méi)有依賴(lài)于任何JBOSS包,可以嵌于任何程序中。
    調(diào)優(yōu)主要針對(duì)deploy/hornetq/hornetq-configuration.xml文件中的journal和transport參數(shù)
    journal:journal-directory-存放message的地方,如果與其他文件夾共享,則會(huì)降低性能;journal-min-files:生成文件的個(gè)數(shù),如果發(fā)現(xiàn)新文件建立的次數(shù)非常頻繁,則考慮加大此數(shù)值來(lái)避免
    6.JMS調(diào)優(yōu)基本原則
    減少message的大小;使用DUPS_OK_ACKNOWLEDGE;重用JMS資源,如connections, sessions, consumers, and producers;可以不持久化message的就不持久化。


    持久層的調(diào)優(yōu)

    數(shù)據(jù)庫(kù)設(shè)計(jì)調(diào)優(yōu)
    1.減少表所占的空間
    這樣IO讀速度會(huì)加快,更少的內(nèi)存;列的數(shù)據(jù)類(lèi)型選少的;表設(shè)計(jì)要正規(guī)化(如果是報(bào)表類(lèi)型的程序則非正規(guī)化的表速度要好)
    2.數(shù)據(jù)庫(kù)分割
    如果某個(gè)表數(shù)據(jù)量太大,可將此表按某種邏輯分割成若干個(gè)小表,如按月份分成不同的表,不同月份的數(shù)據(jù)就放于不同的表中;
    如果某個(gè)表中字段數(shù)太多,可將某些字段分組,不同的組建不同的表,如將BLOB類(lèi)型的字段分割到新表中;
    3.增加索引
    對(duì)查詢(xún)中用得比較锪WHERE字段做索引,索引數(shù)據(jù)是被抽出來(lái),進(jìn)行排序后單獨(dú)存放的,如果不加索引,排序的動(dòng)作只能在SQL被執(zhí)行的時(shí)候做;
    如果做了索引的字段被修改,則該字段的索引同樣也要被修改,重新排序,這也會(huì)帶來(lái)性能問(wèn)題,因此一個(gè)表中最多只能放4-5個(gè)索引;
    但如果這個(gè)表是只讀的,則索引可以隨意增加;
    如果有組合索引,則UNIQUE的,值比較大的字段放在前面會(huì)比較好;
    索引可以加在HIBERNATE的注釋中

    JDBC的調(diào)優(yōu)
    1. 使用鏈接池來(lái)鏈接數(shù)據(jù)庫(kù)
    數(shù)據(jù)鏈接的建立和關(guān)閉是一個(gè)非常昂貴的操作,能重用就重用,客戶(hù)端從PreparedStatement Cache中取得對(duì)象,PreparedStatement再?gòu)逆溄映刂腥〉面溄樱瑥亩靡赃M(jìn)行對(duì)數(shù)據(jù)庫(kù)的操作
    2.設(shè)置正確的fetch大小
    如果設(shè)置了fetch大小為100,則JDBC會(huì)從數(shù)據(jù)庫(kù)中取回100條記錄,這樣從ResultSet中讀取next()是,是從內(nèi)存中返回?cái)?shù)據(jù),超過(guò)了100再?gòu)臄?shù)據(jù)庫(kù)中取100以備用;
    此數(shù)值一般設(shè)為當(dāng)次查詢(xún)總量的一半或1/4,但如果隨便設(shè)高,性能反而下降;
    JBOSS中設(shè)置全局大小:<connection-property name="defaultFetchSize">50</
    connection-property>
    3.INSERT和UPDATE使用批量操作
    4.使用PreparedStatement而不使用Statement
    PreparedStatement能避免SQL語(yǔ)句重復(fù)解釋?zhuān)皇褂肞reparedStatement cache來(lái)緩存PreparedStatement對(duì)象
    5.JDBC網(wǎng)絡(luò)調(diào)優(yōu)
    <connection-property name="tcpSndBuf">65534</connection-property>
    <connection-property name="tcpRcvBuf">65534</connection-property>
    <connection-property name="tcpNoDelay">true</connection-property>


    JPA/HIBERNATE調(diào)優(yōu)
    使用JDBC的限制:
    由于是使用了原生的SQL語(yǔ)句,但不同的數(shù)據(jù)庫(kù)SQL語(yǔ)句也是不同的,如果換數(shù)據(jù)庫(kù)的時(shí)候SQL語(yǔ)句改動(dòng)量大;
    多表關(guān)聯(lián)時(shí),需維護(hù)JAVA OBJECT與數(shù)據(jù)表的對(duì)應(yīng)關(guān)系;
    加緩存時(shí),工作量也比較大。
    JPA與HIBERNATE的區(qū)別:JPA是JAVA的一個(gè)標(biāo)準(zhǔn),HIBERNATE是JPA的一個(gè)實(shí)現(xiàn)
    1.優(yōu)化對(duì)象獲取
    HIBERNATE的N+1總量,如果有兩個(gè)表是一對(duì)多的關(guān)系,查詢(xún)父表的時(shí)候,子表的數(shù)據(jù)是不會(huì)被查出來(lái)的,直到調(diào)用查詢(xún)子表的方法時(shí)子表的數(shù)據(jù)才被查出來(lái),因此而多出一個(gè)SQL語(yǔ)句
    使用LEFT OUTER JOIN來(lái)達(dá)到只用一個(gè)SQL語(yǔ)句就查出父表和子表的數(shù)據(jù)
    Query q = entityManager.createQuery("from Customer c left outer join
    fetch c.items order by c.id");

    2.以分頁(yè)的方式限制一次性獲取數(shù)據(jù)的數(shù)量
    q.setFirstResult(page*100).setMaxResults(100);

    3.不能同時(shí)使用分頁(yè)和FETCH的方式
    HIBERNATE的分頁(yè),是首先取出所有的數(shù)據(jù)再在內(nèi)存中分頁(yè),以避免不同數(shù)據(jù)庫(kù)中分頁(yè)語(yǔ)句的不同
    4.使用BatchSize
    @BatchSize(size = 50)
    加載相關(guān)聯(lián)的實(shí)體集合的個(gè)數(shù),注意個(gè)數(shù)的對(duì)象是集合,不是集合里的單個(gè)元素
    5.使用named queries作查詢(xún)
    這樣會(huì)使用到PreparedStatement中的綁定參數(shù)
    6.使用批量更新與插入
    Session session =HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    for (int index = 0; index <1000;index++) {
    Person person
    = new Person();
    book.setCountry(
    "Usa");
    book.setCity(
    "NY");
    person.setName(
    "Inhabitant n." + index);
    session.save(person);
    // Flush every 50 records
    if (index % 50== 0) {
    session.flush();
    session.clear();
    }

    }

    session.getTransaction().commit();
    session.close();

    7.使用HIBERNATE CACHE
    一級(jí)緩存,在SESSION關(guān)閉前都可以使用;
    二級(jí)緩存,HIBERNATE使用第三方CACHE框架來(lái)做緩存
    <property name="hibernate.cache.use_second_level_cache"
    value
    ="true"/>
    <property name="hibernate.cache.region.factory_class"
    value
    ="org.hibernate.cache.jbc2.
    JndiMultiplexedJBossCacheRegionFactory"
    />
    <property name="hibernate.cache.region.jbc2.cachefactory"
    value
    ="java:CacheManager"/>
    <property name="hibernate.cache.region.jbc2.cfg.entity"
    value
    ="mvcc-entity"/>
    <property name="hibernate.cache.region.jbc2.cfg.collection"
    value
    ="mvcc-entity"/>
    啟用緩存
    @Entity
    @Cache(usage
    = CacheConcurrencyStrategy.TRANSACTIONAL, region =
    "customers")
    public class Customer implements Serializable {
    }

    查詢(xún)緩存
    <property name="hibernate.cache.use_query_cache" value="true"/>

    啟用查詢(xún)緩存
    @NamedQueries(
    {
    @NamedQuery(
    name 
    = "findCustomersByName",
    query 
    = "FROM Customer c WHERE c.name = :name",
    hints 
    = { @QueryHint(name = "org.hibernate.cacheable", value =
    "true") }

    )

    使用緩存的策略:靜態(tài)數(shù)據(jù)可以考慮,但查詢(xún)和更新頻率很高的、查詢(xún)條件非常復(fù)雜的不建議用

    posted on 2012-05-25 18:17 paulwong 閱讀(1211) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 性能優(yōu)化

    主站蜘蛛池模板: 青苹果乐园免费高清在线| 亚洲黄色片在线观看| 国产免费阿v精品视频网址| 久久亚洲国产精品五月天| 中文字幕人成无码免费视频| 日本永久免费a∨在线视频| 国产亚洲精品a在线观看app| 成年女人视频网站免费m| 三级黄色在线免费观看| 99999久久久久久亚洲| 国产免费爽爽视频免费可以看| 暖暖在线视频免费视频| 亚洲中文字幕久久精品蜜桃| 亚洲一区精品无码| 在线免费观看一级毛片| 两个人看www免费视频| 亚洲人成人网站18禁| 亚洲成AV人片在| 四虎永久免费网站免费观看| 亚洲免费在线观看视频| 国产成人高清精品免费观看| 亚洲色图激情文学| 国产大片免费观看中文字幕| 久久亚洲中文字幕精品一区四| 午夜精品射精入后重之免费观看| 久久精品亚洲日本波多野结衣| 亚洲AV无码国产丝袜在线观看| 国产精品免费视频一区| 鲁丝片一区二区三区免费| 一级特黄录像免费播放肥| 亚洲中文字幕一二三四区| 久久亚洲精品国产精品黑人| 亚洲色无码专区在线观看| 国产亚洲精品va在线| 亚洲三级电影网站| 亚洲成电影在线观看青青| 中文字幕久精品免费视频| 国产v亚洲v天堂无码网站| 亚洲日韩激情无码一区| 亚洲乱码无码永久不卡在线| 亚洲AV无码日韩AV无码导航|