欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java異常報(bào)錯(cuò):?java.io.IOException:?Broken?pipe解決方案

 更新時(shí)間:2025年10月19日 10:23:23   作者:Java小白筆記  
這篇文章主要介紹了Java異常報(bào)錯(cuò):java.io.IOException: Broken pipe的解決方案,java.io.IOException: Broken pipe是Java網(wǎng)絡(luò)編程中最常見的錯(cuò)誤之一,通常發(fā)生在客戶端和服務(wù)端之間的網(wǎng)絡(luò)連接異常斷開時(shí),需要的朋友可以參考下

背景

客戶生產(chǎn)環(huán)境的業(yè)務(wù)系統(tǒng)能夠正常訪問,但是業(yè)務(wù)無法正常進(jìn)行,排查日志發(fā)現(xiàn)大量的java.io.IOException: Broken pipe 的異常,處理問題后以此文章作為記錄。

業(yè)務(wù)系統(tǒng)的前端頁面接收后端傳來的圖片顯示在前端頁面進(jìn)行業(yè)務(wù)操作,但是現(xiàn)在前端頁面的圖片無法正常顯示,業(yè)務(wù)系統(tǒng)可正常訪問,其他功能均正常。

原因分析

我們需要從以下幾個(gè)角度來分析

1 . 首先排查日志根據(jù)異常的拋出點(diǎn)判斷問題發(fā)生原因

排查問題發(fā)生時(shí)間的日志發(fā)現(xiàn)拋出了一個(gè)io異常 java.io.IOException: Broken pipe 斷開的管道

在查看最底部的堆棧信息看看是哪里拋出的異常

觀察最底部的堆棧信息發(fā)現(xiàn)異常是在 OutputBuffer 類的 realWriteBytes 方法中拋出的。

2 . 從源碼角度進(jìn)一步分析

首先我們要清楚realWriteBytes 方法是 Tomcat 中 OutputBuffer 類的一部分,它用于將數(shù)據(jù)從緩沖區(qū)寫入到目標(biāo)輸出流(通常是網(wǎng)絡(luò)套接字)。這個(gè)方法是 OutputBuffer 類的核心方法之一,用于處理數(shù)據(jù)寫入的底層細(xì)節(jié)。

在源碼中可以看到realWriteBytes 方法調(diào)用 doWrite(buf) 方法,實(shí)際的數(shù)據(jù)寫入由 coyoteResponse 的 doWrite 方法完成,該方法將數(shù)據(jù)從緩沖區(qū)寫入到網(wǎng)絡(luò)套接字。如果在寫入過程中拋出了 CloseNowException,則關(guān)閉輸出流并重新拋出異常,如果發(fā)生 IOException,則會(huì)調(diào)用 setErrorException(e) 來記錄錯(cuò)誤,然后拋出 ClientAbortException。

3 . 網(wǎng)絡(luò)套接字 (Socket)和通信管道 (Pipe)定義

在了解Broken Pipe異常的含義前首先讓我們了解一下網(wǎng)絡(luò)通信過程中網(wǎng)絡(luò)套接字(Socket)和通信管道(Pipe)的使用

網(wǎng)絡(luò)套接字 (Socket)

定義:網(wǎng)絡(luò)套接字是一個(gè)通信端點(diǎn),它用于在網(wǎng)絡(luò)上建立和管理連接。一個(gè)套接字代表通信的一個(gè)端點(diǎn),它是由IP地址和端口號的組合所標(biāo)識的。套接字允許在不同的計(jì)算機(jī)之間發(fā)送和接收數(shù)據(jù)。網(wǎng)絡(luò)通信的大多數(shù)協(xié)議(如TCP、UDP)都依賴于套接字來實(shí)現(xiàn)數(shù)據(jù)傳輸。

工作方式

