亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java:線程安全的數據集實現

Java:線程安全的數據集實現

一只名叫tom的貓 2022-06-15 15:56:27
我創建了一個自定義 SQLDataset 實現,它接受一個 SQL 查詢并將 LinkedHashmap 列表返回給請求控制器,以便在 JSP 中顯示或以 Excel 格式下載。您能否讓我知道該方法是否是線程安全的?SqlDataset.javapackage com.sqle.core;import com.util.QueryProcessor;import java.io.Serializable;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;public class SqlDataset implements Serializable {    private String query;    private QueryProcessor qp;    private ResultSet rsSet;    private List<LinkedHashMap<String, Object>> rsList = new ArrayList<>();    private ArrayList<String> dataHeader = new ArrayList<>();    public SqlDataset() {}    public SqlDataset(String uquery) {        this.query = uquery;    }    private ResultSet getQueryResult() throws Exception {        qp = new QueryProcessor(query);        this.rsSet = qp.getQueryResultSet();        return this.rsSet;    }    public List<LinkedHashMap<String, Object>> getResult() throws Exception {        return this.getValues(this.getQueryResult());    }    public List<LinkedHashMap<String, Object>> getResult(String query) throws Exception {        this.query = query;        return this.getValues(this.getQueryResult());    }    public int getRowCount() {        return this.rsList.size();    }    public ArrayList getHeaders() {        for (LinkedHashMap<String, Object> aRsList : this.rsList) {            for (Map.Entry<String, Object> dh : aRsList.entrySet()) {                if (!this.dataHeader.contains(dh.getKey()))                    this.dataHeader.add(dh.getKey());            }        }        return this.dataHeader;    }
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

這取決于你如何使用這個類。

使用doPost控制器中的方法,它對于多個用戶來說是線程安全的,因為您new  SqlDataset每次都創建對象。

這意味著它將僅由處理單個請求的線程使用。

您的控制器代碼是可重入且線程安全的。

順便說一句,如果您打算使用您SqlDataset的單例(例如 Spring bean 等) - 它不是線程安全的。它在流程中使用了實例變量——這意味著SqlDataset方法不可重入。

想想他們……

  • private QueryProcessor qp;每次在getQueryResult()方法中創建新實例時,您真的需要嗎?

  • private ArrayList<String> dataHeader = new ArrayList<>(); 當你從它返回時你真的需要getHeaders()- 為什么不只是在方法內創建新的ArrayListbeforefor循環。...等等...

如果您將所有內容作為參數傳遞給方法并返回在方法中創建的所有內容,它將是完全線程安全的。

單例可能只有不可變的實例變量(邏輯上幾乎是常量),以保持某些設置或屬性適用于使用它的任何線程。


查看完整回答
反對 回復 2022-06-15
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

SqlDataset.java本身不是線程安全的,因為其中有實例變量。

但是,如果您僅在某些request controller方法中使用它,則不會有任何問題。這是因為 aServlet不是線程安全的,但 Servlets 方法是線程安全的。


查看完整回答
反對 回復 2022-06-15
  • 2 回答
  • 0 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號