網(wǎng)站性能檢測(cè)評(píng)分
注:本網(wǎng)站頁(yè)面html檢測(cè)工具掃描網(wǎng)站中存在的基本問題,僅供參考。
網(wǎng)站怎樣開發(fā)
人工智能浪潮下的 Web 開發(fā),程序員該如何上手? 人工智能視頻課程
經(jīng)歷了網(wǎng)絡(luò)互聯(lián)的 Web 1.0 時(shí)代、社交的 Web 2.0 時(shí)代、基于移動(dòng)的 Web 3.0 時(shí)代,如今的我們正逐步邁向知識(shí)分配的 Web 4.0 時(shí)代。與此同時(shí),隨著人工智能的興起,聊天機(jī)器人和會(huì)話式 UI 也開始滲透 Web 領(lǐng)域,所以說,現(xiàn)在的 Web 開發(fā)已經(jīng)和幾年前完全不一樣了。
當(dāng)面對(duì)日新月異的技術(shù)、錯(cuò)綜復(fù)雜的網(wǎng)站時(shí),新入行的開發(fā)者很容迷失方向。以下這篇指南,展示了后端開發(fā)的全景、運(yùn)維的趨勢(shì),希望給從事 Web 開發(fā)的程序員們一個(gè)清晰的概念,去其糟粕取其精華。
以前,后端的路線圖只是一些平鋪的技術(shù)介紹,而無法給出任何有關(guān)趨勢(shì)的方向。而在這篇文章中,有詳細(xì)的后端學(xué)習(xí)路線圖,可助前行路上的開發(fā)者一臂之力。廢話不多說,現(xiàn)在就開始吧。
接下來,我們將一步步來解釋一下這張圖。
開始之前要說明一點(diǎn),雖然我們?cè)趫D中沒有列出 HTML/CSS 的知識(shí),但建議你至少懂得一點(diǎn),并會(huì)寫一些基本的 HTML/CSS。
▌學(xué)一門語(yǔ)言
選擇語(yǔ)言時(shí)總是會(huì)遇到無數(shù)種選擇。我把語(yǔ)言按照類別分開,以便你作出決定。對(duì)于剛剛進(jìn)入后端開發(fā)的初學(xué)者,我建議選任何一種腳本語(yǔ)言,它們的市場(chǎng)需求都很大,因此你可以迅速進(jìn)步。如果你有前端知識(shí),Node.js 會(huì)很容易,而且工作機(jī)會(huì)也很多。
如果你已經(jīng)在從事后端開發(fā),并且會(huì)某種腳本語(yǔ)言,我建議你不要再選另一種腳本語(yǔ)言,而是從“函數(shù)式”(Functional)或“多重編程”(Multiparadigm)中選擇一種。例如,如果你會(huì) PHP 或 Node.js,那就別再學(xué) Python 或 Ruby,而是嘗試下 Erlang 或 Golang。這樣能開闊你的思維和視野。
▌練習(xí)學(xué)到的知識(shí)
學(xué)習(xí)知識(shí)的最佳途徑就是練習(xí)。選好語(yǔ)言并了解一些基本概念之后,就應(yīng)該學(xué)以致用,用它多做一些小應(yīng)用。下面是一些建議:
實(shí)現(xiàn)一些常用的 bash 命令,例如實(shí)現(xiàn) ls 的功能;寫個(gè)命令從 reddit 的 /r/programming 上以 JSON 格式獲取并保存文章;寫個(gè)命令以 JSON 格式返回目錄結(jié)構(gòu),例如 jsonify dir-name,返回一個(gè) JSON 文件,內(nèi)容是 dir-name 下的目錄結(jié)構(gòu);寫個(gè)命令讀取上一條的 JSON 文件并創(chuàng)建目錄結(jié)構(gòu);想一想每天要做的任務(wù),并嘗試自動(dòng)化。
▌學(xué)習(xí)包管理器
理解語(yǔ)言的基礎(chǔ)知識(shí)并做了一些簡(jiǎn)單的應(yīng)用后,可以學(xué)一下那門語(yǔ)言的包管理器如何使用。包管理器可以幫你在應(yīng)用中使用第三方庫(kù),還可以把你的庫(kù)發(fā)布給其他人使用。
如果你選了 PHP,可以學(xué)一學(xué) Composer;選了 Node.js 可以學(xué)習(xí) NPM 或 Yarn;選了 Python 可以學(xué)一學(xué) Pip;選了 Ruby 可以學(xué)一學(xué) RubyGems。不論你選和種語(yǔ)言,都應(yīng)該去學(xué)學(xué)相應(yīng)的包管理器。
▌標(biāo)準(zhǔn)做法和最佳實(shí)踐
每種語(yǔ)言都有標(biāo)準(zhǔn)做法和最佳實(shí)踐。學(xué)一學(xué)你選擇的語(yǔ)言的這些知識(shí)。例如, PHP 有 PHP-FIG 和 PSR。Node.js 和其他語(yǔ)言都有許多社區(qū)主導(dǎo)的規(guī)范。
▌安全性
務(wù)必要讀一讀有關(guān)安全性的最佳實(shí)踐。閱讀OWASP(https://owasp.org/index.php/Main_Page)的規(guī)范,理解各種安全問題,以及如何在所選語(yǔ)言中避免這些問題。
▌練習(xí)
現(xiàn)在你已經(jīng)了解了語(yǔ)言的基本知識(shí)、標(biāo)準(zhǔn)做法和最佳實(shí)踐、安全信息,以及如何使用包管理器。現(xiàn)在可以去創(chuàng)建一個(gè)包,并把它發(fā)布給其他人使用了。在這個(gè)過程中要時(shí)刻遵循你學(xué)到的標(biāo)準(zhǔn)和最佳實(shí)踐。例如,如果你選了 PHP,你就應(yīng)當(dāng)在 Packagist 上發(fā)布。選擇了 Node.js,就應(yīng)該在 Npm 上發(fā)布等。
完成這一步之后,可以在 Github 上找一些項(xiàng)目,然后試著建一些 pull request。一些建議:
重構(gòu)代碼,實(shí)現(xiàn)你學(xué)到的最佳實(shí)踐;尋找 Bug 并試圖解決;增加新功能。
▌學(xué)習(xí)測(cè)試
測(cè)試有好幾種類型。要理解這幾種類型的測(cè)試,以及每種測(cè)試的目的。不過,可以從給你的應(yīng)用編寫單元測(cè)試和集成測(cè)試開始。同時(shí),還要理解各種測(cè)試的術(shù)語(yǔ),如 mock、stub 等。
▌實(shí)踐
作為練習(xí),可以為你之前的項(xiàng)目寫一些單元測(cè)試,特別是給第 6 步做好的那些項(xiàng)目。
還要學(xué)習(xí)并計(jì)算你寫的測(cè)試用例的覆蓋率。
▌學(xué)習(xí)關(guān)系型數(shù)據(jù)庫(kù)
學(xué)習(xí)如何在關(guān)系型數(shù)據(jù)庫(kù)中永久保存數(shù)據(jù)。在選擇要學(xué)習(xí)的數(shù)據(jù)庫(kù)之前,要先理解各種數(shù)據(jù)庫(kù)術(shù)語(yǔ),如鍵、索引、正規(guī)化、元組等。
學(xué)習(xí)數(shù)據(jù)庫(kù)有好幾種選擇。不過,學(xué)完其中一個(gè)數(shù)據(jù)庫(kù)后,再學(xué)其他的就會(huì)很容易??梢詫W(xué)習(xí) MySQL、MariaDB(是 MySQL 的一個(gè)分支,與 MySQL 幾乎完全相同)或 PostgreSQL。建議先從 MySQL 開始。
▌練習(xí)時(shí)間
現(xiàn)在可以把所有學(xué)到的知識(shí)放到一起了。
用學(xué)到的所有知識(shí)做一個(gè)簡(jiǎn)單的應(yīng)用。選一個(gè)點(diǎn)子,比如建立一個(gè)簡(jiǎn)單的博客應(yīng)用,并實(shí)現(xiàn)以下的功能:
用戶賬號(hào) - 注冊(cè)和登錄注冊(cè)用戶可以創(chuàng)建博文用戶可以查看他創(chuàng)建的所有博文用戶可以刪除博文用戶只能看到他自己的博文,看不到其他人的給應(yīng)用寫單元測(cè)試和集成測(cè)試數(shù)據(jù)庫(kù)查詢要使用索引。分析查詢,確保索引被用到了。
▌學(xué)習(xí)一個(gè)框架
根據(jù)項(xiàng)目和語(yǔ)言不同,你可能需要框架,也可能不需要。每種語(yǔ)言都有多個(gè)框架供選擇,應(yīng)當(dāng)去看看你選擇的語(yǔ)言都有哪些框架,然后選一個(gè)關(guān)聯(lián)最大的。
如果你選的是 PHP,我建議學(xué)習(xí) Laravel 或 Symfony,如果需要微型框架的話,可以選擇 Lumen 或 Slim。如果選擇 Node.js,也有多種框架可以選擇,但最流行的就是 Express.js。
▌練習(xí)時(shí)間
這一步的練習(xí),可以將你之前在第 10 步創(chuàng)建的應(yīng)用改成用框架實(shí)現(xiàn)。同時(shí)要保證移植一切功能,包括測(cè)試用例。
▌學(xué)習(xí)一種NoSQL數(shù)據(jù)庫(kù)
首先要理解 NoSQL 是什么,它們與關(guān)系型數(shù)據(jù)庫(kù)有何區(qū)別,以及為什么需要 NoSQL。NoSQL 數(shù)據(jù)庫(kù)也有許多種,做一點(diǎn)研究,比較它們的功能和區(qū)別。常見的選擇有 MongoDB、Cassandra、RethinkDB 和 Couchbase。如果必須選擇其一,可以用 MongoDB。
▌緩存
學(xué)習(xí)如何在應(yīng)用級(jí)別實(shí)現(xiàn)緩存。理解如何使用 Redis 或 Memcached,并在第 12 步創(chuàng)建的應(yīng)用中應(yīng)用緩存。
▌創(chuàng)建 RESTful API
理解 REST 并學(xué)習(xí) RESTful API。一定要讀一讀 Roy Fielding 的論文中有關(guān) REST 的那部分。確保有人說 REST 只能用于 HTTP API 時(shí)你能夠反駁。
▌學(xué)習(xí)不同的認(rèn)證方式
學(xué)習(xí)各種認(rèn)證和授權(quán)方式。你應(yīng)該知道它們的含義,它們之間的區(qū)別,以及何時(shí)該用哪個(gè)。
OAuth - 開放認(rèn)證Basic認(rèn)證Token認(rèn)證JWT - JSON Web TokensOpenID
▌消息傳遞
學(xué)習(xí)消息傳遞機(jī)制,理解為何、何時(shí)要使用消息傳遞。也有多種選擇,但主流就是RabbitMQ和Kafka。如果只能選擇其一,可以先學(xué)習(xí)RabbitMQ。
▌搜索引擎
隨著應(yīng)用程序變得越來越大,在關(guān)系型數(shù)據(jù)庫(kù)或 NoSQL 上的簡(jiǎn)單查詢將無法滿足需求,這就必須使用搜索引擎。搜索引擎也有多種選擇,每種都有自己的優(yōu)缺點(diǎn)。
▌學(xué)習(xí)使用 Docker
Docker 可以大幅度降低開發(fā)的難度,它能復(fù)制與生產(chǎn)環(huán)境完全相同的環(huán)境,能保證操作系統(tǒng)干凈,還能讓編碼、測(cè)試和部署更快捷。讀者可以自己搜索“Docker 有哪些好處”的答案。在這一步,只需要去學(xué)習(xí)如何使用 Docker。
▌Web 服務(wù)器的知識(shí)
如果你已學(xué)到這里,那么在前面的步驟中你一定已經(jīng)接觸過了服務(wù)器。這一步主要是要找出不同 Web 服務(wù)器之間的區(qū)別,了解其限制和不同的配置選項(xiàng),并理解怎樣編寫應(yīng)用才能更好地利用這些限制。
▌學(xué)習(xí)如何使用 WebSocket
盡管這一步不是必須,但掌握 WebSocket 總會(huì)有好處。學(xué)習(xí)如何利用 WebSocket 編寫實(shí)時(shí) Web 應(yīng)用程序,并用它寫個(gè)示例應(yīng)用??梢栽谇懊嫱瓿傻牟┛蛻?yīng)用中使用 WebSocket 實(shí)現(xiàn)實(shí)時(shí)更新博文列表。
▌學(xué)習(xí) GraphQL
學(xué)習(xí)如何用 GraphQL 編寫 API。理解它與 REST 的區(qū)別,理解為何它被稱為 REST 2.0。
▌看看圖數(shù)據(jù)庫(kù)
圖模型能靈活地表示并處理數(shù)據(jù)之間的關(guān)系,而圖數(shù)據(jù)庫(kù)提供了快速、有效的方式來存儲(chǔ)、讀取并查詢圖。學(xué)學(xué)如何使用 Neo4j 或 OrientDB。
▌繼續(xù)探索
一旦開始學(xué)習(xí)并練習(xí)后,你一定會(huì)遇到很多我們沒有覆蓋到的東西。保持開放的心態(tài)和健康好學(xué)的態(tài)度,去學(xué)習(xí)新東西吧。
記住,關(guān)鍵就是要多練習(xí)。剛開始可能有些不使用,但很快就會(huì)習(xí)以為常,時(shí)間長(zhǎng)了還會(huì)覺得越來越好。
在此也推薦作者之前寫的一篇前端開發(fā)技術(shù)全景文章:https://medium/tech-tajawal/modern-frontend-developer-in-2018-4c2072fa2b9c
原文:https://medium/tech-tajawal/modern-backend-developer-in-2018-6b3f7b5f8b9作者:Adnan Ahmed,tajawal 的首席工程師,喜歡 Web 開發(fā)、新技術(shù),崇尚簡(jiǎn)單,開源的忠實(shí)粉絲。譯者:彎月,責(zé)編:屠敏
java編程學(xué)習(xí)—如何用Java進(jìn)行高性能網(wǎng)站開發(fā) 行業(yè)視頻課程
Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。
給你學(xué)習(xí)路線:html-css-js-jq-javase-數(shù)據(jù)庫(kù)-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
1、生成對(duì)象時(shí),合理分配空間和大?。?/p>
Java中的很多類都有它的默認(rèn)的空間分配大小,對(duì)于一些有大小的對(duì)象的初始化,應(yīng)該預(yù)計(jì)對(duì)象的大小,然后使用進(jìn)行初始化。
例如:我們?cè)谑褂肰ector,當(dāng)聲明Vector vect=new Vector()時(shí),系統(tǒng)調(diào)用:
public Vector() {// 缺省構(gòu)造函數(shù)
this(10); // 容量是 10;
}
缺省分配10個(gè)對(duì)象大小容量。當(dāng)執(zhí)行add方法時(shí),可以看到具體實(shí)現(xiàn)為:..
public synchronized boolean add(Object o) {
modCount++;
ensureCapacityHelper(elementCount+1);
elementData[elementCount++] =o;
return true;
}
private void ensureCapacityHelper(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) :
(oldCapacity * 2);
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, elementCount);
}
}
我們可以看到,當(dāng)Vector大小超過原來的大小時(shí),一些代碼的目的就是為了做容量的擴(kuò)充,在預(yù)先知道該Vector大小的話,可以指定其大小,避免容量擴(kuò)充的開銷。
2、優(yōu)化循環(huán)體:
循環(huán)是比較重復(fù)運(yùn)行的地方,如果循環(huán)次數(shù)很大,循環(huán)體內(nèi)不好的代碼對(duì)效率的影響就會(huì)被放大而變的突出。讓我們看看下面的代碼片:..
Vector vect = new Vector(1000);
...
for( inti=0; i<vect.size(); i++){
...
}
for循環(huán)部分改寫成:
int size = vect.size();
for( int i=0; i>size; i++){
...
}
如果size=1000,就可以減少1000次size()的系統(tǒng)調(diào)用開銷,避免了循環(huán)體重復(fù)調(diào)用。
再看如下的代碼片:..
for (int i = 0;i <100000;i++)
if (i%10 == 9) {
... // 每十次執(zhí)行一次
}
改寫成也可以提高效率:..
for(inti =0,j =10; i<100000; i++,j--){
if(j == 0){
... // 每十次執(zhí)行一次
j = 10;
}
}
所以,當(dāng)有較大的循環(huán)時(shí),應(yīng)該檢查循環(huán)內(nèi)是否有效率不高的地方,尋找更優(yōu)的方案加以改進(jìn)。
3、少用new初始化一個(gè)實(shí)例:
盡量少用new來初始化一個(gè)類的實(shí)例,當(dāng)一個(gè)對(duì)象是用new進(jìn)行初始化時(shí),其構(gòu)造函數(shù)鏈的所有構(gòu)造函數(shù)都被調(diào)用到,所以new操作符是很消耗系統(tǒng)資源的,new一個(gè)對(duì)象耗時(shí)往往是局部變量賦值耗時(shí)的上千倍。同時(shí),當(dāng)生成對(duì)象后,系統(tǒng)還要花時(shí)間進(jìn)行垃圾回收和處理。
當(dāng)new創(chuàng)建對(duì)象不可避免時(shí),注意避免多次的使用new初始化一個(gè)對(duì)象。
盡量在使用時(shí)再創(chuàng)建該對(duì)象。如:
NewObject object = new NewObject();
int value;
if(i>0 )
{
value =object.getValue();
}
上面一段代碼可以修改為:
int value;
if(i>0 )
{
NewObject object = new NewObject();
Value =object.getValue();
}
另外,應(yīng)該盡量重復(fù)使用一個(gè)對(duì)象,而不是聲明新的同類對(duì)象。一個(gè)重用對(duì)象的方法是改變對(duì)象的值,如可以通過setValue之類的方法改變對(duì)象的變量達(dá)到重用的目的。
4、選擇合適的方法調(diào)用:
在Java中,一切都是對(duì)象,如果有方法(Method)調(diào)用,處理器先要檢查該方法是屬于哪個(gè)對(duì)象,該對(duì)象是否有效,對(duì)象屬于什么類型,然后選擇合適的方法并調(diào)用。
可以減少方法的調(diào)用,同樣一個(gè)方法:
public void CallMethod(int i ){
if( i ==0 ){
return;
}
... // 其他處理
}
如果直接調(diào)用,
int i = 0;
...
CallMethod(i);
上面的代碼,就應(yīng)該寫成:
int i = 0;
...
if( i ==0 ){
CallMethod(i);
}
不影響可讀性等情況下,可以把幾個(gè)小的方法合成一個(gè)大的方法。
另外,在方法前加上final,private關(guān)鍵字有利于編譯器的優(yōu)化。
5、異常處理技巧:
異常是Java的一種錯(cuò)誤處理機(jī)制,對(duì)程序來說是非常有用的,但是異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象,并進(jìn)行相關(guān)的處理,造成系統(tǒng)的開銷,所以異常應(yīng)該用在錯(cuò)誤處理的情況,不應(yīng)該用來控制程序流程,流程盡量用while,if等處理。
在不是很影響代碼健壯性的前提下,可以把幾個(gè)try/catch塊合成一個(gè)。
6、盡量使用局部變量和靜態(tài)變量:
盡量使用局部變量,調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack) 中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。
盡量使用靜態(tài)變量,即加修飾符static,如果類中的變量不會(huì)隨他的實(shí)例而變化,就可以定義為靜態(tài)變量,從而使他所有的實(shí)例都共享這個(gè)變量。
7、同步處理技巧:
同步主要出現(xiàn)在多線程的情況,為多線程同時(shí)運(yùn)行時(shí)提供對(duì)象數(shù)據(jù)安全的機(jī)制,多線程是比較復(fù)雜話題,應(yīng)用多線程也是為了獲得性能的提升,應(yīng)該盡可能減少同步。
另外,如果需要同步的地方,可以減少同步的代碼段,如只同步某個(gè)方法或函數(shù),而不是整個(gè)代碼。
8、盡可能的使用Java自身提供的API:
Java的API一般都做了性能的考慮,如果完成相同的功能,優(yōu)先使用API而不是自己寫的代碼,如數(shù)組復(fù)制通常的代碼如下:
int size = 1000;
String[] strArray1 = new String[size];
String[] strArray2 = new String[size];
for(inti=0;i<size;i++){ // 賦值
strArray1 = (new String(''Array: '' + i));
}
for(inti=0;i<size;i++){ // 復(fù)制
strArray2=(new String((String)a));
}
上面那段代碼,如果使用Java提供的API,就可以提高性能:
int size = 1000;
String[] strArray1 = new String[size];
String[] strArray2 = new String[size];
for(inti=0;i<size;i++){ // 賦值
strArray1 = (new String(''Array: '' + i));
}
System.arraycopy(strArray1,0,strArray2,0,size); // 復(fù)制
同樣的一個(gè)規(guī)則是,當(dāng)有大量數(shù)據(jù)的復(fù)制時(shí),應(yīng)該使用System.arraycopy()。
9、盡量減少I/O操作:
輸入/輸出(I/O)包括很多方面,我們知道,進(jìn)行I/O操作是很消耗系統(tǒng)資源的。程序中應(yīng)該盡量少用I/O操作。使用時(shí)可以注意: . 合理控制輸出函數(shù)System.out.println()對(duì)于大多時(shí)候是有用的,特別是系統(tǒng)調(diào)試的時(shí)候,但也會(huì)產(chǎn)生大量的信息出現(xiàn)在控制臺(tái)和日志上,同時(shí)輸出時(shí),有序列化和同步的過程,造成了開銷。
特別是在發(fā)行版中,要合理的控制輸出,可以在項(xiàng)目開發(fā)時(shí),設(shè)計(jì)好一個(gè)Debug的工具類,在該類中可以實(shí)現(xiàn)輸出開關(guān),輸出的級(jí)別,根據(jù)不同的情況進(jìn)行不同的輸出的控制。
10、盡量使用緩存:
讀寫內(nèi)存要比讀寫硬盤上的文件要快很多,應(yīng)盡可能使用緩沖,以便直接從內(nèi)存中讀取數(shù)據(jù)。
盡可能使用帶有Buffer的類代替沒有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來進(jìn)行處理I/O操作。
同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高
11、盡量不使用同步:
Servlet是多線程的,以處理不同的請(qǐng)求,基于前面同步的分析,如果有太多的同步就失去了多線程的優(yōu)勢(shì)了。
12、不用保存太多的信息在HttpSession中
很多時(shí)候,存儲(chǔ)一些對(duì)象在HttpSession中是有必要的,可以加快系統(tǒng)的開發(fā),如網(wǎng)上商店系統(tǒng)會(huì)把購(gòu)物車信息保存在該用戶的Session中,但當(dāng)存儲(chǔ)大量的信息或是大的對(duì)象在會(huì)話中時(shí),是有害的,特別是當(dāng)系統(tǒng)中用戶的訪問量很大,對(duì)內(nèi)存的需求就會(huì)很高。
具體開發(fā)時(shí),在這兩者之間應(yīng)作好權(quán)衡。
13、清除SESSION
通常情況,當(dāng)達(dá)到設(shè)定的超時(shí)時(shí)間時(shí),同時(shí)有些Session沒有了活動(dòng),服務(wù)器會(huì)釋放這些沒有活動(dòng)的Session,.. 不過這種情況下,特別是多用戶并訪時(shí),系統(tǒng)內(nèi)存要維護(hù)多個(gè)的無效Session。
當(dāng)用戶退出時(shí),應(yīng)該手動(dòng)釋放,回收資源,實(shí)現(xiàn)如下:..
HttpSession theSession = request.getSession();
// 獲取當(dāng)前Session
if(theSession != null){
theSession.invalidate(); // 使該Session失效
}
14、緩存Home接口
EJB庫(kù)使用Enterprise Bean 的客戶端通過它的Home接口創(chuàng)建它的實(shí)例。客戶端能通過JNDI訪問它。服務(wù)器通過Lookup方法來獲取。
JNDI是個(gè)遠(yuǎn)程對(duì)象,通過RMI方式調(diào)用,對(duì)它的訪問往往是比較費(fèi)時(shí)的。所以,在設(shè)計(jì)時(shí)可以設(shè)計(jì)一個(gè)類專門用來緩存Home接口,在系統(tǒng)初始化時(shí)就獲得需要的Home接口并緩存,以后的引用只要引用緩存即可。
15、使用快速度的Jdbc驅(qū)動(dòng)
JDBC API包括兩種實(shí)現(xiàn)接口形式,一種是純Java實(shí)現(xiàn)的驅(qū)動(dòng),一種利用ODBC驅(qū)動(dòng)和數(shù)據(jù)庫(kù)客戶端實(shí)現(xiàn),具體有四種驅(qū)動(dòng)模式:
第一類:JDBC-ODBC橋,再加上ODBC驅(qū)動(dòng)程序。
第一類JDBC驅(qū)動(dòng)程序是JDBC-ODBC橋再加上一個(gè)ODBC驅(qū)動(dòng)程序。建議第一類驅(qū)動(dòng)程序只用于原型開發(fā),而不要用于正式的運(yùn)行環(huán)境。橋接驅(qū)動(dòng)程序由Sun提供,它的目標(biāo)是支持傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)。Sun為該軟件提供關(guān)鍵問題的補(bǔ)丁,但不為該軟件的最終用戶提供支持。一般地,橋接驅(qū)動(dòng)程序用于已經(jīng)在ODBC技術(shù)上投資的情形,例如已經(jīng)投資了Windows應(yīng)用服務(wù)器。
盡管Sun提供了JDBC-ODBC橋接驅(qū)動(dòng)程序,但由于ODBC會(huì)在客戶端裝載二進(jìn)制代碼和數(shù)據(jù)庫(kù)客戶端代碼,這種技術(shù)不適用于高事務(wù)性的環(huán)境。另外,第一類JDBC驅(qū)動(dòng)程序不支持完整的Java命令集,而是局限于ODBC驅(qū)動(dòng)程序的功能,這種驅(qū)動(dòng)方式也叫胖客戶,主要用于低并發(fā)請(qǐng)求,大數(shù)據(jù)量傳輸?shù)膽?yīng)用。
第二類:本機(jī)API,部分是Java的驅(qū)動(dòng)程序。
第二類JDBC驅(qū)動(dòng)程序是本機(jī)API的部分Java代碼的驅(qū)動(dòng)程序,用于把JDBC調(diào)用轉(zhuǎn)換成主流數(shù)據(jù)庫(kù)API的本機(jī)調(diào)用。這類驅(qū)動(dòng)程序也存在與第一類驅(qū)動(dòng)程序一樣的性能問題,即客戶端載入二進(jìn)制代碼的問題,而且它們被綁定了特定的平臺(tái)。
第二類驅(qū)動(dòng)程序要求編寫面向特定平臺(tái)的代碼,主流的數(shù)據(jù)庫(kù)廠商,例如Oracle和IBM,都為它們的企業(yè)數(shù)據(jù)庫(kù)平臺(tái)提供了第二類驅(qū)動(dòng)程序,使用這些驅(qū)動(dòng)程序的開發(fā)者必須及時(shí)跟進(jìn)不同數(shù)據(jù)庫(kù)廠商針對(duì)不同操作系統(tǒng)發(fā)行的各個(gè)驅(qū)動(dòng)程序版本。
另外,由于第二類驅(qū)動(dòng)程序沒有使用純Java的API,把Java應(yīng)用連接到數(shù)據(jù)源時(shí),往往必須執(zhí)行一些額外的配置工作。很多時(shí)候,第二類驅(qū)動(dòng)程序不能在體系結(jié)構(gòu)上與大型主機(jī)的數(shù)據(jù)源兼容;即使做到了兼容,效果也是比較差。
第一類和第二類驅(qū)動(dòng)的比較
第一類和第二類驅(qū)動(dòng)的比較
第三類:面向數(shù)據(jù)庫(kù)中間件的純Java驅(qū)動(dòng)程序
第三類JDBC驅(qū)動(dòng)程序是面向數(shù)據(jù)庫(kù)中間件的純Java驅(qū)動(dòng)程序,JDBC調(diào)用被轉(zhuǎn)換成一種中間件廠商的協(xié)議,中間件再把這些調(diào)用轉(zhuǎn)換到數(shù)據(jù)庫(kù)API。第三類JDBC驅(qū)動(dòng)程序的優(yōu)點(diǎn)是它以服務(wù)器為基礎(chǔ),也就是不再需要客戶端的本機(jī)代碼,這使第三類驅(qū)動(dòng)程序要比第一、二兩類快。另外,開發(fā)者還可以利用單一的驅(qū)動(dòng)程序連接到多種數(shù)據(jù)庫(kù)。
第四類:直接面向數(shù)據(jù)庫(kù)的純Java驅(qū)動(dòng)程序。
第四類JDBC驅(qū)動(dòng)程序是直接面向數(shù)據(jù)庫(kù)的純Java驅(qū)動(dòng)程序,即所謂的“瘦”(thin)驅(qū)動(dòng)程序,它把JDBC調(diào)用轉(zhuǎn)換成某種直接可被DBMS使用的網(wǎng)絡(luò)協(xié)議,這樣,客戶機(jī)和應(yīng)用服務(wù)器可以直接調(diào)用DBMS服務(wù)器。對(duì)于第四類驅(qū)動(dòng)程序,不同DBMS的驅(qū)動(dòng)程序不同。因此,在一個(gè)異構(gòu)計(jì)算環(huán)境中,驅(qū)動(dòng)程序的數(shù)量可能會(huì)比較多。但是,由于第四類驅(qū)動(dòng)程序具有較高的性能,能夠直接訪問DBMS,所以這一問題就不那么突出了, 這種驅(qū)動(dòng)方式,主要用于高并發(fā),低數(shù)據(jù)量請(qǐng)求的應(yīng)用中。
第三類和第四類驅(qū)動(dòng)的比較
第三類和第四類驅(qū)動(dòng)的比較
為了提高訪問數(shù)據(jù)庫(kù)的性能,我們還可以使用JDBC 2.0的一些規(guī)范和特性,JDBC是占用資源的,在使用數(shù)據(jù)庫(kù)連接時(shí)可以使用連接池Connection Pooling,避免頻繁打開、關(guān)閉Connection。而我們知道,獲取Connection是比較消耗系統(tǒng)資源的。
Connection緩沖池:當(dāng)一個(gè)應(yīng)用程序關(guān)閉一個(gè)數(shù)據(jù)庫(kù)連接時(shí),這個(gè)連接并不真正釋放而是被循環(huán)利用,建立連接是消耗較大的操作,循環(huán)利用連接可以顯著的提高性能,因?yàn)榭梢詼p少新連接的建立。
一個(gè)通過DataSource獲取緩沖池獲得連接,并連接到一個(gè)CustomerDB數(shù)據(jù)源的代碼演示如下:
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(''jdbc/CustomerDB'');
Connection conn = dataSource.getConnection(''password'',''username'');
16、緩存DataSorce
一個(gè)DataSource對(duì)象代表一個(gè)實(shí)際的數(shù)據(jù)源。這個(gè)數(shù)據(jù)源可以是從關(guān)系數(shù)據(jù)庫(kù)到表格形式的文件,完全依賴于它是怎樣實(shí)現(xiàn)的,一個(gè)數(shù)據(jù)源對(duì)象注冊(cè)到JNDI名字服務(wù)后,應(yīng)用程序就可以從JNDI服務(wù)器上取得該對(duì)象,并使用之和數(shù)據(jù)源建立連接。
通過上面的例子,我們知道DataSource是從連接池獲得連接的一種方式,通過JNDI方式獲得,是占用資源的。
為了避免再次的JNDI調(diào)用,可以系統(tǒng)中緩存要使用的DataSource。
及時(shí)關(guān)閉使用過的資源
互聯(lián)網(wǎng)應(yīng)用系統(tǒng)一般是并發(fā)的系統(tǒng),在每次申請(qǐng)和使用完資源后,應(yīng)該釋放供別人使用,使用完成后應(yīng)該保證徹底的釋放。
17、架構(gòu)選型
在網(wǎng)站W(wǎng)eb應(yīng)用開...
怎樣去建設(shè)和運(yùn)營(yíng)一家房地產(chǎn)網(wǎng)站呢? 運(yùn)營(yíng)視頻課程
最近啊,有部分咨詢恒泰博遠(yuǎn)的用戶在咨詢房地產(chǎn)小程序開發(fā)、房地產(chǎn)APP開發(fā)的時(shí)候,同時(shí)也問道該怎樣去建設(shè)和運(yùn)營(yíng)一家房地產(chǎn)網(wǎng)站。
為此今天小編就為大家來詳細(xì)介紹一下房地產(chǎn)網(wǎng)站建設(shè)和經(jīng)營(yíng)的方法,旨在為想要投資房地產(chǎn)網(wǎng)站的朋友們提供一點(diǎn)相關(guān)的經(jīng)營(yíng),因?yàn)楫吘购闾┎┻h(yuǎn)科技是做軟件開發(fā)的,也為很多用戶進(jìn)行“網(wǎng)站定制開發(fā)”,所以希望我們能為房地產(chǎn)商家企業(yè)提供專業(yè)化的房地產(chǎn)網(wǎng)站能建設(shè)開發(fā)。
1房地產(chǎn)在經(jīng)濟(jì)中始終占據(jù)著重要的地位,特別是最近幾年,房?jī)r(jià)一直在上漲,各大房產(chǎn)公司都賺到了不少的錢。如今地產(chǎn)商正在通過網(wǎng)絡(luò)進(jìn)行新一輪的競(jìng)爭(zhēng),通過網(wǎng)路能夠獲得一定的瀏覽量,對(duì)自己的房產(chǎn)公司起到一定的宣傳作用,而且也能獲得不少的客源,這樣的房產(chǎn)市場(chǎng),也吸引不少人去做一個(gè)專門的房地產(chǎn)網(wǎng)站去提供房產(chǎn)的各種服務(wù),那么應(yīng)該怎么去建設(shè)和經(jīng)營(yíng)一家房地產(chǎn)網(wǎng)站呢?還希望大家記住以下4點(diǎn)!
1、域名的選擇
開發(fā)一家知名的房產(chǎn)信息網(wǎng)站,離開不了一個(gè)簡(jiǎn)短易記的域名,在注冊(cè)域名的時(shí)候,要與房產(chǎn)信息網(wǎng)站的logo,名字等相符合,最好是簡(jiǎn)短容易記住的域名是再合適不過了,如果域名又復(fù)雜又不容易記,誰(shuí)還會(huì)去訪問這個(gè)網(wǎng)站呢?所以對(duì)網(wǎng)站的域名需要慎重選擇。
22、網(wǎng)站的開發(fā)和設(shè)計(jì)
網(wǎng)站的開發(fā)和設(shè)計(jì)離不開專門人才,想要建設(shè)一個(gè)專業(yè)的房地產(chǎn)網(wǎng)站,就要找相應(yīng)的人才進(jìn)行網(wǎng)站的開發(fā)與設(shè)計(jì)。如果自己不具備這樣的條件,那就需要找專業(yè)的網(wǎng)站建設(shè)開發(fā)公司,因?yàn)榫W(wǎng)站開發(fā)和設(shè)計(jì)需要有專業(yè)的人才:技術(shù)人員,美工,編輯人員等,有了專門人才的幫助,就能夠開發(fā)出簡(jiǎn)潔大方,內(nèi)容豐富的房地產(chǎn)網(wǎng)站。很多來找北京恒泰博遠(yuǎn)科技來做網(wǎng)站建設(shè)開發(fā)的企業(yè)商家也正是看中了這一點(diǎn),所以選擇相信恒泰博遠(yuǎn)并達(dá)成合作!
3、網(wǎng)站的推廣
房地產(chǎn)信息網(wǎng)站在建設(shè)的初期,是不被人知曉的,需要投入一定的宣傳成本,對(duì)該網(wǎng)站進(jìn)行大力的宣傳,就能夠?yàn)榫W(wǎng)站帶來一定的客流量,提高網(wǎng)站的網(wǎng)絡(luò)排名,贏得更多的用戶。
34、網(wǎng)站的經(jīng)營(yíng)
房地產(chǎn)網(wǎng)站的建設(shè)前期需要投入開發(fā)和宣傳等成本,那么網(wǎng)站是如何通過經(jīng)營(yíng)獲得利潤(rùn)呢?當(dāng)房地產(chǎn)網(wǎng)站有了一定的用戶,就會(huì)有一些樓盤廣告的合作找上門來,除了廣告,還可以通過中介公司進(jìn)行收費(fèi)從而達(dá)到盈利的目標(biāo)。
4如今房地產(chǎn)信息網(wǎng)站數(shù)量眾多,但是真正享有知名度的則比較少,希望今天恒泰博遠(yuǎn)網(wǎng)站定制開發(fā)為大家介紹的房地產(chǎn)網(wǎng)站相關(guān)的建設(shè)和運(yùn)營(yíng)的方法能夠?yàn)榇蠹規(guī)硪欢ǖ膸椭7康禺a(chǎn)商家企業(yè)需要定制開發(fā)符合企業(yè)自身發(fā)展多的網(wǎng)站,以及能夠?yàn)榭蛻籼峁┫嚓P(guān)信息及服務(wù)的網(wǎng)站,這樣的房地產(chǎn)網(wǎng)站才能收到用戶的青睞,更是對(duì)企業(yè)形象及品牌的宣傳,加強(qiáng)用戶對(duì)企業(yè)的信任度!
網(wǎng)站建設(shè)開發(fā)如何才能有效提高轉(zhuǎn)化效果 轉(zhuǎn)化視頻課程
無論什么樣的網(wǎng)站,最終是給用戶看的。網(wǎng)站的設(shè)計(jì)制作只有從用戶角度出發(fā),并真正滿足用戶所需,才能讓網(wǎng)站的價(jià)值得到發(fā)揮。很多企業(yè)可能會(huì)遇到這樣的問題,就是自己的企業(yè)網(wǎng)站轉(zhuǎn)化效果很不好,相信多數(shù)企業(yè)都是想找的好的解決方法!下面就來詳細(xì)的介紹一下吧!
分析網(wǎng)站瀏覽者地域分布
網(wǎng)站訪問流量分析,都有地域分布一樣,其原理基于訪客所在IP地址分析歸類。通過訪問地域分析,我們可以知道網(wǎng)站訪問者大致的地域分布,這就為我們網(wǎng)站設(shè)計(jì)制作或者重新改版提供了方向。其一是根據(jù)不同區(qū)域的訪問者,其審美訴求設(shè)計(jì)網(wǎng)站,比如很多外貿(mào)類型的網(wǎng)站,其就要結(jié)合網(wǎng)站訪客所在地區(qū)的語(yǔ)言、文化和審美認(rèn)知設(shè)計(jì)網(wǎng)站。
分析網(wǎng)站瀏覽者設(shè)備信息
網(wǎng)站跟用戶看,但是網(wǎng)站需要客戶端的計(jì)算機(jī)才能展現(xiàn)。我們對(duì)網(wǎng)站流量數(shù)據(jù)進(jìn)行總結(jié)分析,就可以清晰的獲知網(wǎng)站訪客使用了哪些操作系統(tǒng)、哪些瀏覽器、哪些終端設(shè)備,以及這些設(shè)備分別具備了怎樣的分辨率。知道這些信息后,我們?cè)谶M(jìn)行網(wǎng)站建設(shè)的時(shí)候,就可以做到有的放矢。如果用戶訪問網(wǎng)站,已經(jīng)很少使用IE6.0,那么我們?cè)诮ㄔO(shè)網(wǎng)站的時(shí)候,就可以忽略這里瀏覽器,從而時(shí)間更炫動(dòng)的人機(jī)交互效果。
分析網(wǎng)站瀏覽者關(guān)注熱點(diǎn)
雖然我們希望網(wǎng)站建設(shè)后,能給用戶帶來良好的體驗(yàn),能讓營(yíng)銷推廣效果倍增,但實(shí)際上并不是每個(gè)頁(yè)面都能發(fā)揮應(yīng)有的作用。而且,用戶對(duì)網(wǎng)站的需求也并非一成不變,所以我們需要結(jié)合網(wǎng)站流量數(shù)據(jù)進(jìn)行系統(tǒng)分析,從而了解并理解用戶對(duì)網(wǎng)站關(guān)注熱點(diǎn)所在。通過每個(gè)頁(yè)面的訪客停留時(shí)間,以及每個(gè)欄目的頁(yè)面訪問深度,我們可以因應(yīng)找出網(wǎng)站瀏覽者跳出原因,并加以改進(jìn)優(yōu)化。
易初傳媒是一家專業(yè)的網(wǎng)站建設(shè)公司,我們多年從事網(wǎng)站制作開發(fā)工作,為企業(yè)量身打造屬于自己公司文化的營(yíng)銷型網(wǎng)站,還包括H5制作開發(fā)、APP開發(fā)、微信小程序開發(fā)等!為您提供網(wǎng)站建設(shè)一站式服務(wù)!