成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【Spring大揭秘】系統(tǒng)性能提升!帶你解鎖系統(tǒng)優(yōu)化大法

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
在Spring框架中,數(shù)據(jù)庫(kù)查詢是常見(jiàn)的高負(fù)載點(diǎn)之一。因此,優(yōu)化數(shù)據(jù)庫(kù)查詢是提高系統(tǒng)性能的關(guān)鍵。

環(huán)境:Spring5.3.23

Spring在各大公司基本上都是標(biāo)配,它提供了豐富的功能和靈活性,但在使用過(guò)程中如果不注意性能優(yōu)化,可能會(huì)導(dǎo)致系統(tǒng)運(yùn)行緩慢或出現(xiàn)其他問(wèn)題。以下是一些Spring編程中性能優(yōu)化的實(shí)際案例:

使用AOP實(shí)現(xiàn)日志記錄優(yōu)化

在Spring中,可以使用AOP(面向切面編程)來(lái)實(shí)現(xiàn)日志記錄的優(yōu)化。在系統(tǒng)中有大量的日志記錄時(shí),如果每個(gè)請(qǐng)求都進(jìn)行日志記錄,會(huì)占用大量的系統(tǒng)資源,導(dǎo)致系統(tǒng)性能下降。因此,可以使用AOP技術(shù),根據(jù)一定的條件對(duì)日志記錄進(jìn)行篩選和優(yōu)化。例如,可以定義一個(gè)切面(Aspect),在切面中實(shí)現(xiàn)日志記錄的功能,并根據(jù)一定的條件判斷是否需要進(jìn)行日志記錄。這樣可以避免每個(gè)請(qǐng)求都進(jìn)行日志記錄,從而提高系統(tǒng)的性能。示例代碼如下:

優(yōu)化前:

@Service  
public class UserService {  
  private static final Logger logger = LoggerFactory.getLogger(UserService.class) ;
  @Resource  
  private UserRepository userRepository ;  


  public User queryById(long userId) {  
    User user = this.userRepository.findById(userId) ;
    log.info("queryById - User - {}", user) ;
    return user ;  
  }   
}

在優(yōu)化前的代碼中,我們直接打印用戶信息到日志中。

接下來(lái),我們將使用AOP來(lái)實(shí)現(xiàn)日志記錄的優(yōu)化。首先,我們需要定義一個(gè)切面(Aspect),在切面中實(shí)現(xiàn)日志記錄的功能,并根據(jù)一定的條件判斷是否需要進(jìn)行日志記錄。以下是優(yōu)化后的代碼示例:

優(yōu)化后:

@Aspect  
@Component  
public class UserServiceAspect {  
  
  @Pointcut("execution(* query*(long))")
  private void log() {}
  @Before("log()")  
  public void logBefore(JoinPoint joinPoint) {  
    long userId = (int) joinPoint.getArgs()[0] ;  
    // 只有當(dāng)userId不合規(guī)才打印日志 
    if (userId <= 0) {
      log.info("queryById - start - userId: {}", userId) ;  
    }  
  }
  @AfterReturning(pointcut = "execution(public User query*(long))", returning = "user")  
  public void logAfter(JoinPoint joinPoint, User user) {  
    // 只有查詢到用戶了才記錄用戶信息到日志 
    if (user != null) { 
      long userId = (int) joinPoint.getArgs()[0] ;  
      log.info("queryById - end - userId={}, user info={}", userId, user);  
    }  
  } 
}

通過(guò)切面,我們就可以根據(jù)條件篩選出需要日志記錄的請(qǐng)求,避免了對(duì)所有請(qǐng)求都進(jìn)行日志記錄,從而提高系統(tǒng)的性能。

使用二級(jí)緩存

在Spring框架中,可以使用二級(jí)緩存來(lái)優(yōu)化數(shù)據(jù)的訪問(wèn)性能。二級(jí)緩存是指將數(shù)據(jù)緩存在內(nèi)存中,以避免頻繁的數(shù)據(jù)庫(kù)訪問(wèn)操作。在Spring中,可以使用@Cacheable注解將一個(gè)方法標(biāo)記為可緩存的,這樣該方法的返回值就會(huì)被緩存在內(nèi)存中。當(dāng)同一個(gè)方法被調(diào)用時(shí),直接從緩存中獲取返回值,而不需要再次訪問(wèn)數(shù)據(jù)庫(kù)。這樣可以減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),從而提高系統(tǒng)的性能。

優(yōu)化前:

@Service  
public class UserService {  
  @Resource  
  private UserRepository userRepository ;  


  public User queryById(long userId) {  
    User user = this.userRepository.findById(userId) ;
    return user ;  
  }   
}

優(yōu)化前每次獲取用戶都會(huì)從數(shù)據(jù)庫(kù)中查詢。

接下來(lái),我們將使用二級(jí)緩存來(lái)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)的優(yōu)化。首先,我們需要定義一個(gè)緩存管理器(CacheManager),用于管理緩存。以下是優(yōu)化后的代碼示例:

優(yōu)化后:

// 為了方便演示,這里我們自定義一個(gè)緩存管理器
@Configuration  
public class CacheConfig {  
  @Bean  
  public CacheManager cacheManager() {  
    return new ConcurrentMapCacheManager("user") ;  
  }  
}

接下來(lái),我們需要在UserService中注入CacheManager,并使用@Cacheable注解將queryById方法標(biāo)記為可緩存的。以下是優(yōu)化后的代碼示例:

@Service  
@CacheConfig(cacheManager = "cacheManager") // 注入CacheManager  
public class UserService {  
      
  @Resource  
  private UserRepository userRepository ;
  @Autowired  
  private CacheManager cacheManager;  


  // 標(biāo)記為可緩存的,并指定緩存值和鍵  
  @Cacheable(value = "user", key = "#userId") 
  public User queryById(long userId) {  
    User user = userRepository.findById(userId) ;  
    return user ; 
  }  
}

這樣,該方法的返回值會(huì)被緩存在內(nèi)存中,當(dāng)同一個(gè)方法的調(diào)用時(shí),直接從緩存中獲取返回值,而不需要再次訪問(wèn)數(shù)據(jù)庫(kù)。這樣可以減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),從而提高系統(tǒng)的性能。

減少數(shù)據(jù)庫(kù)查詢次數(shù)

在一個(gè)訂單管理系統(tǒng)中,有一個(gè)訂單詳細(xì)信息(OrderDetail)實(shí)體,該實(shí)體與訂單表(Order)在數(shù)據(jù)庫(kù)中有1對(duì)1的關(guān)系。在獲取訂單詳細(xì)信息時(shí),不需要每次都查詢Order表。通過(guò)使用JPA的fetch屬性,可以將Order表的數(shù)據(jù)在一次查詢中一并獲取。這樣,每個(gè)訂單詳細(xì)信息實(shí)體只會(huì)引發(fā)一次數(shù)據(jù)庫(kù)查詢,而不是之前的每次獲取都查詢。

優(yōu)化前:

@Repository  
public interface OrderRepository extends JpaRepository<Order, Long> {  
  Order findByOrderId(Long orderId);  
}
@Service  
public class OrderService {  


  @Resource
  private OrderRepository orderRepository;  
  public Order getOrderById(Long orderId) {  
    return orderRepository.findByOrderId(orderId);
  }  


}

上面每次獲取訂單都會(huì)發(fā)送多條SQL進(jìn)行數(shù)據(jù)查詢。優(yōu)化后:

@Repository  
public interface OrderRepository extends JpaRepository<Order, Long> {  


  @Select("SELECT o.*, od.* FROM Order o LEFT JOIN o.orderDetails od WHERE o.id = ?1")  
  Order findWithOrderDetailsByOrderId(Long orderId);  


}

這樣,我們只需一次數(shù)據(jù)庫(kù)查詢就可以獲取到訂單及其所有詳細(xì)信息。

使用多線程池

在Spring框架中,可以使用多線程池來(lái)優(yōu)化任務(wù)的執(zhí)行性能。當(dāng)系統(tǒng)中有大量的異步任務(wù)需要執(zhí)行時(shí),如果每個(gè)任務(wù)都創(chuàng)建一個(gè)新的線程來(lái)執(zhí)行,會(huì)導(dǎo)致系統(tǒng)資源浪費(fèi)和性能下降。因此,可以使用多線程池來(lái)管理任務(wù)的執(zhí)行。在Spring中,可以使用ThreadPoolTaskExecutor來(lái)實(shí)現(xiàn)多線程池的配置和管理。這樣可以避免每個(gè)任務(wù)都創(chuàng)建新的線程,從而提高系統(tǒng)的性能。

優(yōu)化前:

@Service  
public class UserService {  
  
  @Resource  
  private UserRepository userRepository ; 


  @Override  
  public List<User> getUsers() {  
    List<User> users = userRepository.findAll();  
    for (User user : users) {  
      // 處理用戶數(shù)據(jù)  
    }  
    return users ;  
  }


}

優(yōu)化前處理用戶在一個(gè)線程中執(zhí)行,時(shí)間可能會(huì)很長(zhǎng)影響系統(tǒng)整體性能。接下來(lái),我們將使用多線程池來(lái)實(shí)現(xiàn)并發(fā)處理的優(yōu)化。可以考慮使用Java中的Executor框架來(lái)管理線程池。我們可以創(chuàng)建ThreadPoolExecutor類來(lái)定義線程池,并指定線程池的核心線程數(shù)、最大線程數(shù)和線程存活時(shí)間等參數(shù)。在處理每個(gè)用戶時(shí),我們可以將任務(wù)分配給線程池中的一個(gè)線程進(jìn)行處理,這樣可以同時(shí)處理多個(gè)用戶,提高系統(tǒng)的并發(fā)性能。以下是優(yōu)化后的代碼示例:

優(yōu)化后:

@Service  
public class UserService {  
  
  @Resource  
  private UserRepository userRepository ;
  
  private ThreadPoolExecutor pool;  
   
