Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些內置對象,Tomcat,Cookie和Session的作用以及區別,oracle,MYSQL等面試題總結
- 2020 年 8 月 14 日
- 筆記
1、 什麼是Spring,談談你對Spring的理解
Spring是我們JAVA開發人員在搭建後台時選用的一個輕量級的開源框架,Spring框架目前也是功能豐富,十分優秀企業級採用最多的一個框架。
Spring是一個IOC和AOP容器框架。它主要核心是:
(1).控制反轉(IOC):以前傳統的java開發模式中,當需要一個對象時我們,我們會自己使用new或者getInstance等直接或者間接調用構造方法創建一個對象,而在Spring開發模式中,Spring容器使用了工廠模式為我們創建了所需要的對象,我們使用時不需要自己去創建,直接調用Spring為我們提供的對象即可,這就是控制反轉的思想。
dao介面的實現不再是業務邏輯層調用工廠類去獲取,而是通過spring容器來自動的為我們的業務層設置Dao的實現類,這樣整個過程就反過來,以前是我們業務層主動去獲取dao,而現在是dao主動被設置到業務邏輯層中來了,這個也就是反轉控制的由來。
實例化一個衛生java對象有三種方式:使用類構造器,使用靜態工廠方法,使用實例工廠方法,當使用spring時我們就不需要關心通過何種方式實例化一個對象,spring通過控制反轉機制自動為我們實例化一個對象。
(2).面向切面編程(AOP):在面向對象編程(OOP)思想中,將程式中的交叉業務邏輯(比如安全,日誌,事務)公共的部分,封裝成一個切面,然後注入到目標業務邏輯中去。這樣就不用每次拋異常都要手動記錄日誌。Spring的事務管理用到的就是AOP這樣也可以提高程式的內聚性。這樣的過程就是面向切面的思想。
(3).依賴注入(DI):Spring有三種注入方式:1,根據屬性注入也叫setter方法注入。2,根據構造方法注入。3,根據註解進行注入(推薦)。Spring使用Java Bean對象的Set方法或者帶參數的構造方法為我們在創建所需對象時將其屬性自動設置所需要的值的過程就是依賴注入的基本思想。
2、 說說SpringMVC框架的工作原理
SpringMVC框架介紹:
Spring MVC是Spring 框架提供的構建Web 應用程式的全功能MVC 模組。Spring MVC框架是高度可配置的,而且包含多種視圖技術,完全融合Spring框架,整體的模組化讓WEB程式的開發變得非常靈活便捷。
Spring MVC 分離了控制器、模型對象、分派器以及處理程式對象的角色,這種分離讓它們更容易進行訂製。
Spring的MVC框架主要由DispatcherServlet、處理器映射、處理器(控制器)、視圖解析器、視圖組成。
SpringMVC運行原理:
1、客戶端請求提交到DispatcherServlet。
2、由DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller。
3、DispatcherServlet將請求提交到Controller。
4、Controller調用業務邏輯處理後,返回ModelAndView對象。
5、DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖。
6、視圖負責將結果顯示到客戶端。
3、 談談對MyBatis框架的理解
一、Mybatis是什麼?
Mybatis是一個基於Java的持久層框架。這個持久層框架包括SQLMaps和DataAccessObjects(DAO)。
MyBatis 是支援訂製化SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis避免了幾乎所有的JDBC程式碼和手工設置參數以及抽取結果集。MyBatis使用簡單的XML或註解來配置和映射基本體,將介面和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成資料庫中的記錄。
二、Mybatis的整個的執行原理:
1、MyBatis應用程式根據XML配置文件創建SqlSessionFactory。
2、SqlSessionFactory在根據配置,配置來源於兩個地方,一處是配置文件一處是Java程式碼的註解,獲取一個SqlSession。
3、SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession實例直接運行映射的sql語句,完成對數據的增刪改查和事務提交等,用完之後關閉SqlSession。
三、MyBatis的優缺點
優點:
1、簡單易學mybatis本身就輕量而且簡單,沒有任何第三方依賴。
2、Mybatis實現了介面綁定,使用更加方便。Mybatis實現了DAO介面與xml映射文件的綁定,自動為我們生成介面的具體實現,使用起來變得更加省事和方便。
3、靈活mybatis不會對應用程式或者資料庫的現有設計強加任何影響。sql寫在xml里,便於統一管理和優化。
4、解除sql與程式程式碼的耦合通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性。
5、提供映射標籤,支援對象與資料庫的orm欄位關係映射。
6、提供對象關係映射標籤,支援對象關係組建維護。
7、提供xml標籤,支援編寫動態sql。
缺點:
1、編寫SQL語句時工作量很大,尤其是欄位多、關聯表多時,更是如此。
2、SQL語句依賴於資料庫,導致資料庫移植性差,不能更換資料庫。
3、雖然簡化了數據綁定程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。
4、二級快取機制不佳。
4、 講一下MyBatis的快取
MyBatis的快取分為一級快取和二級快取:
一級快取放在session裡面,默認就有。
二級快取放在它的命名空間里,默認是打開的,
使用二級快取屬性類需要實現Serializable序列化介面(可用來保存對象的狀態),可在它的映射文件中配置
5、 Hibernate工作原理及為什麼要用它
Hibernate 簡介:
Hibernate是一個開源框架,它是對象關係映射的框架,它對JDBC做了輕量級的封裝,而我們Java程式設計師可以使用面向對象的思想來操縱資料庫。
Hibernate核心介面:
session:負責被持久化對象CRUD操作。
sessionFactory:負責初始化hibernate,創建session對象。
configuration:負責配置並啟動hibernate,創建SessionFactory。
Transaction:負責事物相關的操作。
Query和Criteria介面:負責執行各種資料庫查詢。
為什麼要用Hibernate:
1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了數據訪問層繁瑣的重複性程式碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作。
3. Hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。
4. Hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。
6、 簡述 Hibernate 和 JDBC 的優缺點
JDBC與Hibernate在性能上相比,JDBC靈活性有優勢。而Hibernate在易學性,易用性上有些優勢。當用到很多複雜的多表聯查和複雜的資料庫操作時,JDBC有優勢。
相同點:
◆兩者都是Java的資料庫操作中間件。
◆兩者對於資料庫進行直接操作的對象都不是執行緒安全的,都需要及時關閉。
◆兩者都可以對資料庫的更新操作進行顯式的事務處理。
不同點:
◆使用的SQL語言不同:JDBC使用的是基於關係型資料庫的標準SQL語言,Hibernate使用的是HQL(Hibernate query language)語言
◆操作的對象不同:JDBC操作的是數據,將數據通過SQL語句直接傳送到資料庫中執行,Hibernate操作的是持久化對象,由底層持久化對象的數據更新到資料庫中。
◆數據狀態不同:JDBC操作的數據是「瞬時」的,變數的值無法與資料庫中的值保持一致,而Hibernate操作的數據是可持久的,即持久化對象的數據屬性的值是可以跟資料庫中的值保持一致的。
7、 MyBatis與Hibernate有什麼不同?
Hibernate與Mybatis對比總結:
一、兩者相同點:
1、都屏蔽了JDBC的底層訪問細節,使用我們不用與JDBC打交道,就可以訪問數據。
2、都是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然後由SessionFactory生成Session,最後由Session來開啟執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。Hibernate和MyBatis都支援JDBC和JTA事務處理。
二、不同點:
1、Hibernate是全自動的,而Mybatis是半自動的。
Hibernate完全可以通過對象關係模型實現對資料庫的操作,擁有完整的JavaBean對象與資料庫的映射結構來自動生成sql。而Mybatis僅有基本的欄位映射,對象數據以及對象實際關係仍然需要通過手寫sql來實現和管理。
2、Hibernate資料庫移植性遠大於Mybatis。
Hibernate通過它強大的映射結構和HQL語言,大大降低了對象與資料庫(Oracle、MySQL等)的耦合性,而Mybatis由於需要手寫sql,因此與資料庫的耦合性直接取決於程式設計師寫sql的方法,如果sql不具通用性而用了很多某資料庫特性的sql語句的話,移植性也會隨之降低很多,成本很高。
3、Hibernate擁有完整的日誌系統,Mybatis則欠缺一些。
Hibernate日誌系統非常健全,涉及廣泛,包括:sql記錄、關係異常、優化警告、快取提示、臟數據警告等;而Mybatis則除了基本記錄功能外,其它功能都薄弱很多。
4、sql直接優化上,Mybatis要比Hibernate方便很多。
由於Mybatis的sql都是寫在xml里,因此優化sql比Hibernate方便很多。而Hibernate的sql很多都是自動生成的,無法直接維護sql;雖有HQL,但功能還是不及sql強大,也就是說HQL是有局限的;Hibernate雖然也支援原生sql,但開發模式上卻與orm不同,需要轉換思維,因此使用上不是非常方便。總之寫sql的靈活度上Hibernate不及Mybatis。
8、 介紹一下Hibernate的快取。
一、Hibernate快取的作用:
Hibernate是一個持久層框架,經常訪問物理資料庫,為了降低應用程式對物理數據源訪問的頻次,從而提高應用程式的運行性能。快取內的數據是對物理數據源中的數據的複製,應用程式在運行時從快取讀寫數據,在特定的時刻或事件會同步快取和物理數據源的數據
二、Hibernate快取分類:
Hibernate快取包括兩大類:Hibernate一級快取和Hibernate二級快取。
Hibernate一級快取又稱為「Session的快取」,它是內置的,意思就是說,只要你使用hibernate就必須使用session快取。由於Session對象的生命周期通常對應一個資料庫事務或者一個應用事務,因此它的快取是事務範圍的快取。在第一級快取中,持久化類的每個實例都具有唯一的OID。
Hibernate二級快取又稱為「SessionFactory的快取」,由於SessionFactory對象的生命周期和應用程式的整個過程對應,因此Hibernate二級快取是進程範圍或者集群範圍的快取,有可能出現並發問題,因此需要採用適當的並發訪問策略,該策略為被快取的數據提供了事務隔離級別。第二級快取是可選的,是一個可配置的插件,在默認情況下,SessionFactory不會啟用這個插件。Hibernate內置支援的二級快取組件重用的有:EHCache,OSCache等。如果想用應用二級快取,需要在hibernate.cfg.xml文件中進行配置。
9、 說一說Servlet的生命周期?
servlet 有良好的生命周期的定義,包括載入和實例化、初始化、處理請求以及服務結束。
這個生命周期由javax.servlet.Servlet介面的init,service和destroy方法表達。
Servlet被伺服器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,
當伺服器決定將實例銷毀的時候調用其destroy方法。
web容器載入servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。
結束服務,web容器調用servlet的destroy()方法。
10、 jsp有哪些內置對象?作用分別是什麼?
JSP共有以下9個內置的對象:
request :用戶端請求,此請求會包含來自GET/POST請求的參數。
response :網頁傳回用戶端的回應
pageContext :網頁的屬性是在這裡管理
session :與請求有關的會話期
application :servlet 正在執行的內容
out :用來傳送回應的輸出
config:servlet的構架部件
page:JSP網頁本身
exception:針對錯誤網頁,未捕捉的例外
11、 JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼?
JSP和Servlet的區別:
1、Jsp是Servlet的一種簡化,使用Jsp只需要完成程式設計師需要輸出到客戶端的內容。
Jsp經編譯後就變成了Servlet.(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的程式碼,Web容器將JSP的程式碼編譯成JVM能夠識別的java類)。
2、Jsp更擅長表現於頁面顯示,Servlet更擅長於邏輯控制。
3、Servlet是個完整的Java類,這個類的Service方法用於生成對客戶端的響應。
聯繫:JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。JSP編譯後是「類servlet」。
總結:Servlet和JSP最主要的不同點在於:Servlet的應用邏輯是在Java文件中,並且完全從表示層中的HTML里分離開來。
而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。
JSP側重於視圖,Servlet主要用於控制邏輯。
12、 HTTP請求中GET與POST方式的區別。
一、本質區別:Get是向伺服器發索取數據的一種請求,而Post是向伺服器提交數據的一種請求。
二、安全性:get方式安全性低,post方式較安全。但是post方式執行效率要比get方式差一些。
三、機制:get是把參數數據隊列加到提交表單的action屬性所指的URL的後面,在URl中,值和表單中各個欄位一一對應,並且這些在URl中對用戶來說是可見的。
post 是通過HTTP post機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到action屬性所指的URL地址,對於用戶來說,這是不可見的。
總結:
1、get方式的安全性較post方式要差一些,所以,包含一些重要的資訊的話,簡易使用post數據提交方式。
2、在做查詢統計的時候,使用get方式要更好一些;而在做數據的添加,修改或刪除操作時,建議使用post數據提交方式。
13、 Tomcat的優化經驗。
Tomcat默認參數是為開發環境制定,而非適合生產環境,尤其是記憶體和執行緒的配置,默認都很低,容易成為性能瓶頸。
主要從以下三個方面優化:
1、tomcat記憶體優化:
linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入JAVA_OPTS=”-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai”
windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m
最大堆記憶體是1024m,對於現在的硬體還是偏低,實施時,還是按照機器具體硬體配置優化。
2、tomcat 執行緒優化:conf\service.xml中
<Connector port=”80″ protocol=”HTTP/1.1″ maxThreads=”600″ minSpareThreads=”100″ maxSpareThreads=”500″ acceptCount=”700″
connectionTimeout=”20000″ redirectPort=”8443″ />
maxThreads=”600″ //最大執行緒數
minSpareThreads=”100″//初始化時創建的執行緒數
maxSpareThreads=”500″//一旦創建的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒。
acceptCount=”700″//指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
3、設置session過期時間
conf\web.xml中通過參數指定:
<session-config>
<session-timeout>180</session-timeout>
</session-config> 180 單位為分鐘。
14、 談談Ajax的技術組成與核心原理。
AJax特點:局部刷新頁面、提高用戶的體驗度,數據從伺服器端載入。頁面在不刷新的情況下直接進行後台數據的交互,可以把以前一些伺服器負擔的工作轉嫁到客戶端,利用客戶端閑置的能力來處理,減輕伺服器和網路的負擔,節約空間和網路的租用成本。並且減輕伺服器的負擔,
ajax的原則是「按需取數據」(就是需要什麼會去自載入什麼),可以最大程度的減少繁複請求,和響應對伺服器造成的負擔。非同步(發送請求以後不等結果,由回調函數處理)
15、 說說Cookie和Session的作用以及區別。
一、Cookie 的工作原理:
Cookie實際上是一小段的文本資訊。客戶端請求伺服器,如果伺服器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給伺服器。伺服器檢查該Cookie,以此來辨認用戶狀態。
Cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成Cookie的作用範圍。若不設置過期時間,則表示這個Cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,Cookie就消失。這種生命期為瀏覽器會話期的Cookie被稱為會話Cookie。會話Cookie一般不存儲在硬碟上而是保存在記憶體里。若設置了過期時間,瀏覽器就會把Cookie保存到硬碟上,關閉後再次打開瀏覽器,這些Cookie仍然有效直到超過設定的過期時間。存儲在硬碟上的Cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對於保存在記憶體里的Cookie,不同的瀏覽器有不同的處理方式。
二、Session
Session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構來保存資訊。
當客戶端請求伺服器時候,伺服器首先檢查這個客戶端的請求里是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經為此客戶端創建過session,伺服器就按照session id把這個session檢索出來使用,如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,將這個session id在本次響應中返回給客戶端保存。
三、Cookie 和Session 的區別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session。
3、session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能考慮到減輕伺服器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議:將登陸資訊等重要資訊存放為SESSION 其他資訊如果需要保留,可以放在COOKIE中。
16、 Java中常用的設計模式?說明工廠模式?
一、Java中的23種設計模式:
Factory(工廠模式),Proxy(代理模式),Singleton(單例模式),Template Method(模板方法模式)等等
(註:其中最重用的有工廠模式、代理模式和單例模式)。
一, 單例模式:基本概念:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點
二、工廠模式:基本概念:為創建對象提供過渡介面,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的
- 簡單工廠模式Simple Factory:不利於產生系列產品;
- 工廠方法模式Factory Method:又稱為多形性工廠;
- 抽象工廠模式Abstract Factory:又稱為工具箱,產生產品族,但不利於產生新的產品;
工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。
三:建造(Builder)模式
基本概念:是一種對象構建的設計模式,它可以將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不同實現方法可以構造出不同表現(屬性)的對象。
Builder模式是一步一步創建一個複雜的對象,它允許用戶可以只通過指定複雜對象的類型和內容就可以構建它們。用戶不知道內部的具體構建細節。Builder模式是非常類似抽象工廠模式,細微的區別大概只有在反覆使用中才能體會到
17、談談Nginx伺服器。
Nginx不僅是一個小巧且高效的HTTP伺服器,也可以做一個高效的負載均衡反向代理,通過它接受用戶的請求並分發到多個Mongrel進程可以極大提高Rails應用的並發能力。
18、 WebService是什麼?
一、Web service 就是一個應用程式,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法通過Web來調用這個應用程式。我們把調用這個Web service 的應用程式叫做客戶。Web Service減少了應用介面的花費。Web Service為整個企業甚至多個組織之間的業務流程的集成提供了一個通用機制。
19、怎麼解決執行緒同步
同步是指同一時間段內只能運行一個執行緒,其他執行緒需要等待此執行緒完成後才可繼續執行。同步可以解決執行緒中資源共享的安全問題,主要通過同步程式碼塊和同步方法兩種方式完成。
1.1 同步程式碼塊
在Java程式中,程式碼塊是指使用「{}」括起來的一段程式碼。程式碼塊前添加了synchronized關鍵字即為同步程式碼塊。同步程式碼塊格式如下:Synchronized(同步對象){ //需要同步的程式碼} 1.2 同步方法 同步方法是指使用synchronized關鍵字聲明方法,即為方法加上資源訪問鎖,同一時間只允許一個執行緒調用同步方法,其他執行緒必須等待當前執行緒調用結束後才能調用同步方法。 2. 總結 Ø 執行緒是比進程更小的執行單位,是在進程的基礎上進行的進一步劃分。所謂多執行緒是指一個進程在執行過程中可以產生多個執行緒。 Ø Java中實現多執行緒有兩種方式:繼承Thread類和實現Runnable介面,前者不適合多個執行緒共享資源,而後者可以方便地實現資源共享。 Ø 解決執行緒中資源共享的安全問題可以使用同步程式碼塊和同步方法實現。 Ø 執行緒在整個生命周期中具有創建、就緒、運行、阻塞和終止5中狀態。
|
|
20、談談Quartz任務調度
Quartz框架是一個開源的企業級任務調度服務,已經被作為任務調度的良好解決方案。
Quartz框架核心概念
Quartz對任務調度進行了高度抽象,提出了3個核心概念,並在org.quartz包中通過介面和類進行了描述
任務:就是執行的工作內容。Quartz提供Job介面來支援任務定義
觸發器:定義觸發Job執行的時間觸發規則。Quartz提供Trigger類及其子類支援觸發器功能,
調度器:Quartz提供了Scheduler介面,將工作任務和觸發器綁定,保證任務可以在正確的時間執行
實現Quartz任務調度的步驟:
1,定義任務,通過實現org.quartz.Job介面,可以使java類變成可調度的任務。
重寫該介面中的一個方法,void execute(JobExecutionContext context),實現該介面來定義需要執行的任務
2,創建觸發器,觸發器,它用於定義Job何時執行。最常用的是SimpleTrigger和CronTrigger。一般來說,如果你需要在一個固定的時間和重複次數或者一個固定的間隔時間,那麼SimpleTrigger比較合適;如果你有許多複雜的作業調度,那麼CronTrigger比較合適。
3,創建對應的調度器
21、說說DOM4J怎麼使用的
dom4j是一個Java的XML API,類似於jdom,用來讀寫XML文件的,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源程式碼的軟體。
DOM4J的使用步驟:
1, 獲得Document對象
2, 節點相關操作
3, 屬性相關操作
4, 將文檔寫入XML文件
5, 字元串與XML的轉換
22、說一下你了解的shiro框架
Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。
主要功能有三個核心組件:Subject, SecurityManager 和 Realms.
Subject:即「當前操作用戶」。但是,在Shiro中,Subject這一概念並不僅僅指人,也可以是第三方進程、後台帳戶(Daemon Account)或其他類似事物。它僅僅意味著「當前跟軟體交互的東西」。但考慮到大多數目的和用途,你可以把它認為是Shiro的「用戶」概念。Subject代表了當前用戶的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通過SecurityManager來管理內部組件實例,並通過它來提供安全管理的各種服務。
Realm: Realm充當了Shiro與應用安全數據間的「橋樑」或者「連接器」。也就是說,當對用戶執行認證(登錄)和授權(訪問控制)驗證時,Shiro會從應用配置的Realm中查找用戶及其許可權資訊。可以配置多個Realm,但是至少需要一個。
23、講講你了解的WebSocket
WebSocket協議是基於TCP的一種新的網路協議。它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——允許伺服器主動發送資訊給客戶端。
http協議: HTTP的生命周期通過Request來界定,也就是一個Request 一個Response,那麼在HTTP1.0中,這次HTTP請求就結束了。但是請記住 Request = Response ,
在HTTP中永遠是這樣,也就是說一個request只能有一個response。而且這個response也是被動的,不能主動發起
Websocket是什麼樣的協議,具體有什麼優點:
首先Websocket是基於HTTP協議的,或者說借用了HTTP的協議來完成一部分握手。在握手階段是一樣的他解決了HTTP的這幾個難題。
被動性,當伺服器完成協議升級後(HTTP->Websocket),服務端就可以主動推送資訊給客戶端啦。只需要經過一次HTTP請求,就可以做到源源不斷的資訊傳送了。(在程式設計中,這種設計叫做回調,即:你有資訊了再來通知我,而不是我傻乎乎的每次跑來問你)
Websocket就解決了這樣一個難題,(在傳統的方式上,要不斷的建立,關閉HTTP協議,由於HTTP是非狀態性的,每次都要重新傳輸identity info(鑒別資訊),來告訴服務端你是誰。)建立後,可以直接跟伺服器建立持久連接,有資訊的時候伺服器主動響應客戶端 Websocket只需要一次HTTP握手,所以說整個通訊過程是建立在一次連接/狀態中,也就避免了HTTP的非狀態性,服務端會一直知道你的資訊,直到你關閉請求,
至於怎麼在不支援Websocket的客戶端上使用Websocket。。答案是:不能
但是可以通過long poll 和 ajax 輪詢來 模擬出類似的效果
24、談談你所了解的logback
簡單地說,Logback 是一個 Java 領域的日誌框架。它被認為是 Log4J 的繼承人。
Logback 主要由三個模組組成:logback-core、logback-classic、logback-access
logback-core 是其它模組的基礎設施,其它模組基於它構建,顯然,logback-core
提供了一些關鍵的通用機制。
logback-classic 的地位和作用等同於 Log4J,它也被認為是 Log4J 的一個改進版,並且它實現了簡單日誌門面 SLF4J
logback-access 主要作為一個與 Servlet 容器交互的模組,比如說 tomcat 或者 jetty,提供一些與 HTTP 訪問相關的功能。
Logback與Log4J的區別:
- 同樣的程式碼路徑,Logback 執行更快
- 原生實現了 SLF4J API(Log4J 還需要有一個中間轉換層)
- 更充分的測試
- 內容更豐富的文檔
- 配置文件自動熱載入
- 從 IO 錯誤中優雅恢復
- 自動刪除日誌歸檔
- 支援配置文件中加入條件判斷來適應不同的環境
25、什麼是中間件
中間件是一種獨立的系統軟體或服務程式,分散式應用軟體藉助這種軟體在不同的技術之間共享資源,中間件位於客戶機伺服器的作業系統之上,管理計算資源和網路通訊。
- 1, 中間件的特徵(平台化,應用支撐,軟體復用,耦合關係,互操作性)
- 2,中間件的分類(應用服務類中間件,應用集成類中間件,業務架構類中間件)
26、說說你了解的MQ
MQTT是IBM開發的一個基於二進位消息的發布/訂閱編程模式的消息通訊協議。mq是通訊中間件。他的作用是省去開發人員開發通訊工具的時間,節省開發成本,提高開發效率。
mq中一些名稱的概念:
隊列管理器:簡單的說就是一個大容器的管理員,這個大容器里放了很多東西。
隊列:大容器里的東西,存放消息的盒子。
通道:大容器和大容器之間,程式和容器之間進行通訊的途徑。
MQTT提供三種品質的服務,對重傳的控制:
1)至多一次,可能會出現丟包的現象。使用在對實時性要求不高的情況。這一級別可應用於如下情景,如環境感測器數據,丟失一次讀記錄無所謂,因為很快下一次讀記錄就會產生。
2)至少一次,保證包會到達目的地,但是可能出現重包。
3)正好一次,保證包會到達目的地,且不會出現重包的現象。這一級別可用於如計費系統等場景,在計費系統中,消息丟失或重複可能會導致生成錯誤的費用。
mq的通訊方式有兩種,通俗的說就是mq之間進行通訊,開發的程式和mq之間的通訊。
- 通過發送接收通道建立tcp連接進行消息傳輸,稱為server對server
- 通過伺服器連接通道進行傳輸,client對server
Mq實現通訊的步驟:
1,
首先要規劃好兩個隊列管理器之間使用的ip和埠
2,
建立隊列管理器
3,
啟動隊列管理器
4,
定義隊列管理器中的隊列和通道
5,
配置監聽器
6,
配置另外一個隊列管理器
7,
測試是否正常傳輸
27、HttpClient
HttpClient相比傳統JDK自帶的URLConnection,增加了易用性和靈活性(具體區別,日後我們再討論),它不僅是客戶端發送Http請求變得容易,而且也方便了開發人員測試介面(基於Http協議的),即提高了開發的效率,也方便提高程式碼的健壯性。因此熟練掌握HttpClient是很重要的必修內容,掌握HttpClient後,相信對於Http協議的了解會更加深入。
特性
1. 基於標準、純凈的java語言。實現了Http1.0和Http1.1
2. 以可擴展的面向對象的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支援HTTPS協議。
4. 通過Http代理建立透明的連接。
5. 利用CONNECT方法通過Http代理建立隧道的https連接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session,
SNPNEGO/Kerberos認證方案。
7. 插件式的自定義認證方案。
8. 隨身可靠的套接字工廠使它更容易的使用第三方解決方案。
9. 連接管理器支援多執行緒應用。支援設置最大連接數,同時支援設置每個主機的最大連接數,發現並關閉過期的連接。
10. 自動處理Set-Cookie中的Cookie。
11. 插件式的自定義Cookie策略。
12. Request的輸出流可以避免流中內容直接緩衝到socket伺服器。
13. Response的輸入流可以有效的從socket伺服器直接讀取相應內容。
14. 在http1.0和http1.1中利用KeepAlive保持持久連接。
15. 直接獲取伺服器發送的response code和 headers。
16. 設置連接超時的能力。
17. 實驗性的支援http1.1 response caching。
18. 源程式碼基於Apache License 可免費獲取。
使用方法
使用HttpClient發送請求、接收響應很簡單,一般需要如下幾步即可。
1. 創建HttpClient對象。
2. 創建請求方法的實例,並指定請求URL。如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。
3. 如果需要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(HttpEntity
entity)方法來設置請求參數。
4. 調用HttpClient對象的execute(HttpUriRequest request)發送請求,該方法返回一個HttpResponse。
5. 調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取伺服器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了伺服器的響應內容。程式可通過該對象獲取伺服器的響應內容。
6. 釋放連接。無論執行方法是否成功,都必須釋放連接(大量請求訪問時就必然會造成鏈接被佔滿,請求等待的情況)
28、java操作excle表格
Java 操作 Excel 最常用的就是JXL(Java
excel api)和POI,用起來挺簡單的,不過相應的其功能也並非很強大,夠用就行
jxl是一個韓國人寫的java操作excel的工具, 在java的開源世界中,有兩套比較有影響的API可供使用,一個是POI,一個是jExcelAPI(即jxl)。jxl功能相對POI比較弱一點。
但jxl對中文支援非常好,API是純Java的, 不依賴Windows系統,即使運行在Linux下,也同樣能夠正確的處理Excel文件。 需要補充說明的是,jxl對圖形和圖表的支援很有限,而且 僅僅識別PNG格式的圖片
使用jxl.jar
1.創建工作簿對象
WritableWorkbook workbook =
Workbook.createWorkbook(new File(“d:/AA/test.xls”));
// 創建新的一頁
WritableSheet sheet =
workbook.createSheet(“First Sheet”, 0);
2. 常用操作頁面方法「
WritableSheet sheet = workbook.getSheet(0); 獲取第一頁
Sheet.setName() 設置sheet名
workbook.removeSheet(2); // 移除多餘的標籤頁
sheet.mergeCells(0, 0, 4, 0); // 合併單元格,第一個參數是起始列,第二個參數是起始行,第三個參數是終止列,第四個參數是終止行
sheet.setRowView(0, 600); // 設置行的高度
sheet.setColumnView(0, 30); // 設置列的寬度
把創建的內容寫入到輸出流中,並關閉輸出流
workbook.write();
workbook.close();
os.close();
使用 poi
- 1
- 2
- 3
7、Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
在爬蟲採集網頁領域主要作用是用HttpClient獲取到網頁後具體的網頁提取需要的資訊的時候,就用到Jsoup,Jsoup可以使用強大的類似Jquery,css選擇器,來獲取需要的數據。
使用簡介:
String content = EntityUtils.toString(「實體對象「, “utf-8”);
Document document =
Jsoup.parse(content);//解析html返回doc對象
//根據標籤獲取內容
Elements elementsByTag = document.getElementsByTag(“title”);//獲取所有title標籤
Element element = elementsByTag.get(0);//獲取第0個title標籤
String text = element.text();//返回元素的文本
System.out.println(“網頁標題為:”+text);
//根據id獲取內容
Element elementById = document.getElementById(“site_nav_top”);
String text2 = elementById.text();
System.out.println(“網頁口號為:”+text2);
HttpClientUtils.closeHttpClient();
HTTP 簡介:
http協議:HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World
Wide Web )伺服器傳輸超文本到本地瀏覽器的傳送協議
HTTP是一個基於TCP/IP通訊協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等
HTTP之URL
HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的資訊
URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。以下面這個URL為例,介紹下普通URL的各部分組成:
//www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
從上面的URL可以看出,一個完整的URL包括以下幾部分:
1.協議部分:該URL的協議部分為「http:」,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在”HTTP”後面的「//」為分隔符
2.域名部分:該URL的域名部分為「www.aspxfans.com」。一個URL中,也可以使用IP地址作為域名使用
3.埠部分:跟在域名後面的是埠,域名和埠之間使用「:」作為分隔符。埠不是一個URL必須的部分,如果省略埠部分,將採用默認埠
4.虛擬目錄部分:從域名後的第一個「/」開始到最後一個「/」為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是「/news/」
5.文件名部分:從域名後的最後一個「/」開始到「?」為止,是文件名部分,如果沒有「?」,則是從域名後的最後一個「/」開始到「#」為止,是文件部分,如果沒有「?」和「#」,那麼從域名後的最後一個「/」開始到結束,都是文件名部分。本例中的文件名是「index.asp」。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名
6.錨部分:從「#」開始到最後,都是錨部分。本例中的錨部分是「name」。錨部分也不是一個URL必須的部分
7.參數部分:從「?」開始到「#」為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為「boardID=5&ID=24618&page=1」。參數可以允許有多個參數,參數與參數之間用「&」作為分隔符。
Java操作圖片
載入圖片:
- 先得到通過路徑得到要修改的圖片。
final BufferedImage image = ImageIO.read(圖片路徑);
Graphics2D g= image . createGraphics();//獲取圖片流 使用Graphics2D類接收
添加文字:
樣式字體的設置和文字的編寫。
- Graphics g = image.getGraphics();
- g.setFont(new Font(“微軟雅黑”,Font.BOLD ,48));//設置字體
- g.setColor(Color.red);//設置顏色
- g.drawString(文字,
x坐標,
y坐標);//文字的編寫及位置
g.dispose();
Graphics2D類:
Graphics2D ,Graphics 類,提供了對幾何形狀、坐標轉換、顏色管理和文本布局更為複雜的控制。它是用於在 Java(tm) 平台上呈現二維形狀、文本和影像的基礎類。驗證碼生成可以用到此類。
public abstract class
Graphics2Dextends Graphics 此 Graphics2D 類擴展了 Graphics 類,提供了對幾何形狀、坐標轉換、顏色管理和文本布局更為複雜的控制
使用簡介:
以下程式碼在點(3,3)與點(50,50)之間畫線段,在點(100,100)處畫一個點。
g.drawLine(3,3,50,50);//畫一條線段
g.drawLine(100,100,100,100);//畫一個點。
oracle 面試常見問題:
1.事務概念:事務是這樣一種機制,它確保多個SQL語句被當作單個工作單元來處理。
用戶定義的一個資料庫操作序列,這些操作要麼全部成功完成要麼全部不做,是一個不可分割的整體。定義事務的SQL語句有:BEGIN TRANSACTION,COMMIT,ROLLBACK。
事務的一致性:是事務原子性的體現,事務所對應的資料庫操作要麼成功要麼失敗沒有第三種情況。事務不管是提交成功與否都不能影響資料庫數據的一致性狀態。
事務的原子性:就是事務所包含的資料庫操作要麼都做,要麼都不做.
事務的隔離性:事務對數據的操作不能夠受到其他事務的影響。
事務的持續性:也就是說事務對數據的影響是永久的
2. view
的概念 ? 何時應用?
view 是對錶級數據的多角度的透視,適用於對查詢安全性、靈活性有一定要求的環境.
3. 介紹一下oracle的體系結構?
邏輯體系結構:塊,區,段,表空間
物理體系結構:表空間,三大文件
軟體體系結構:SGA,後台進程.
11 介紹一下oracle的體系結構?
邏輯體系結構:塊,區,段,表空間
物理體系結構:表空間,三大文件
軟體體系結構:SGA,後台進程.
013 簡述ORACLE的啟動和關閉各有多少步驟?
啟動:啟動實例、裝載資料庫數據、打開資料庫。 關閉:關閉資料庫、卸載資料庫數據、關閉實例。
014 ORACLE資料庫都有哪些類型的文件?
數據文件,控制文件,日誌文件,參數文件
015 在Oracle中,你所創建的表空間資訊放在哪裡?
存放在數據字典中,數據字典內容對應於系統表空間SYSTEM表空間。
016 ORACLE的基本數據類型有哪些?
Char()存儲定長字元,定義的時候可以不為他指定長度但是如若往裡插入值則會出錯;varchar2()存儲變長字元定義的時候必須指定長度,date存儲時間日期;Number()數字類型,包括整型,浮點型等;clob()大容量字元串;blob()大二進位對象
Oracle語法中truncate和delete的區別?
1. TRUNCATE在各種表上無論是大的還是小的都非常快。如果有ROLLBACK命令DELETE將被撤銷,而TRUNCATE則不會被撤銷。
2. TRUNCATE是一個DDL語言而DELETE是DML語句,向其他所有的DDL語言一樣,他將被隱式提交,不能對TRUNCATE使用ROLLBACK命令。
3. TRUNCATE將重新設置高水平線和所有的索引。在對整個表和索引進行完全瀏覽時,經過TRUNCATE操作後的表比DELETE操作後的表要快得多。
4. TRUNCATE不能觸發觸發器,DELETE會觸發觸發器。
5. 不能授予任何人清空他人的表的許可權。
6. 當表被清空後表和表的索引講重新設置成初始大小,而delete則不能。
7. 不能清空父表。
Oracle中的異常有哪幾類?
oracle中有三種類型的異常。預定義的異常 非預定義的異常 用戶定義的異常 其中第二種非預定義的異常是與特定的oracle錯誤關聯。
使用索引查詢一定能提高查詢的性能嗎?為什麼?
通常,通過索引查詢數據比全表掃描要快.但是我們也必須注意到它的代價. 索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時,索引本身也會被修改. 這意味著每條記錄的INSERT,DELETE,UPDATE將為此多付出4,5 次的磁碟I/O. 因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢.使用索引查詢不一定能提高查詢性能,索引範圍查詢(INDEX RANGE SCAN)適用於兩種情況:
基於一個範圍的檢索,一般查詢返回結果集小於表中記錄數的30%宜採用;
基於非唯一性索引的檢索,索引就是為了提高查詢性能而存在的,如果在查詢中索引沒有提高性能,只能說是用錯了索引,或者講是場合不同
回滾段的作用是什麼?
回滾段用於保存數據修改前的映象,這些資訊用於生成讀一致性資料庫資訊、在資料庫恢復和Rollback時使用。一個事務只能使用一個回滾段。
事務回滾:當事務修改表中數據的時候,該數據修改前的值(即前影像)會存放在回滾段中,當用戶回滾事務(ROLLBACK)時,ORACLE將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值。
事務恢復:當事務正在處理的時候,常式失敗,回滾段的資訊保存在undo表空間中,ORACLE將在下次打開資料庫時利用回滾來恢復未提交的數據。
讀一致性:當一個會話正在修改數據時,其他的會話將看不到該會話未提交的修改。 當一個語句正在執行時,該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性) 當ORACLE執行SELECT語句時,ORACLE依照當前的系統改變號(SYSTEM CHANGE NUMBER-SCN) 來保證任何前於當前SCN的未提交的改變不被該語句處理。可以想像:當一個長時間的查詢正在執行時, 若其他會話改變了該查詢要查詢的某個數據塊,ORACLE將利用回滾段的數據前影像來構造一個讀一致性視圖
SGA主要有那些部分,主要作用是什麼
系統全局區(SGA):是ORACLE為實例分配的一組共享緩衝存儲區,用於存放資料庫數據和控制資訊,以實現對資料庫數據的管理和操作。 SGA主要包括:
1. 共享池(shared
pool) :用來存儲最近執行的SQL語句和最近使用的數據字典的數據。
2. 數據緩衝區
(database buffer cache):用來存儲最近從數據文件中讀寫過的數據。
3. 重作日誌緩衝區(redo
log buffer):用來記錄服務或後台進程對資料庫的操作。
另外在SGA中還有兩個可選的記憶體結構:
4. Java pool:
用來存儲Java程式碼。
5. Large pool:
用來存儲不與SQL直接相關的大型記憶體結構。備份、恢復使用。
Oracle系統進程主要有哪些,作用是什麼
數據寫進程(DBWR):負責將更改的數據從資料庫緩衝區高速快取寫入數據文件
日誌寫進程(LGWR):將重做日誌緩衝區中的更改寫入在線重做日誌文件
系統監控 (SMON): 檢查資料庫的一致性如有必要還會在資料庫打開時啟動資料庫的恢復
進程監控 (PMON): 負責在一個Oracle
進程失敗時清理資源
檢查點進程(CKPT):負責在每當緩衝區高速快取中的更改永久地記錄在資料庫中時,更新控制文件和數據文件中的資料庫狀態資訊。
歸檔進程 (ARCH):在每次日誌切換時把已滿的日誌組進行備份或歸檔
恢復進程 (RECO): 保證分散式事務的一致性,在分散式事務中,要麼同時commit,要麼同時rollback
Oracle索引分為哪幾類,說出唯一索引和點陣圖索引的概念。
Oracle索引有B樹索引,點陣圖索引,函數索引,簇索引等。
唯一索引也是B樹索引的一種,它要求被索引的欄位值不可以重複。在創建的時候使用B樹演算法創建。
點陣圖索引並不是採用像唯一索引那樣存儲(索引欄位值,記錄ROWID)來創建索引段的,而是為每一個唯一的欄位值創建一個點陣圖,點陣圖中使用位元來對應一個記錄的ROWID。位元到ROWID是通過映射的到的。
oracle 優勢:
1、處理速度快,非常快
2、安全級別高。支援快閃以及完美的恢復,即使硬體壞了 也可以恢復到故障發前的1s
3、幾台資料庫做負載資料庫,可以做到30s以內故障轉移,
4、網格控制,以及 數據倉庫方面 也非常強大
缺點:
對硬體的要求很高;
價格比較昂貴;
管理維護麻煩一些;
操作比較複雜,需要技術含量較高;
oracle產品及服務都是付費的,而且價格不菲。比其他資料庫要貴,物有所值。oracle不是開源的。不過可以在redhat 或者其他開源作業系統上安裝。
mysql在sun沒被oracle收購是開源的,免費的,之後oracle公司打算 把mysql打造成不開源,收費模式的。
簡單敘述一下MYSQL的優化(重點)
1.資料庫的設計:盡量把資料庫設計的更小的占磁碟空間.
1) 儘可能使用更小的整數類型.(mediumint就比int更合適).
2) 儘可能的定義欄位為not
null,除非這個欄位需要null.
3) 如果沒有用到變長欄位的話比如varchar,那就採用固定大小的紀錄格式比如char.
4) 表的主索引應該儘可能的短.這樣的話每條紀錄都有名字標誌且更高效.
5) 只創建確實需要的索引。索引有利於檢索記錄,但是不利於快速保存記錄。如果總是要在表的組合欄位上做搜索,那麼就在這些欄位上創建索引。索引的第一部分必須是最常使用的欄位.如果總是需要用到很多欄位,首先就應該多複製這些欄位,使索引更好的壓縮。
6) 所有數據都得在保存到資料庫前進行處理。
7) 所有欄位都得有默認值。
8) 在某些情況下,把一個頻繁掃描的表分成兩個速度會快好多。在對動態格式表掃描以取得相關記錄時,它可能使用更小的靜態格式表的情況下更是如此。
2.系統的用途
1) 盡量使用長連接.
2) explain複雜的SQL語句。
3) 如果兩個關聯表要做比較話,做比較的欄位必須類型和長度都一致.
4) LIMIT語句盡量要跟order
by或者 distinct.這樣可以避免做一次full
table scan.
5) 如果想要清空表的所有紀錄,建議用truncate
table tablename而不是delete from tablename.
6) 能使用STORE
PROCEDURE 或者 USER FUNCTION的時候.
7) 在一條insert語句中採用多重紀錄插入格式.而且使用load
data infile來導入大量數據,這比單純的insert快好多.
8) 經常OPTIMIZE
TABLE 來整理碎片.
9) 還有就是date
類型的數據如果頻繁要做比較的話盡量保存在unsigned int 類型比較快。
3.系統的瓶頸
1) 磁碟搜索。並行搜索,把數據分開存放到多個磁碟中,這樣能加快搜索時間.
2) 磁碟讀寫(IO)。可以從多個媒介中並行的讀取數據。
3) CPU周期。數據存放在主記憶體中.這樣就得增加CPU的個數來處理這些數據。
4) 記憶體頻寬。當CPU要將更多的數據存放到CPU的快取中來的話,記憶體的頻寬就成了瓶頸.
MySQL和Oracle的區別
(1) 自動增長的數據類型處理
MYSQL有自動增長的數據類型,插入記錄時不用操作此欄位,會自動獲得數據值。ORACLE沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。
(2)單引號的處理
MYSQL里可以用雙引號包起字元串,ORACLE里只可以用單引號包起字元串。在插入和修改字元串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。
(3)翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數;PHP里還可以用SEEK定位到結果集的位置。ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM欄位標明它的位置, 並且只能用ROWNUM<100, 不能用ROWNUM>80。
(4) 長字元串的處理
長字元串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字元串長度小於等於4000個單位元組, 如果要插入更長的字元串, 請考慮欄位用CLOB類型,方法借用ORACLE里自帶的DBMS_LOB程式包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的欄位值和超出長度欄位值都應該提出警告,返回上次操作
(5) 日期欄位的處理
MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒資訊
(6)空字元的處理
MYSQL的非空欄位也有空的內容,ORACLE里定義了非空欄位就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導數據的時候會產生錯誤。因此導數據時要對空字元進行判斷,如果為NULL或空字元,需要把它改成一個空格的字元串。
(7)字元串的模糊比較
MYSQL里用 欄位名 like 『%字元串%』,ORACLE里也可以用 欄位名 like 『%字元串%』 但這種方法不能使用索引, 速度不快,用字元串比較函數 instr(欄位名,』字元串』)>0 會得到更精確的查找結果。
一、sqlserver
優點:
易用性、適合分散式組織的可伸縮性、用於決策支援的數據倉庫功能、與許多其他伺服器軟體緊密關聯的集成性、良好的性價比等;
為數據管理與分析帶來了靈活性,允許單位在快速變化的環境中從容響應,從而獲得競爭優勢。從數據管理和分析角度看,將原始數據轉化為商業智慧和充分利用Web帶來的機會非常重要。作為一個完備的資料庫和數據分析包,SQLServer為快速開發新一代企業級商業應用程式、為企業贏得核心競爭優勢打開了勝利之門。作為重要的基準測試可伸縮性和速度獎的記錄保持者,SQLServer是一個具備完全Web支援的資料庫產品,提供了對可擴展標記語言 (XML)的核心支援以及在Internet上和防火牆外進行查詢的能力;
缺點:
開放性 :SQL Server
只能windows上運行沒有絲毫開放性作業系統系統穩定對資料庫十分重要Windows9X系列產品偏重於桌面應用NT server只適合小型企業而且windows平台靠性安全性和伸縮性非常有限象unix樣久經考驗尤其處理大資料庫;
伸縮性並行性 :SQL server
並行實施和共存模型並成熟難處理日益增多用戶數和數據卷伸縮性有限;
安全性:沒有獲得任何安全證書。
性能 :SQL Server
多用戶時性能佳 ;
客戶端支援及應用模式: 客戶端支援及應用模式。只支援C/S模式,SQL Server C/S結構只支援windows客戶用ADO、DAO、OLEDB、ODBC連接;
使用風險:SQL server 完全重寫程式碼經歷了長期測試斷延遲許多功能需要時間來證明並十分兼容;
二、Oracle
優點:
開放性:Oracle 能所有主流平台上運行(包括 windows)完全支援所有工業標準採用完全開放策略使客戶選擇適合解決方案對開發商全力支援;
可伸縮性,並行性:Oracle 並行伺服器通過使組結點共享同簇工作來擴展windownt能力提供高用性和高伸縮性簇解決方案windowsNT能滿足需要用戶把資料庫移UNIXOracle並行伺服器對各種UNIX平台集群機制都有著相當高集成度;
安全性:獲得最高認證級別的ISO標準認證。
性能:Oracle 性能高 保持開放平台下TPC-D和TPC-C世界記錄;
客戶端支援及應用模式:Oracle 多層次網路計算支援多種工業標準用ODBC、JDBC、OCI等網路客戶連接
使用風險:Oracle 長時間開發經驗完全向下兼容得廣泛應用地風險低
缺點:
對硬體的要求很高;
價格比較昂貴;
管理維護麻煩一些;
操作比較複雜,需要技術含量較高;
三、MySql
優點:
體積小、速度快、總體擁有成本低,開源;
支援多種作業系統;
是開源資料庫,提供的介面支援多種語言連接操作
MySql的核心程式採用完全的多執行緒編程。執行緒是輕量級的進程,它可以靈活地為用戶提供服務,而不過多的系統資源。用多執行緒和C語言實現的MySql能很容易充分利用CPU;
MySql有一個非常靈活而且安全的許可權和口令系統。當客戶與MySql伺服器連接時,他們之間所有的口令傳送被加密,而且MySql支援主機認證;
支援ODBC for
Windows, 支援所有的ODBC 2.5函數和其他許多函數, 可以用Access連接MySql伺服器, 使得應用被擴展;
支援大型的資料庫, 可以方便地支援上千萬條記錄的資料庫。作為一個開放源程式碼的資料庫,可以針對不同的應用進行相應的修改。
擁有一個非常快速而且穩定的基於執行緒的記憶體分配系統,可以持續使用面不必擔心其穩定性;
MySQL同時提供高度多樣性,能夠提供很多不同的使用者介面,包括命令行客戶端操作,網頁瀏覽器,以及各式各樣的程式語言介面,例如C+,Perl,Java,PHP,以及Python。你可以使用事先包裝好的客戶端,或者乾脆自己寫一個合適的應用程式。MySQL可用於Unix,Windows,以及OS/2等平台,因此它可以用在個人電腦或者是伺服器上;
缺點:
不支援熱備份;
MySQL最大的缺點是其安全系統,主要是複雜而非標準,另外只有到調用mysqladmin來重讀用戶許可權時才發生改變;
沒有一種存儲過程(Stored Procedure)語言,這是對習慣於企業級資料庫的程式設計師的最大限制;
MySQL的價格隨平台和安裝方式變化。Linux的MySQL如果由用戶自己或系統管理員而不是第三方安裝則是免費的,第三方案則必須付許可費。Unix或Linux 自行安裝 免費 、Unix或Linux 第三方安裝 收費
Maven有哪些優點和缺點
優點如下:
簡化了項目依賴管理:
易於上手,對於新手可能一個”mvn clean package”命令就可能滿足他的工作
便於與持續集成工具(jenkins)整合
便於項目升級,無論是項目本身升級還是項目使用的依賴升級。
有助於多模組項目的開發,一個模組開發好後,發布到倉庫,依賴該模組時可以直接從倉庫更新,而不用自己去編譯。
maven有很多插件,便於功能擴展,比如生產站點,自動發布版本等
缺點如下:
maven是一個龐大的構建系統,學習難度大
maven採用約定優於配置的策略(convention
over configuration),雖然上手容易,但是一旦出了問題,難於調試。
當依賴很多時,m2eclipse
老是搞得Eclipse很卡。
中國的網路環境差,很多repository無法訪問,比如google
code, jboss 倉庫無法訪問等。