TCP連接:在TCP協(xié)議中,套接字提供了一種面向連接的、可靠的通信方式。客戶端和服務(wù)器通過套接字建立連接,然后在這個(gè)連接上進(jìn)行數(shù)據(jù)交換。

UDP連接:在UDP協(xié)議中,套接字提供了無連接的、盡力而為的通信方式。數(shù)據(jù)通過UDP套接字發(fā)送到目標(biāo)地址,而不保證可靠的傳輸。

通信管道 (Pipe)

定義:在計(jì)算機(jī)科學(xué)中,通信管道是一種用于在同一臺計(jì)算機(jī)上的進(jìn)程之間進(jìn)行數(shù)據(jù)傳輸?shù)臋C(jī)制。管道提供了一個(gè)雙向或單向的數(shù)據(jù)流通道,進(jìn)程可以通過管道發(fā)送和接收數(shù)據(jù)。

工作方式

匿名管道:通常用于在父子進(jìn)程之間傳輸數(shù)據(jù),數(shù)據(jù)從一端寫入,從另一端讀取。

命名管道 (FIFO):可以用于不同進(jìn)程之間的數(shù)據(jù)傳輸,甚至可以在不同用戶之間共享。

Pipe 在網(wǎng)絡(luò)通信中的抽象意義

現(xiàn)在本文中我們討論的網(wǎng)絡(luò)通信的上下文的術(shù)語“pipe”并不是指進(jìn)程間通信的物理管道,而是指客戶端和服務(wù)器之間的通過網(wǎng)絡(luò)套接字建立的數(shù)據(jù)傳輸路徑。在實(shí)際的網(wǎng)絡(luò)通信中,客戶端與服務(wù)器之間通過套接字建立連接,這個(gè)連接就是通信的“管道”。數(shù)據(jù)通過這個(gè)“管道”進(jìn)行傳輸??梢詫⑺醋魇且粭l“虛擬通道”,通過這個(gè)通道,客戶端和服務(wù)器之間可以進(jìn)行雙向數(shù)據(jù)傳輸。

由于**套接字(Socket)**并不是嚴(yán)格意義上發(fā)生在單一層的概念,而是跨越了傳輸層和應(yīng)用層。套接字編程發(fā)生在應(yīng)用層。開發(fā)人員使用編程語言的套接字API來創(chuàng)建套接字、連接到遠(yuǎn)程主機(jī)、發(fā)送和接收數(shù)據(jù)。傳輸層協(xié)議(如TCP或UDP)則在傳輸層實(shí)現(xiàn)實(shí)際的網(wǎng)絡(luò)通信,而套接字在傳輸層的角色是管理端到端的通信連接,并確保數(shù)據(jù)可靠傳輸或快速發(fā)送。

套接字作為一種抽象概念,連接了應(yīng)用層與傳輸層。它為應(yīng)用層提供了一個(gè)接口,使應(yīng)用程序能夠利用傳輸層協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)通信。

在本文中為了直觀的展示套接字在網(wǎng)絡(luò)通信中的使用將應(yīng)用層和傳輸層抽象為同一層網(wǎng)絡(luò)模型,這一層網(wǎng)絡(luò)模型通過**網(wǎng)絡(luò)套接字 (Socket)建立的通信管道 (Pipe)**進(jìn)行數(shù)據(jù)傳輸

4 . Broken Pipe 異常的含義

定義:Broken Pipe 異常發(fā)生在服務(wù)器端嘗試向已經(jīng)關(guān)閉的套接字寫入數(shù)據(jù)時(shí)。通常情況下,這是由于客戶端在服務(wù)器完成數(shù)據(jù)發(fā)送之前已經(jīng)關(guān)閉了連接,導(dǎo)致服務(wù)器無法繼續(xù)發(fā)送數(shù)據(jù)。

