重慶市建筑工程造價(jià)信息網(wǎng)優(yōu)化師是干嘛的
1. 談?wù)剶?shù)據(jù)庫(kù)的樂(lè)觀鎖和悲觀鎖
樂(lè)觀鎖和悲觀鎖是數(shù)據(jù)庫(kù)并發(fā)控制中常用的兩種策略,用于處理多個(gè)事務(wù)同時(shí)訪問(wèn)和修改同一個(gè)數(shù)據(jù)時(shí)的并發(fā)沖突問(wèn)題。
- 數(shù)據(jù)庫(kù)的樂(lè)觀鎖是指在讀取數(shù)據(jù)時(shí),不對(duì)數(shù)據(jù)進(jìn)行加鎖,而是在更新數(shù)據(jù)時(shí)檢查數(shù)據(jù)版本是否發(fā)生變化,如果沒(méi)有變化則更新成功,否則更新失敗。樂(lè)觀鎖的優(yōu)點(diǎn)是并發(fā)性能好,因?yàn)槎鄠€(gè)事物可以同時(shí)訪問(wèn)同一行數(shù)據(jù),不會(huì)阻塞其他事物完成操作。但樂(lè)觀鎖也有缺點(diǎn),即需要維護(hù)版本號(hào)或時(shí)間戳等字段,增加了系統(tǒng)復(fù)雜度。
- 悲觀鎖是指在讀取數(shù)據(jù)時(shí),認(rèn)為數(shù)據(jù)會(huì)被其他事物修改,因此對(duì)數(shù)據(jù)進(jìn)行加鎖,直到當(dāng)前事物完成操作并釋放鎖。悲觀鎖的缺點(diǎn)是會(huì)導(dǎo)致并發(fā)性能降低,因此多個(gè)事物不能訪問(wèn)同一行數(shù)據(jù),會(huì)阻塞等待其他事務(wù)完成操作。
選擇何種鎖機(jī)制,需要根據(jù)具體的業(yè)務(wù)情況和性能需求來(lái)決定。一般來(lái)說(shuō),對(duì)于讀多寫少的場(chǎng)景,可以采用樂(lè)觀鎖;對(duì)于寫多讀少的場(chǎng)景,可以采用悲觀鎖。
2. spring中有哪些事務(wù)管理,你在項(xiàng)目中常用的事務(wù)管理
- 編程式事務(wù)管理
編程式事物管理是通過(guò)編寫代碼來(lái)顯示地管理事務(wù)的開(kāi)啟、提交、回滾和關(guān)閉。在代碼中使用事務(wù)管理器(TransactionManager
)或者直接使用(PlatformTransactionManager
)接口進(jìn)行事務(wù)管理,手動(dòng)開(kāi)啟、提交或回滾事物,并定義事務(wù)的邊界。這種方式靈活性較高,但需要手動(dòng)處理事務(wù)的開(kāi)啟、提交和回滾,代碼相對(duì)復(fù)雜。 - 聲明式事務(wù)管理(XML配置)
通過(guò)在XML配置文件中聲明事務(wù)切面(TransactionAspect
),使用tx:advice來(lái)定義事務(wù)的傳播行為、隔離級(jí)別、回滾規(guī)則等。實(shí)現(xiàn)方式示例:
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" propagation="REQUIRED" rollback-for="Exception" /><tx:method name="*" propagation="REQUIRED" /></tx:attributes>
</tx:advice><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.*.*(..))" />
</aop:config>
- 注解驅(qū)動(dòng)的事務(wù)管理:
@Transactional注解可以用來(lái)標(biāo)注在方法(必須是public方法上才能生效)或類級(jí)別上,用來(lái)聲明一個(gè)或多個(gè)方法需要進(jìn)行事務(wù)管理。該注解具有一系列的屬性,用于控制事務(wù)的傳播行為、隔離級(jí)別、超時(shí)時(shí)間和只讀標(biāo)識(shí)等。它是基于AOP的實(shí)現(xiàn)
實(shí)現(xiàn)方式示例:
@Configuration
@EnableTransactionManagement
public class AppConfig {// 配置數(shù)據(jù)源、實(shí)體管理器等相關(guān)Bean
}@Service
public class MyService {@Autowiredprivate MyRepository myRepository;@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)public void saveData(Data data) {// 執(zhí)行數(shù)據(jù)庫(kù)操作或其他業(yè)務(wù)邏輯myRepository.save(data);}
}
3. Set集合是怎么實(shí)現(xiàn)去除重復(fù)元素的
Set 集合底層是通過(guò) Map 集合的 key 儲(chǔ)存元素(value是一個(gè)固定的值),這就保證了Set 不重復(fù)。比如 Set 中的 HashSet。
-
HashSet:HashSet基于哈希表實(shí)現(xiàn),它使用哈希函數(shù)對(duì)元素進(jìn)行快速查找。當(dāng)向HashSet中添加元素時(shí),HashSet會(huì)計(jì)算元素的哈希碼,并將元素存儲(chǔ)在相應(yīng)的哈希桶中。如果哈希桶中已經(jīng)存在相同的元素(根據(jù)equals()方法判斷),則新元素不會(huì)被添加進(jìn)去,從而實(shí)現(xiàn)了去重復(fù)的效果。
-
TreeSet:TreeSet基于紅黑樹(shù)(一種自平衡二叉查找樹(shù))實(shí)現(xiàn),它可以對(duì)元素進(jìn)行排序。當(dāng)向TreeSet中添加元素時(shí),每個(gè)元素會(huì)被插入到正確的位置以保持元素的順序。在插入元素的過(guò)程中,TreeSet會(huì)使用compareTo()或compare()方法來(lái)比較元素的大小,并根據(jù)比較結(jié)果決定元素的插入位置。如果插入的元素已經(jīng)存在于TreeSet中,則新元素不會(huì)被添加進(jìn)去。
-
LinkedHashSet:LinkedHashSet是HashSet的一個(gè)子類,它通過(guò)哈希表和鏈表的結(jié)合來(lái)實(shí)現(xiàn)。它具有HashSet的去重復(fù)功能,并且可以保持元素的插入順序。當(dāng)向LinkedHashSet中添加元素時(shí),元素會(huì)先根據(jù)哈希碼存儲(chǔ)在相應(yīng)的哈希桶中,然后在哈希桶內(nèi)使用鏈表連接起來(lái)。這樣既能提供快速的查找性能,又能保持元素的插入順序。
無(wú)論使用哪種Set實(shí)現(xiàn)類,它們都依賴于元素的hashCode()方法和equals()方法來(lái)進(jìn)行元素的比較和去重。因此,在使用Set集合時(shí),需要確保元素正確實(shí)現(xiàn)了hashCode()和equals()方法,以便正確地判斷元素是否重復(fù)。
需要注意的是,Set集合中的元素必須是唯一的,因此在自定義對(duì)象作為元素時(shí),需要正確實(shí)現(xiàn)hashCode()和equals()方法,以避免出現(xiàn)意外的重復(fù)元素。
4. 如何給5個(gè)Dog對(duì)象排序。
要給5個(gè)Dog對(duì)象排序,需要指定排序的條件和排序規(guī)則。下面介紹兩種常用的排序方法:
- 實(shí)現(xiàn)Comparable接口,重寫compareTo() 方法
- Comparable接口是Java中定義的一個(gè)用于排序的接口,如果一個(gè)類實(shí)現(xiàn)了Comparable接口,就可以使用Collections.sort()方法對(duì)該類進(jìn)行排序。
- 要實(shí)現(xiàn)Comparable接口,需要在類中定義一個(gè)
compareTo()
方法,用來(lái)指定對(duì)象的排序規(guī)則。例如,假設(shè)Dog類有一個(gè)屬性age,我們可以按照age從小到大進(jìn)行排序,可以這樣實(shí)現(xiàn)compareTo()
方法:
public class Dog implements Comparable<Dog> {private int age;// getter和setter方法省略public int compareTo(Dog otherDog) {return this.age - otherDog.getAge();}
}
- 實(shí)現(xiàn)Comparator接口,實(shí)現(xiàn) compare() 方法
- 如果無(wú)法修改Dog類,或者希望根據(jù)不同的條件進(jìn)行排序,可以實(shí)現(xiàn)Comparator接口,它允許我們定義多個(gè)排序規(guī)則。
- 要實(shí)現(xiàn)Comparator接口,需要在另一個(gè)類中定義一個(gè)
compare()
方法,用來(lái)指定對(duì)象的排序規(guī)則。例如,假設(shè)我們想按照名字進(jìn)行排序,可以這樣實(shí)現(xiàn)compare()
方法:
public class DogNameComparator implements Comparator<Dog> {public int compare(Dog dog1, Dog dog2) {return dog1.getName().compareTo(dog2.getName());}
}
然后,在使用排序時(shí),可以選擇使用compareTo()
方法或者compare()
方法進(jìn)行比較,例如:
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog("Charlie", 5));
dogs.add(new Dog("Buddy", 3));
dogs.add(new Dog("Max", 7));
dogs.add(new Dog("Rocky", 2));
dogs.add(new Dog("Jack", 4));// 使用Comparable接口排序
Collections.sort(dogs);// 使用Comparator接口排序
Collections.sort(dogs, new DogNameComparator());
以上代碼演示了如何對(duì)5個(gè)Dog對(duì)象按照age或者name屬性進(jìn)行排序。
5. JVM的調(diào)優(yōu)策略
在進(jìn)行JVM調(diào)優(yōu)時(shí),可以采取以下策略來(lái)改善應(yīng)用程序的性能和吞吐量:
-
調(diào)整堆內(nèi)存大小:
- 堆內(nèi)存是JVM中用于存儲(chǔ)對(duì)象實(shí)例的區(qū)域,通過(guò)調(diào)整堆內(nèi)存大小可以提高應(yīng)用程序的性能。
- 如果應(yīng)用程序頻繁觸發(fā)垃圾回收或者出現(xiàn)內(nèi)存溢出問(wèn)題,可以增加堆內(nèi)存大小??梢酝ㄟ^(guò)設(shè)置
-Xmx
參數(shù)增加堆內(nèi)存的最大值,例如-Xmx4g
表示將堆內(nèi)存的最大值設(shè)置為4GB。
-
調(diào)整垃圾回收器:
- 垃圾回收器是負(fù)責(zé)回收無(wú)用對(duì)象的組件,在不同的場(chǎng)景下選擇合適的垃圾回收器可以提高應(yīng)用程序的性能。
- 可以使用不同類型的垃圾回收器,如Serial、Parallel、CMS、G1等,根據(jù)應(yīng)用程序的特點(diǎn)和需求來(lái)選擇適合的垃圾回收器。
- 可以通過(guò)設(shè)置
-XX:+UseSerialGC
、-XX:+UseParallelGC
等參數(shù)選擇使用特定的垃圾回收器。
-
調(diào)整垃圾回收策略:
- 垃圾回收策略包括新生代和老年代的分配比例、垃圾回收的頻率等,在不同的場(chǎng)景下可以調(diào)整這些策略以提高性能。
- 可以通過(guò)設(shè)置
-XX:NewRatio
參數(shù)調(diào)整新生代和老年代的大小比例,默認(rèn)為2,表示新生代大小為老年代的1/3。 - 可以通過(guò)設(shè)置
-XX:SurvivorRatio
參數(shù)調(diào)整Eden區(qū)和Survivor區(qū)的大小比例,默認(rèn)為8,表示Eden區(qū)大小為Survivor區(qū)的8倍。
-
使用并行處理:
- JVM提供了一些并行處理的選項(xiàng),可以在多核系統(tǒng)上充分利用硬件資源來(lái)提高應(yīng)用程序的性能。
- 可以通過(guò)設(shè)置
-XX:+UseParallelOldGC
參數(shù)啟用并行老年代垃圾回收器,以加速垃圾回收過(guò)程。 - 可以通過(guò)設(shè)置
-XX:+UseConcMarkSweepGC
參數(shù)啟用并發(fā)標(biāo)記-清除垃圾回收器,以減少垃圾回收對(duì)應(yīng)用程序的停頓時(shí)間。
-
調(diào)整線程數(shù)和線程棧大小:
- 線程數(shù)和線程棧大小的設(shè)置也會(huì)影響應(yīng)用程序的性能和穩(wěn)定性。
- 可以通過(guò)設(shè)置
-Xss
參數(shù)調(diào)整線程棧的大小,適當(dāng)增加線程棧的大小可以防止棧溢出錯(cuò)誤。 - 可以通過(guò)設(shè)置
-XX:ParallelGCThreads
參數(shù)調(diào)整垃圾回收線程的數(shù)量,以充分利用多核系統(tǒng)的處理能力。
這些是一些常見(jiàn)的JVM調(diào)優(yōu)策略,具體的調(diào)優(yōu)方法和參數(shù)設(shè)置需要根據(jù)應(yīng)用程序的特點(diǎn)和需求來(lái)確定。在進(jìn)行調(diào)優(yōu)時(shí),建議進(jìn)行性能測(cè)試和監(jiān)控,同時(shí)注意觀察內(nèi)存使用情況、垃圾回收情況以及應(yīng)用程序的響應(yīng)時(shí)間等指標(biāo),以便及時(shí)調(diào)整和優(yōu)化。