  @Override  
  public List<User> getUsers() {  
    int coreThreads = 10; // 核心線程數(shù)      
    int maxThreads = 20; // 最大線程數(shù)  
    long keepAliveTime = 60L; // 線程存活時(shí)間(單位:秒)  
    ThreadPoolExecutor pool = new ThreadPoolExecutor(
        coreThreads, 
        maxThreads,
        keepAliveTime,
        TimeUnit.SECONDS,
        new LinkedBlockingQueue<>()) ;
    List<User> users = userRepository.findAll() ;  
    for (final User user : users) {  
      pool.execute(() -> {  
        // TODO
      });  
    }  
    pool.shutdown(); // 關(guān)閉
    return users;  
  }  
}

注意要在最后調(diào)用pool的shutdown方法來(lái)關(guān)閉線程池(非阻塞)。這樣,系統(tǒng)可以同時(shí)處理多個(gè)用戶,提高并發(fā)性能。

優(yōu)化數(shù)據(jù)庫(kù)查詢

在Spring框架中,數(shù)據(jù)庫(kù)查詢是常見(jiàn)的高負(fù)載點(diǎn)之一。因此,優(yōu)化數(shù)據(jù)庫(kù)查詢是提高系統(tǒng)性能的關(guān)鍵。可以從以下幾個(gè)方面對(duì)數(shù)據(jù)庫(kù)查詢進(jìn)行優(yōu)化:

  • 使用索引:為數(shù)據(jù)庫(kù)中的字段添加索引(根據(jù)情況最好是聯(lián)合索引)可以加速查詢速度。
  • 避免使用SELECT *:避免查詢所有字段,只查詢需要的字段可以提高查詢速度,盡可能的應(yīng)用覆蓋索引。
  • 分頁(yè)查詢:使用分頁(yè)查詢可以減少查詢的數(shù)據(jù)量,從而提高查詢速度。
  • 批量操作:盡可能減少與數(shù)據(jù)庫(kù)的交互次數(shù),可以批量操作來(lái)減少查詢次數(shù)。
  • 使用連接池:連接池可以管理數(shù)據(jù)庫(kù)連接,避免頻繁的創(chuàng)建和銷毀連接,從而提高性能。

以上是一些Spring編程中性能優(yōu)化的實(shí)際案例。通過(guò)對(duì)這些案例的分析和學(xué)習(xí),可以更好地應(yīng)用Spring框架,提高系統(tǒng)的性能和可靠性。

責(zé)任編輯:武曉燕 來(lái)源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2024-10-14 12:38:59

2024-06-13 08:24:43

SpringGateway線程池

2024-11-08 14:27:52

系統(tǒng)設(shè)計(jì)數(shù)據(jù)庫(kù)

2023-06-12 00:22:50

操作系統(tǒng)應(yīng)用程序內(nèi)核鎖

2023-10-17 14:35:22

人工智能AI

2010-04-09 13:26:44

2010-04-25 23:39:42

2018-12-10 15:13:06

緩存系統(tǒng)性能數(shù)據(jù)

2009-02-18 20:27:24

組策略提升Windows性能

2009-03-22 19:19:15

多核多核服務(wù)器多核歷史

2015-07-28 09:19:10

Linux內(nèi)核

2024-12-11 07:59:02

2016-09-26 13:50:52

Linux系統(tǒng)性能

2011-08-09 17:15:45

注冊(cè)表注冊(cè)表編輯器

2011-09-19 14:30:47

Vista緩存

2023-10-26 08:33:16

Redis管道技術(shù)

2021-08-10 08:44:13

系統(tǒng)性能優(yōu)化

2010-04-23 11:44:34

Aix系統(tǒng)

2009-09-29 10:39:04

Linuxlinux系統(tǒng)性能檢測(cè)

2024-04-01 08:04:05

JProfilerJVM工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美精品乱码99久久影院 | av在线天堂网 | 日韩www| 日韩中文字幕一区 | 欧美狠狠操 | 国产精品国产精品国产专区不卡 | 亚洲一区在线播放 | 7777在线视频 | 久久精品高清视频 | 久久免费国产 | 午夜影院操 | 国产精品日韩一区二区 | 亚洲视频免费观看 | 免费国产视频 | 91偷拍精品一区二区三区 | 日韩欧美国产电影 | 狠狠色综合网站久久久久久久 | 精品国产免费一区二区三区演员表 | 伦理一区二区 | 久久久久久久久久久一区二区 | 成人二区 | 日韩国产欧美视频 | 午夜精品久久久久久久久久久久久 | 亚洲最大成人综合 | 久久成人国产精品 | 中文在线a在线 | a在线观看 | 精品久久久久一区二区国产 | a在线观看免费 | 色综合视频 | 精品婷婷 | 国产精品久久久久久久久久免费看 | 99久久精品国产一区二区三区 | 在线一区视频 | 91精品在线播放 | 91精品久久久久久久久中文字幕 | 真人女人一级毛片免费播放 | 在线不卡一区 | 欧美成人hd| 欧美日韩亚洲国产 | 美日韩视频 |