在網(wǎng)絡(luò)通信中,套接字是通信的基礎(chǔ),它為客戶端和服務(wù)器之間的數(shù)據(jù)交換提供了通道。當(dāng)客戶端或服務(wù)器中斷連接時(shí),就會(huì)出現(xiàn) Broken Pipe 異常。這意味著數(shù)據(jù)流的“管道”已經(jīng)被破壞,數(shù)據(jù)無法傳輸。

這種情況可能發(fā)生在以下幾種場景中:

1. 客戶端意外斷開連接:

• 客戶端可能由于網(wǎng)絡(luò)故障、應(yīng)用程序崩潰或用戶主動(dòng)關(guān)閉應(yīng)用程序而斷開連接。

2. 長時(shí)間未響應(yīng):

• 如果客戶端長時(shí)間沒有響應(yīng),服務(wù)器端可能繼續(xù)嘗試向客戶端發(fā)送數(shù)據(jù),這時(shí)會(huì)導(dǎo)致 Broken pipe 異常。

3. 緩沖區(qū)未及時(shí) flush:

• 如果緩沖區(qū)中的數(shù)據(jù)未及時(shí)寫入到套接字,當(dāng)對端關(guān)閉連接時(shí),再次嘗試寫入可能導(dǎo)致異常。

5 . 判斷問題來源

服務(wù)端問題的可能性:

處理時(shí)間過長: 服務(wù)器處理請求時(shí)可能因?yàn)橘Y源不足、鎖定資源、復(fù)雜的計(jì)算任務(wù)等原因?qū)е马憫?yīng)延遲。如果超過了瀏覽器或服務(wù)器的超時(shí)時(shí)間,就會(huì)中斷連接,服務(wù)器就可能會(huì)報(bào)告 Broken pipe 。

資源限制: 服務(wù)器可能因?yàn)樨?fù)載過高,無法在合理時(shí)間內(nèi)響應(yīng)請求。這在高并發(fā)場景下尤其常見。

配置問題: 服務(wù)器配置錯(cuò)誤或不當(dāng)(例如超時(shí)時(shí)間過短)也可能導(dǎo)致連接被意外關(guān)閉。

客戶端問題的可能性:

瀏覽器等待時(shí)間短: 如果請求需要很長時(shí)間來完成,而瀏覽器的等待時(shí)間(例如90秒)不足以等待響應(yīng),就可能會(huì)出現(xiàn)超時(shí)錯(cuò)誤。但通常瀏覽器的默認(rèn)超時(shí)時(shí)間是相對寬松的,除非請求需要極長的處理時(shí)間。

網(wǎng)絡(luò)連接不穩(wěn)定: 客戶端(瀏覽器)的網(wǎng)絡(luò)連接不穩(wěn)定,可能導(dǎo)致連接中斷。

中間代理或防火墻: 有時(shí)中間的代理服務(wù)器、防火墻或負(fù)載均衡器可能會(huì)因各種原因中斷連接。

解決方案

針對上面提到的服務(wù)端問題和客戶端問題的可能性分別提出方案進(jìn)行解決

1.模擬事故代碼

