gpt4 book ai didi

java - 使用 Spring 的服务器内存上的单个类文件会导致问题

转载 作者:行者123 更新时间:2023-12-02 02:21:59 26 4
gpt4 key购买 nike

我不太知道如何解释这种情况,我会尽量说清楚。

我目前正在编写一个Web应用程序,使用Spring来管理bean。显然,不止一个人会使用这个应用程序。每个用户都有一组与自己相关的数据。我的问题来自于我刚进入开发领域时引入的一些糟糕的设计。案例如下:

@Component
public class ServiceClass implements IService {

@Autowired
private Dependency firstDependency;

@Autowired
private UsefulObject secondDependency;

private DataSet dataSet; // THIS LINE IS IMPORTANT

public void entryPoint(String arg1, int arg2, Structure arg3) {
/* Query data from a database specific from the project (not SQL
oriented. I absolutely need this information to keep going. */
dataSet = gatherDataSet(String ar1);

/* Treat the data */
subMethodOne(arg1);
subMethodTwo(arg2);
subMethodThree(arg3);
}

private subMethodOne(String arg1) {
// Do some things with arg1, whatever
subSubMethod(arg1);
}

private subSubMethod(String arg1) {
/* Use the DataSet previously gathered */
dataSet.whateverDoing();
}

... // Functions calling sub-methods, using the DataSet;

由于每个用户都有不同的dataSet,我认为最好在每次调用我的服务时调用它。同样,由于它在调用层次结构中使用得很深,我认为将其存储为属性是个好主意。

我遇到的问题是,当两个用户几乎同时使用此服务时,我遇到了交叉数据问题。发生以下情况:

  • 第一个用户进来,调用gatherDataSet
  • 第二个用户进来,调用gatherDataSet。第一个用户仍在治疗!
  • 第一个用户仍然使用 dataSet 对象,该对象已被第二个用户覆盖。

基本上,第一个用户使用的数据变得错误,因为他使用了第二个用户的数据,而第二个用户紧随其后。

我的问题如下:

  • 是否有设计模式/方法可以避免这种行为?
  • 您能否配置 Spring,使其为两个用户使用两个实例(依此类推),以避免此类问题?

奖励:(有点不相关)如何实现非常大的数据映射器?

最佳答案

对象成员变量(字段)与对象一起存储在堆上。因此,如果两个线程调用同一个对象实例上的方法,并且该方法更新对象成员变量,则该方法不是线程安全的。

但是,如果一个资源是在同一个线程的控制下创建、使用和处置的,并且永远不会逃脱该线程的控制,则该资源的使用是线程安全的。

考虑到这一点,改变你的设计。 https://books.google.co.in/books?isbn=0132702258是想出基于 Java 的优秀软件设计的必读书籍

更多 stackoverflow 链接:Why are local variables thread safe in Java , Instance methods and thread-safety of instance variables

Spring 提倡单例模式(这是默认的 bean 作用域)。 Spring 配置为两个不同的用户提供两个服务类对象称为原型(prototype) bean 作用域,但应尽可能避免。

考虑使用内存中的Map或外部no-sql数据存储或外部关系数据库

关于java - 使用 Spring 的服务器内存上的单个类文件会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48378921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com