大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) 最常見的208道Java最新面試題及答案(四)

最常見的208道Java最新面試題及答案(四)

更新時(shí)間:2019-10-15 13:56:09 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2535次


  十三、 Java最新面試題及答案:MyBatis模塊


  125、MyBatis 中 #{}和 ${}的區(qū)別是什么?


  #{}是預(yù)編譯處理,${}是字符替換。在使用 #{}時(shí),MyBatis 會(huì)將 SQL 中的 #{}替換成“?”,配合 PreparedStatement 的 set 方法賦值,這樣可以有效的防止 SQL 注入,保證程序的運(yùn)行安全。


  126、MyBatis 有幾種分頁(yè)方式?


  分頁(yè)方式:邏輯分頁(yè)和物理分頁(yè)。


  邏輯分頁(yè):使用 MyBatis 自帶的 RowBounds 進(jìn)行分頁(yè),它是一次性查詢很多數(shù)據(jù),然后在數(shù)據(jù)中再進(jìn)行檢索。


  物理分頁(yè):自己手寫 SQL 分頁(yè)或使用分頁(yè)插件 PageHelper,去數(shù)據(jù)庫(kù)查詢指定條數(shù)的分頁(yè)數(shù)據(jù)的形式。


  127、RowBounds 是一次性查詢?nèi)拷Y(jié)果嗎?為什么?


  RowBounds 表面是在“所有”數(shù)據(jù)中檢索數(shù)據(jù),其實(shí)并非是一次性查詢出所有數(shù)據(jù),因?yàn)?MyBatis 是對(duì) jdbc 的封裝,在 jdbc 驅(qū)動(dòng)中有一個(gè) Fetch Size 的配置,它規(guī)定了每次最多從數(shù)據(jù)庫(kù)查詢多少條數(shù)據(jù),假如你要查詢更多數(shù)據(jù),它會(huì)在你執(zhí)行 next()的時(shí)候,去查詢更多的數(shù)據(jù)。就好比你去自動(dòng)取款機(jī)取 10000 元,但取款機(jī)每次最多能取 2500 元,所以你要取 4 次才能把錢取完。只是對(duì)于 jdbc 來(lái)說,當(dāng)你調(diào)用 next()的時(shí)候會(huì)自動(dòng)幫你完成查詢工作。這樣做的好處可以有效的防止內(nèi)存溢出。


  Fetch Size 官方相關(guān)文檔:http://t. cn/EfSE2g3


  128、MyBatis 邏輯分頁(yè)和物理分頁(yè)的區(qū)別是什么?


  邏輯分頁(yè)是一次性查詢很多數(shù)據(jù),然后再在結(jié)果中檢索分頁(yè)的數(shù)據(jù)。這樣做弊端是需要消耗大量的內(nèi)存、有內(nèi)存溢出的風(fēng)險(xiǎn)、對(duì)數(shù)據(jù)庫(kù)壓力較大。


  物理分頁(yè)是從數(shù)據(jù)庫(kù)查詢指定條數(shù)的數(shù)據(jù),彌補(bǔ)了一次性全部查出的所有數(shù)據(jù)的種種缺點(diǎn),比如需要大量的內(nèi)存,對(duì)數(shù)據(jù)庫(kù)查詢壓力較大等問題。


  129、MyBatis 是否支持延遲加載?延遲加載的原理是什么?


  MyBatis 支持延遲加載,設(shè)置 lazyLoadingEnabled=true 即可。


  延遲加載的原理的是調(diào)用的時(shí)候觸發(fā)加載,而不是在初始化的時(shí)候就加載信息。比如調(diào)用 a. getB(). getName(),這個(gè)時(shí)候發(fā)現(xiàn) a. getB() 的值為 null,此時(shí)會(huì)單獨(dú)觸發(fā)事先保存好的關(guān)聯(lián) B 對(duì)象的 SQL,先查詢出來(lái) B,然后再調(diào)用 a. setB(b),而這時(shí)候再調(diào)用 a. getB(). getName() 就有值了,這就是延遲加載的基本原理。





  130、說一下 MyBatis 的一級(jí)緩存和二級(jí)緩存?


  一級(jí)緩存:基于 PerpetualCache 的 HashMap 本地緩存,它的聲明周期是和 SQLSession 一致的,有多個(gè) SQLSession 或者分布式的環(huán)境中數(shù)據(jù)庫(kù)操作,可能會(huì)出現(xiàn)臟數(shù)據(jù)。當(dāng) Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認(rèn)一級(jí)緩存是開啟的。


  二級(jí)緩存:也是基于 PerpetualCache 的 HashMap 本地緩存,不同在于其存儲(chǔ)作用域?yàn)?Mapper 級(jí)別的,如果多個(gè)SQLSession之間需要共享緩存,則需要使用到二級(jí)緩存,并且二級(jí)緩存可自定義存儲(chǔ)源,如 Ehcache。默認(rèn)不打開二級(jí)緩存,要開啟二級(jí)緩存,使用二級(jí)緩存屬性類需要實(shí)現(xiàn) Serializable 序列化接口(可用來(lái)保存對(duì)象的狀態(tài))。


  開啟二級(jí)緩存數(shù)據(jù)查詢流程:二級(jí)緩存 -> 一級(jí)緩存 -> 數(shù)據(jù)庫(kù)。


  緩存更新機(jī)制:當(dāng)某一個(gè)作用域(一級(jí)緩存 Session/二級(jí)緩存 Mapper)進(jìn)行了C/U/D 操作后,默認(rèn)該作用域下所有 select 中的緩存將被 clear。


  131、MyBatis 和 hibernate 的區(qū)別有哪些?


  靈活性:MyBatis 更加靈活,自己可以寫 SQL 語(yǔ)句,使用起來(lái)比較方便。


  可移植性:MyBatis 有很多自己寫的 SQL,因?yàn)槊總€(gè)數(shù)據(jù)庫(kù)的 SQL 可以不相同,所以可移植性比較差。


  學(xué)習(xí)和使用門檻:MyBatis 入門比較簡(jiǎn)單,使用門檻也更低。


  二級(jí)緩存:hibernate 擁有更好的二級(jí)緩存,它的二級(jí)緩存可以自行更換為第三方的二級(jí)緩存。


  132、MyBatis 有哪些執(zhí)行器(Executor)?


  MyBatis 有三種基本的Executor執(zhí)行器:


  SimpleExecutor:每執(zhí)行一次 update 或 select 就開啟一個(gè) Statement 對(duì)象,用完立刻關(guān)閉 Statement 對(duì)象;


  ReuseExecutor:執(zhí)行 update 或 select,以 SQL 作為 key 查找 Statement 對(duì)象,存在就使用,不存在就創(chuàng)建,用完后不關(guān)閉 Statement 對(duì)象,而是放置于 Map 內(nèi)供下一次使用。簡(jiǎn)言之,就是重復(fù)使用 Statement 對(duì)象;


  BatchExecutor:執(zhí)行 update(沒有 select,jdbc 批處理不支持 select),將所有 SQL 都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個(gè) Statement 對(duì)象,每個(gè) Statement 對(duì)象都是 addBatch()完畢后,等待逐一執(zhí)行 executeBatch()批處理,與 jdbc 批處理相同。


  133、MyBatis 分頁(yè)插件的實(shí)現(xiàn)原理是什么?


  分頁(yè)插件的基本原理是使用 MyBatis 提供的插件接口,實(shí)現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的 SQL,然后重寫 SQL,根據(jù) dialect 方言,添加對(duì)應(yīng)的物理分頁(yè)語(yǔ)句和物理分頁(yè)參數(shù)。


  134、MyBatis 如何編寫一個(gè)自定義插件?


  自定義插件實(shí)現(xiàn)原理:


  MyBatis 自定義插件針對(duì) MyBatis 四大對(duì)象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)進(jìn)行攔截:


  Executor:攔截內(nèi)部執(zhí)行器,它負(fù)責(zé)調(diào)用 StatementHandler 操作數(shù)據(jù)庫(kù),并把結(jié)果集通過 ResultSetHandler 進(jìn)行自動(dòng)映射,另外它還處理了二級(jí)緩存的操作;


  StatementHandler:攔截 SQL 語(yǔ)法構(gòu)建的處理,它是 MyBatis 直接和數(shù)據(jù)庫(kù)執(zhí)行 SQL 腳本的對(duì)象,另外它也實(shí)現(xiàn)了 MyBatis 的一級(jí)緩存;


  ParameterHandler:攔截參數(shù)的處理;


  ResultSetHandler:攔截結(jié)果集的處理。


  自定義插件實(shí)現(xiàn)關(guān)鍵:


  MyBatis 插件要實(shí)現(xiàn) Interceptor 接口,接口包含的方法,如下:


public interface Interceptor { 

Object intercept(Invocation invocation) throws Throwable; 

Object plugin(Object target); 

void setProperties(Properties properties);

}


  setProperties 方法是在 MyBatis 進(jìn)行配置插件的時(shí)候可以配置自定義相關(guān)屬性,即:接口實(shí)現(xiàn)對(duì)象的參數(shù)配置;


  plugin 方法是插件用于封裝目標(biāo)對(duì)象的,通過該方法我們可以返回目標(biāo)對(duì)象本身,也可以返回一個(gè)它的代理,可以決定是否要進(jìn)行攔截進(jìn)而決定要返回一個(gè)什么樣的目標(biāo)對(duì)象,官方提供了示例:return Plugin. wrap(target, this);


  intercept 方法就是要進(jìn)行攔截的時(shí)候要執(zhí)行的方法。


  自定義插件實(shí)現(xiàn)示例:


  官方插件實(shí)現(xiàn):


@Intercepts({@Signature(type = Executor. class, method = "query",

args = {MappedStatement. class, Object. class, RowBounds. class, ResultHandler. class})})

public class TestInterceptor implements Interceptor {

public Object intercept(Invocation invocation) throws Throwable {

Object target = invocation. getTarget(); //被代理對(duì)象

Method method = invocation. getMethod(); //代理方法

Object[] args = invocation. getArgs(); //方法參數(shù)

// do something . . . . . . 方法攔截前執(zhí)行代碼塊

Object result = invocation. proceed();

// do something . . . . . . . 方法攔截后執(zhí)行代碼塊

return result;

}

public Object plugin(Object target) {

return Plugin. wrap(target, this);

}

}



  十四、Java最新面試題及答案:RabbitMQ模塊


  135、RabbitMQ 的使用場(chǎng)景有哪些?


  搶購(gòu)活動(dòng),削峰填谷,防止系統(tǒng)崩塌。


  延遲信息處理,比如 10 分鐘之后給下單未付款的用戶發(fā)送郵件提醒。


  解耦系統(tǒng),對(duì)于新增的功能可以單獨(dú)寫模塊擴(kuò)展,比如用戶確認(rèn)評(píng)價(jià)之后,新增了給用戶返積分的功能,這個(gè)時(shí)候不用在業(yè)務(wù)代碼里添加新增積分的功能,只需要把新增積分的接口訂閱確認(rèn)評(píng)價(jià)的消息隊(duì)列即可,后面再添加任何功能只需要訂閱對(duì)應(yīng)的消息隊(duì)列即可。


  136、RabbitMQ 有哪些重要的角色?


  RabbitMQ 中重要的角色有:生產(chǎn)者、消費(fèi)者和代理:


  生產(chǎn)者:消息的創(chuàng)建者,負(fù)責(zé)創(chuàng)建和推送數(shù)據(jù)到消息服務(wù)器;


  消費(fèi)者:消息的接收方,用于處理數(shù)據(jù)和確認(rèn)消息;


  代理:就是 RabbitMQ 本身,用于扮演“快遞”的角色,本身不生產(chǎn)消息,只是扮演“快遞”的角色。


  137、RabbitMQ 有哪些重要的組件?


  ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立連接的管理器,程序代碼中使用。


  Channel(信道):消息推送使用的通道。


  Exchange(交換器):用于接受、分配消息。


  Queue(隊(duì)列):用于存儲(chǔ)生產(chǎn)者的消息。


  RoutingKey(路由鍵):用于把生成者的數(shù)據(jù)分配到交換器上。


  BindingKey(綁定鍵):用于把交換器的消息綁定到隊(duì)列上。


  138、RabbitMQ 中 vhost 的作用是什么?


  vhost:每個(gè) RabbitMQ 都能創(chuàng)建很多 vhost,我們稱之為虛擬主機(jī),每個(gè)虛擬主機(jī)其實(shí)都是 mini 版的RabbitMQ,它擁有自己的隊(duì)列,交換器和綁定,擁有自己的權(quán)限機(jī)制。


  139、RabbitMQ 的消息是怎么發(fā)送的?


  首先客戶端必須連接到 RabbitMQ 服務(wù)器才能發(fā)布和消費(fèi)消息,客戶端和 rabbit server 之間會(huì)創(chuàng)建一個(gè) tcp 連接,一旦 tcp 打開并通過了認(rèn)證(認(rèn)證就是你發(fā)送給 rabbit 服務(wù)器的用戶名和密碼),你的客戶端和 RabbitMQ 就創(chuàng)建了一條 amqp 信道(channel),信道是創(chuàng)建在“真實(shí)” tcp 上的虛擬連接,amqp 命令都是通過信道發(fā)送出去的,每個(gè)信道都會(huì)有一個(gè)唯一的 id,不論是發(fā)布消息,訂閱隊(duì)列都是通過這個(gè)信道完成的。


  140、RabbitMQ 怎么保證消息的穩(wěn)定性?


  提供了事務(wù)的功能。


  通過將 channel 設(shè)置為 confirm(確認(rèn))模式。


  141、RabbitMQ 怎么避免消息丟失?


  把消息持久化磁盤,保證服務(wù)器重啟消息不丟失。


  每個(gè)集群中至少有一個(gè)物理磁盤,保證消息落入磁盤。


  142、要保證消息持久化成功的條件有哪些?


  聲明隊(duì)列必須設(shè)置持久化 durable 設(shè)置為 true.


  消息推送投遞模式必須設(shè)置持久化,deliveryMode 設(shè)置為 2(持久)。


  消息已經(jīng)到達(dá)持久化交換器。


  消息已經(jīng)到達(dá)持久化隊(duì)列。


  以上四個(gè)條件都滿足才能保證消息持久化成功。


  143、RabbitMQ 持久化有什么缺點(diǎn)?


  持久化的缺地就是降低了服務(wù)器的吞吐量,因?yàn)槭褂玫氖谴疟P而非內(nèi)存存儲(chǔ),從而降低了吞吐量。可盡量使用 ssd 硬盤來(lái)緩解吞吐量的問題。


  144、RabbitMQ 有幾種廣播類型?


  direct(默認(rèn)方式):最基礎(chǔ)最簡(jiǎn)單的模式,發(fā)送方把消息發(fā)送給訂閱方,如果有多個(gè)訂閱者,默認(rèn)采取輪詢的方式進(jìn)行消息發(fā)送。


  headers:與 direct 類似,只是性能很差,此類型幾乎用不到。


  fanout:分發(fā)模式,把消費(fèi)分發(fā)給所有訂閱者。


  topic:匹配訂閱模式,使用正則匹配到消息隊(duì)列,能匹配到的都能接收到。


  145、RabbitMQ 怎么實(shí)現(xiàn)延遲消息隊(duì)列?


  延遲隊(duì)列的實(shí)現(xiàn)有兩種方式:


  通過消息過期后進(jìn)入死信交換器,再由交換器轉(zhuǎn)發(fā)到延遲消費(fèi)隊(duì)列,實(shí)現(xiàn)延遲功能;


  使用 RabbitMQ-delayed-message-exchange 插件實(shí)現(xiàn)延遲功能。


  146、RabbitMQ 集群有什么用?


  集群主要有以下兩個(gè)用途:


  高可用:某個(gè)服務(wù)器出現(xiàn)問題,整個(gè) RabbitMQ 還可以繼續(xù)使用;


  高容量:集群可以承載更多的消息量。


  147、RabbitMQ 節(jié)點(diǎn)的類型有哪些?


  磁盤節(jié)點(diǎn):消息會(huì)存儲(chǔ)到磁盤。


  內(nèi)存節(jié)點(diǎn):消息都存儲(chǔ)在內(nèi)存中,重啟服務(wù)器消息丟失,性能高于磁盤類型。


  148、RabbitMQ 集群搭建需要注意哪些問題?


  各節(jié)點(diǎn)之間使用“–link”連接,此屬性不能忽略。


  各節(jié)點(diǎn)使用的 erlang cookie 值必須相同,此值相當(dāng)于“秘鑰”的功能,用于各節(jié)點(diǎn)的認(rèn)證。


  整個(gè)集群中必須包含一個(gè)磁盤節(jié)點(diǎn)。


  149、RabbitMQ 每個(gè)節(jié)點(diǎn)是其他節(jié)點(diǎn)的完整拷貝嗎?為什么?


  不是,原因有以下兩個(gè):


  存儲(chǔ)空間的考慮:如果每個(gè)節(jié)點(diǎn)都擁有所有隊(duì)列的完全拷貝,這樣新增節(jié)點(diǎn)不但沒有新增存儲(chǔ)空間,反而增加了更多的冗余數(shù)據(jù);


  性能的考慮:如果每條消息都需要完整拷貝到每一個(gè)集群節(jié)點(diǎn),那新增節(jié)點(diǎn)并沒有提升處理消息的能力,最多是保持和單節(jié)點(diǎn)相同的性能甚至是更糟。


  150、RabbitMQ 集群中唯一一個(gè)磁盤節(jié)點(diǎn)崩潰了會(huì)發(fā)生什么情況?


  如果唯一磁盤的磁盤節(jié)點(diǎn)崩潰了,不能進(jìn)行以下操作


  不能創(chuàng)建隊(duì)列


  不能創(chuàng)建交換器


  不能創(chuàng)建綁定


  不能添加用戶


  不能更改權(quán)限


  不能添加和刪除集群節(jié)點(diǎn)


  唯一磁盤節(jié)點(diǎn)崩潰了,集群是可以保持運(yùn)行的,但你不能更改任何東西。


  151、RabbitMQ 對(duì)集群節(jié)點(diǎn)停止順序有要求嗎?


  RabbitMQ 對(duì)集群的停止的順序是有要求的,應(yīng)該先關(guān)閉內(nèi)存節(jié)點(diǎn),最后再關(guān)閉磁盤節(jié)點(diǎn)。如果順序恰好相反的話,可能會(huì)造成消息的丟失。



  十五、Java最新面試題及答案:Kafka


  152、kafka 可以脫離 zookeeper 單獨(dú)使用嗎?為什么?


  kafka 不能脫離 zookeeper 單獨(dú)使用,因?yàn)?kafka 使用 zookeeper 管理和協(xié)調(diào) kafka 的節(jié)點(diǎn)服務(wù)器。


  153、kafka 有幾種數(shù)據(jù)保留的策略?


  kafka 有兩種數(shù)據(jù)保存策略:按照過期時(shí)間保留和按照存儲(chǔ)的消息大小保留。


  154、kafka 同時(shí)設(shè)置了 7 天和 10G 清除數(shù)據(jù),到第五天的時(shí)候消息達(dá)到了 10G,這個(gè)時(shí)候 kafka 將如何處理?


  這個(gè)時(shí)候 kafka 會(huì)執(zhí)行數(shù)據(jù)清除工作,時(shí)間和大小不論那個(gè)滿足條件,都會(huì)清空數(shù)據(jù)。


  155、什么情況會(huì)導(dǎo)致 kafka 運(yùn)行變慢?


  cpu 性能瓶頸


  磁盤讀寫瓶頸


  網(wǎng)絡(luò)瓶頸


  156、使用 kafka 集群需要注意什么?


  集群的數(shù)量不是越多越好,最好不要超過 7 個(gè),因?yàn)楣?jié)點(diǎn)越多,消息復(fù)制需要的時(shí)間就越長(zhǎng),整個(gè)群組的吞吐量就越低。


  集群數(shù)量最好是單數(shù),因?yàn)槌^一半故障集群就不能用了,設(shè)置為單數(shù)容錯(cuò)率更高。



  十六、Java最新面試題及答案:Zookeeper模塊


  157、zookeeper 是什么?


  zookeeper 是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是 google chubby 的開源實(shí)現(xiàn),是 hadoop 和 hbase 的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。


  158、zookeeper 都有哪些功能?


  集群管理:監(jiān)控節(jié)點(diǎn)存活狀態(tài)、運(yùn)行請(qǐng)求等。


  主節(jié)點(diǎn)選舉:主節(jié)點(diǎn)掛掉了之后可以從備用的節(jié)點(diǎn)開始新一輪選主,主節(jié)點(diǎn)選舉說的就是這個(gè)選舉的過程,使用 zookeeper 可以協(xié)助完成這個(gè)過程。


  分布式鎖:zookeeper 提供兩種鎖:獨(dú)占鎖、共享鎖。獨(dú)占鎖即一次只能有一個(gè)線程使用資源,共享鎖是讀鎖共享,讀寫互斥,即可以有多線線程同時(shí)讀同一個(gè)資源,如果要使用寫鎖也只能有一個(gè)線程使用。zookeeper可以對(duì)分布式鎖進(jìn)行控制。


  命名服務(wù):在分布式系統(tǒng)中,通過使用命名服務(wù),客戶端應(yīng)用能夠根據(jù)指定名字來(lái)獲取資源或服務(wù)的地址,提供者等信息。


  159、zookeeper 有幾種部署模式?


  zookeeper 有三種部署模式:


  單機(jī)部署:一臺(tái)集群上運(yùn)行;


  集群部署:多臺(tái)集群運(yùn)行;


  偽集群部署:一臺(tái)集群?jiǎn)?dòng)多個(gè) zookeeper 實(shí)例運(yùn)行。


  160、zookeeper 怎么保證主從節(jié)點(diǎn)的狀態(tài)同步?


  zookeeper 的核心是原子廣播,這個(gè)機(jī)制保證了各個(gè) server 之間的同步。實(shí)現(xiàn)這個(gè)機(jī)制的協(xié)議叫做 zab 協(xié)議。zab 協(xié)議有兩種模式,分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動(dòng)或者在領(lǐng)導(dǎo)者崩潰后,zab 就進(jìn)入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來(lái),且大多數(shù) server 完成了和 leader 的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了 leader 和 server 具有相同的系統(tǒng)狀態(tài)。


  161、集群中為什么要有主節(jié)點(diǎn)?


  在分布式環(huán)境中,有些業(yè)務(wù)邏輯只需要集群中的某一臺(tái)機(jī)器進(jìn)行執(zhí)行,其他的機(jī)器可以共享這個(gè)結(jié)果,這樣可以大大減少重復(fù)計(jì)算,提高性能,所以就需要主節(jié)點(diǎn)。


  162、集群中有 3 臺(tái)服務(wù)器,其中一個(gè)節(jié)點(diǎn)宕機(jī),這個(gè)時(shí)候 zookeeper 還可以使用嗎?


  可以繼續(xù)使用,單數(shù)服務(wù)器只要沒超過一半的服務(wù)器宕機(jī)就可以繼續(xù)使用。


  163、說一下 zookeeper 的通知機(jī)制?


  客戶端端會(huì)對(duì)某個(gè) znode 建立一個(gè) watcher 事件,當(dāng)該 znode 發(fā)生變化時(shí),這些客戶端會(huì)收到 zookeeper 的通知,然后客戶端可以根據(jù) znode 變化來(lái)做出業(yè)務(wù)上的改變。



  十七、Java最新面試題及答案:MySQL模塊


  164、數(shù)據(jù)庫(kù)的三范式是什么?


  第一范式(1NF):強(qiáng)調(diào)的是列的原子性,即數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng)。


  第二范式(2NF):要求實(shí)體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性。(在1NF基礎(chǔ)上消除非主屬性對(duì)主鍵的部分函數(shù)依賴)


  第三范式(3NF):任何非主屬性不依賴于其它非主屬性。(在2NF基礎(chǔ)上消除傳遞依賴)


  165、一張自增表里面總共有 7 條數(shù)據(jù),刪除了最后 2 條數(shù)據(jù),重啟 MySQL 數(shù)據(jù)庫(kù),又插入了一條數(shù)據(jù),此時(shí) id 是幾?


  表類型如果是 MyISAM ,那 id 就是 8。


  表類型如果是 InnoDB,那 id 就是 6。


  InnoDB 表只會(huì)把自增主鍵的最大 id 記錄在內(nèi)存中,所以重啟之后會(huì)導(dǎo)致最大 id 丟失。


  166、如何獲取當(dāng)前數(shù)據(jù)庫(kù)版本?


  使用 select version() 獲取當(dāng)前 MySQL 數(shù)據(jù)庫(kù)版本。


  167、說一下 ACID 是什么?


  Atomicity(原子性):一個(gè)事務(wù)(transaction)中的所有操作,或者全部完成,或者全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會(huì)被恢復(fù)(Rollback)到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒有執(zhí)行過一樣。即,事務(wù)不可分割、不可約簡(jiǎn)。


  Consistency(一致性):在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)約束、觸發(fā)器、級(jí)聯(lián)回滾等。


  Isolation(隔離性):數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。


  Durability(持久性):事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。


  168、char 和 varchar 的區(qū)別是什么?


  char(n) :固定長(zhǎng)度類型,比如訂閱 char(10),當(dāng)你輸入"abc"三個(gè)字符的時(shí)候,它們占的空間還是 10 個(gè)字節(jié),其他 7 個(gè)是空字節(jié)。


  優(yōu)點(diǎn):效率高;缺點(diǎn):占用空間;適用場(chǎng)景:存儲(chǔ)密碼的 md5 值,固定長(zhǎng)度的,使用 char 非常合適。


  varchar(n) :可變長(zhǎng)度,存儲(chǔ)的值是每個(gè)值占用的字節(jié)再加上一個(gè)用來(lái)記錄其長(zhǎng)度的字節(jié)的長(zhǎng)度。


  所以,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適,二者使用需要權(quán)衡。


  169、float 和 double 的區(qū)別是什么?


  float 最多可以存儲(chǔ) 8 位的十進(jìn)制數(shù),并在內(nèi)存中占 4 字節(jié)。


  double 最可可以存儲(chǔ) 16 位的十進(jìn)制數(shù),并在內(nèi)存中占 8 字節(jié)。


  170、MySQL 的內(nèi)連接、左連接、右連接有什么區(qū)別?


  內(nèi)連接關(guān)鍵字:inner join;左連接:left join;右連接:right join。


  內(nèi)連接是把匹配的關(guān)聯(lián)數(shù)據(jù)顯示出來(lái);左連接是左邊的表全部顯示出來(lái),右邊的表顯示出符合條件的數(shù)據(jù);右連接正好相反。


