猿问

Java:线程安全的数据集实现

我创建了一个自定义 SQLDataset 实现,它接受一个 SQL 查询并将 LinkedHashmap 列表返回给请求控制器,以便在 JSP 中显示或以 Excel 格式下载。


您能否让我知道该方法是否是线程安全的?


SqlDataset.java


package 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;

    }

一只名叫tom的猫
浏览 128回答 2
2回答

ABOUTYOU

这取决于你如何使用这个类。使用doPost控制器中的方法,它对于多个用户来说是线程安全的,因为您new &nbsp;SqlDataset每次都创建对象。这意味着它将仅由处理单个请求的线程使用。您的控制器代码是可重入且线程安全的。顺便说一句,如果您打算使用您SqlDataset的单例(例如 Spring bean 等) - 它不是线程安全的。它在流程中使用了实例变量——这意味着SqlDataset方法不可重入。想想他们……private QueryProcessor qp;每次在getQueryResult()方法中创建新实例时,您真的需要吗?private ArrayList<String> dataHeader = new ArrayList<>();&nbsp;当你从它返回时你真的需要getHeaders()- 为什么不只是在方法内创建新的ArrayListbeforefor循环。...等等...如果您将所有内容作为参数传递给方法并返回在方法中创建的所有内容,它将是完全线程安全的。单例可能只有不可变的实例变量(逻辑上几乎是常量),以保持某些设置或属性适用于使用它的任何线程。

哔哔one

它SqlDataset.java本身不是线程安全的,因为其中有实例变量。但是,如果您仅在某些request controller方法中使用它,则不会有任何问题。这是因为 aServlet不是线程安全的,但 Servlets 方法是线程安全的。
随时随地看视频慕课网APP

相关分类

Java
我要回答