我创建了一个自定义 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()
- 为什么不只是在方法内创建新的ArrayList
beforefor
循环。...等等...
如果您将所有内容作为参数传递给方法并返回在方法中创建的所有内容,它将是完全线程安全的。
单例可能只有不可变的实例变量(逻辑上几乎是常量),以保持某些设置或属性适用于使用它的任何线程。
哔哔one
TA贡献1854条经验 获得超8个赞
它SqlDataset.java
本身不是线程安全的,因为其中有实例变量。
但是,如果您仅在某些request controller
方法中使用它,则不会有任何问题。这是因为 aServlet
不是线程安全的,但 Servlets 方法是线程安全的。
添加回答
举报
0/150
提交
取消