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ù)雜的不建議用