首先我們模擬事故代碼,使測試環(huán)境能夠拋出同樣的異常

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@RestController
public class HaHa {
    @GetMapping("/h")
    public void sendFile(HttpServletRequest req, HttpServletResponse resp) {
        FileInputStream fis = null;
        try {
            // 設(shè)置要發(fā)送的文件路徑(使用一個(gè)大文件)
            File file = new File("/opt/SoundSource.zip");  // 替換為你的文件路徑
            fis = new FileInputStream(file);
            // 設(shè)置響應(yīng)的內(nèi)容類型和文件名
            resp.setContentType("application/octet-stream");
            resp.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
            // 獲取響應(yīng)輸出流
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                resp.getOutputStream().write(buffer, 0, bytesRead);
                // 模擬發(fā)送過程中的延遲,便于在中途斷開連接
                Thread.sleep(100);
                
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上面的代碼中我們提供了/h 這個(gè)路徑進(jìn)行訪問,訪問這個(gè)路徑服務(wù)器端就會(huì)向客戶端發(fā)送一個(gè)大文件,而我們只要在接收時(shí)斷開連接即可觸發(fā)同樣的異常報(bào)錯(cuò)。

2 . 服務(wù)端問題的解決方案

(1)優(yōu)化處理時(shí)間

減少單次請求的處理時(shí)間:優(yōu)化代碼,減少單次請求的處理時(shí)間,使用異步處理或多線程處理,并及時(shí)調(diào)用flush()方法,將緩沖區(qū)中的數(shù)據(jù)強(qiáng)制寫入到目標(biāo)流中。在Spring Boot中,可以使用@Async注解來實(shí)現(xiàn)異步處理。

package com.example.demo.controller;

import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@RestController
public class HaHa {
    @Async  //  使用異步處理請求
    @GetMapping("/h")
    public void sendFile(HttpServletRequest req, HttpServletResponse resp) {
        FileInputStream fis = null;
        try {
            // 設(shè)置要發(fā)送的文件路徑(使用一個(gè)大文件)
            File file = new File("/opt/SoundSource.zip");  // 替換為你的文件路徑
            fis = new FileInputStream(file);
            // 設(shè)置響應(yīng)的內(nèi)容類型和文件名
            resp.setContentType("application/octet-stream");
            resp.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
            // 獲取響應(yīng)輸出流
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                resp.getOutputStream().write(buffer, 0, bytesRead);
                resp.getOutputStream().flush();  // 及時(shí)調(diào)用flush() 方法將緩沖區(qū)中的數(shù)據(jù)強(qiáng)制寫入到目標(biāo)流中
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

(2)增加超時(shí)時(shí)間

增加服務(wù)器端超時(shí)時(shí)間:可以通過配置Tomcat或其他應(yīng)用服務(wù)器,增加連接的超時(shí)時(shí)間。這樣即使處理時(shí)間較長,連接也不會(huì)被意外關(guān)閉。

• 對于Tomcat,可以通過修改server.xml中的connectionTimeout屬性來增加超時(shí)時(shí)間。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"  <!-- 設(shè)置超時(shí)時(shí)間為20秒 -->
           redirectPort="8443" />

• 在Spring Boot中,可以通過修改application.properties文件來增加超時(shí)時(shí)間:

server.tomcat.connection-timeout=20000ms  # 設(shè)置Tomcat連接超時(shí)時(shí)間為20秒

通過這些設(shè)置,可以有效增加服務(wù)器的超時(shí)時(shí)間,避免由于超時(shí)導(dǎo)致的連接中斷。

(3) 資源配置調(diào)整

增加服務(wù)器資源:在高并發(fā)情況下,適當(dāng)增加服務(wù)器的資源(如CPU、內(nèi)存)或者擴(kuò)展集群,減少服務(wù)器資源不足導(dǎo)致的響應(yīng)延遲。

負(fù)載均衡:使用負(fù)載均衡器分發(fā)請求,減少單個(gè)服務(wù)器的壓力。

(4) 重試機(jī)制

實(shí)現(xiàn)重試機(jī)制:在捕獲到Broken pipe異常時(shí),可以實(shí)現(xiàn)重試機(jī)制,以避免用戶請求失敗。例如,可以在捕獲到異常后,重新發(fā)送響應(yīng)。

package com.example.demo.controller;

import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@RestController
public class HaHa {
    @Async  //  異步處理請求
    @GetMapping("/h")
    public void sendFile(HttpServletRequest req, HttpServletResponse resp) {
        FileInputStream fis = null;
        int maxRetries = 3;  // 設(shè)置最大重試次數(shù)
        int retryCount = 0;
        boolean success = false;
        try {
            // 設(shè)置要發(fā)送的文件路徑(使用一個(gè)大文件)
            File file = new File("/opt/SoundSource.zip");  // 替換為你的文件路徑
            fis = new FileInputStream(file);
            // 設(shè)置響應(yīng)的內(nèi)容類型和文件名
            resp.setContentType("application/octet-stream");
            resp.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
            // 獲取響應(yīng)輸出流
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                resp.getOutputStream().write(buffer, 0, bytesRead);
                resp.getOutputStream().flush();  // 及時(shí)調(diào)用flush() 方法將緩沖區(qū)中的數(shù)據(jù)強(qiáng)制寫入到目標(biāo)流中
            }
        } catch (IOException | InterruptedException e) {
            retryCount++;
            System.err.println("發(fā)送過程中出現(xiàn)異常,重試次數(shù):" + retryCount);
            e.printStackTrace();
            if (retryCount == maxRetries) {
                System.err.println("最大重試次數(shù)達(dá)到,停止重試");
                resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            }
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

(5)監(jiān)控和報(bào)警

建立監(jiān)控機(jī)制:對服務(wù)器的處理時(shí)間、連接數(shù)量、資源使用情況進(jìn)行監(jiān)控,及時(shí)發(fā)現(xiàn)問題并報(bào)警。

3 . 客戶端問題的解決方案

1. 增加瀏覽器等待時(shí)間

• 修改客戶端代碼,可以增加瀏覽器的等待時(shí)間(如通過JavaScript的XMLHttpRequest或fetch設(shè)置更長的超時(shí)時(shí)間)。

const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 20000); // 20 秒超時(shí)
fetch('/yourApi', { signal: controller.signal })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Fetch error:', error));

PS:為什么這里不直接查看和調(diào)整瀏覽器的超時(shí)時(shí)間

Chrome 瀏覽器:默認(rèn)連接超時(shí)時(shí)間是 300 秒(5 分鐘)。這個(gè)時(shí)間只能通過命令行參數(shù)或網(wǎng)絡(luò)代理配置來間接調(diào)整,瀏覽器本身不提供內(nèi)置選項(xiàng)來更改這一時(shí)間。

Firefox 瀏覽器:默認(rèn)超時(shí)時(shí)間是 90 秒??梢酝ㄟ^訪問 about:config 來查看和調(diào)整一些網(wǎng)絡(luò)相關(guān)的設(shè)置。 在地址欄中輸入 about:config 并回車來查看配置。搜索 network.http.connection-timeout,可以修改該值來調(diào)整連接超時(shí)時(shí)間。其他相關(guān)設(shè)置如 network.http.keep-alive.timeout 可以調(diào)整 Keep-Alive 連接的超時(shí)時(shí)間。

Edge 和 Safari:這些瀏覽器的超時(shí)設(shè)置與 Chrome 類似,也不提供直接的用戶可調(diào)選項(xiàng)。

2. 優(yōu)化網(wǎng)絡(luò)連接

• 如果是網(wǎng)絡(luò)連接不穩(wěn)定引起的問題,建議使用更穩(wěn)定的網(wǎng)絡(luò)環(huán)境,或者盡量使用有線連接,減少無線網(wǎng)絡(luò)帶來的不穩(wěn)定性。

3. 避免大文件傳輸

• 盡量避免在單次請求中傳輸超大文件,如果必須傳輸,可以考慮將文件壓縮后再傳輸,或者采用分片傳輸技術(shù)。

4. 中間代理配置

• 如果網(wǎng)絡(luò)中存在代理、防火墻或者負(fù)載均衡器,可以在相關(guān)服務(wù)中配置網(wǎng)絡(luò)超時(shí)時(shí)間,例如在Nginx 中的 client_body_timeout 和 client_header_timeout 設(shè)置了客戶端請求正文和頭部的超時(shí)時(shí)間。

問題總結(jié)

總結(jié):Broken Pipe 異常是網(wǎng)絡(luò)通信中常見的一種異常,通常在服務(wù)器嘗試向已經(jīng)關(guān)閉的客戶端連接發(fā)送數(shù)據(jù)時(shí)發(fā)生。在設(shè)計(jì)和實(shí)現(xiàn)系統(tǒng)時(shí),應(yīng)該考慮到這種異常情況,進(jìn)行相應(yīng)的優(yōu)化和配置。并確??蛻舳撕头?wù)器端的網(wǎng)絡(luò)穩(wěn)定,避免因網(wǎng)絡(luò)波動(dòng)導(dǎo)致連接中斷。

到此這篇關(guān)于Java異常報(bào)錯(cuò):java.io.IOException: Broken pipe解決方案的文章就介紹到這了,更多相關(guān)Java異常報(bào)錯(cuò)java.io.IOException: Broken pipe內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java操作PDF文件方法之轉(zhuǎn)換、合成、切分

    java操作PDF文件方法之轉(zhuǎn)換、合成、切分

    最近需要做?個(gè)把多個(gè)pdf報(bào)告合并成?個(gè)以?便預(yù)覽的需求,下面這篇文章主要給大家介紹了關(guān)于java操作PDF文件方法之轉(zhuǎn)換、合成、切分的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • SpringMvc自定義攔截器(注解)代碼實(shí)例

    SpringMvc自定義攔截器(注解)代碼實(shí)例

    這篇文章主要介紹了SpringMvc自定義攔截器(注解)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java調(diào)用Python的四種方法小結(jié)

    Java調(diào)用Python的四種方法小結(jié)

    在現(xiàn)代開發(fā)中,結(jié)合不同編程語言的優(yōu)勢往往能達(dá)到事半功倍的效果,本文將詳細(xì)介紹四種在Java中調(diào)用Python的方法,并推薦一種最常用且實(shí)用的方法,希望對大家有一定的幫助
    2025-05-05
  • Java實(shí)現(xiàn)簡單的遞歸操作方法實(shí)例

    Java實(shí)現(xiàn)簡單的遞歸操作方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)簡單的遞歸操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • SpringCloud中的路由網(wǎng)關(guān)鑒權(quán)熔斷詳解

    SpringCloud中的路由網(wǎng)關(guān)鑒權(quán)熔斷詳解

    這篇文章主要介紹了SpringCloud中的路由網(wǎng)關(guān)鑒權(quán)熔斷詳解,Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開源庫,在分布式系統(tǒng)里,許多依賴不可避免的會(huì)調(diào)用失敗,比如超時(shí)、異常等,需要的朋友可以參考下
    2024-01-01
  • SpringBoot同一個(gè)方法操作多個(gè)數(shù)據(jù)源保證事務(wù)一致性

    SpringBoot同一個(gè)方法操作多個(gè)數(shù)據(jù)源保證事務(wù)一致性

    本文探討了在Spring Boot應(yīng)用中,如何在同一個(gè)方法中操作多個(gè)數(shù)據(jù)源并保證事務(wù)的一致性,由于聲明式事務(wù)的限制,直接使用@Transactional注解無法滿足需求,文章介紹了解決方案:編程式事務(wù),它允許在代碼級別更靈活地管理事務(wù),確保多數(shù)據(jù)源操作的事務(wù)一致性
    2024-11-11
  • java?springboot中如何讀取配置文件的屬性

    java?springboot中如何讀取配置文件的屬性

    大家好,本篇文章主要講的是java?springboot中如何讀取配置文件的屬性,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • MyBatis映射文件resultMap元素中使用多個(gè)association的方法

    MyBatis映射文件resultMap元素中使用多個(gè)association的方法

    這篇文章主要介紹了MyBatis映射文件resultMap元素中使用多個(gè)association的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解

    Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解

    這篇文章主要為大家介紹了Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java Map 通過 key 或者 value 過濾的實(shí)例代碼

    Java Map 通過 key 或者 value 過濾的實(shí)例代碼

    這篇文章主要介紹了Java Map 通過 key 或者 value 過濾的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06

最新評論