由于“最常見的208道Java最新面試題及答案”內(nèi)容太多,本文已滿,請(qǐng)看下文鏈接:


1~30道Java最新面試題及答案請(qǐng)看鏈接:http://www.dabaquan.cn/javazixun/2143.html


31~73道Java最新面試題及答案請(qǐng)看鏈接:http://www.dabaquan.cn/javazixun/2145.html


74~124道Java最新面試題及答案請(qǐng)看鏈接:http://www.dabaquan.cn/javazixun/2146.html


171~208道Java最新面試題及答案請(qǐng)看鏈接:http://www.dabaquan.cn/javazixun/2149.html


提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久国产影视 | 欧美日韩亚洲国产无线码 | 番茄视频在线观看黄版本免费 | 国产成人久久精品激情91 | 婷婷亚洲国产成人精品性色 | jizzjizz亚洲女人 | 久久6精品 | 一级片a| 久久www免费人成高清 | 久亚洲精品不子伦一区 | 免费二区 | 婷婷在线视频 | 欧美你懂得| 伊人色强在线网 | 欧美深度肠交 | 日韩视频免费在线播放 | 99精品高清不卡在线观看 | 久久精品无码一区二区日韩av | 91精品国产视频 | 日韩黄色录像 | 久久新地址| 亚拍精品一区二区三区 | 妞干网这里只有精品 | 欧美精品18xxxhd4k | 黄色片网站视频 | 久久夜色精品国产尤物 | 成人四虎影院 | 99视频精品全部国产盗摄视频 | 午夜私人影院粉色视频我要 | 国产激情在线 | 毛片免费在线观看 | 久久99国产精一区二区三区 | 五月激情综合婷婷 | 日本四虎影院 | 伊人精品视频在线 | 亚洲综合在线另类色区奇米 | 国产精品香蕉在线观看不卡 | 亚洲精品一区91 | 一级无毛 | a一区二区三区视频 | 久草男人天堂 |