gpt4 book ai didi

java - 从静态 ThreadLocal 变量更改 Spring Data Repositories 的 Mongo 集合是否线程安全?

转载 作者:可可西里 更新时间:2023-11-01 10:46:52 25 4
gpt4 key购买 nike

我想使用 Spring Data Mongo 存储库并在运行时指定文档集合。我在这张票中找到了实现它的方法 DATAMONGO-525以及我所做的:

使用 ThreadLocal 变量和链接集合名称创建了 GenericObject 这个静态变量:

@Data
@Document(collection = "#{T(com.test.myproject.model.GenericObject).getCollection()}")
public class GenericObject {

private static ThreadLocal<String> collection = new ThreadLocal<>();

@Id
private ObjectId id;

private org.bson.Document doc;

public static void setCollection(String type) {
collection.set(type);
}

public static String getCollection() {
return collection.get();
}

}

我为 GenericObject 创建了 GenericRepository:

public interface GenericObjectRepository extends MongoRepository<GenericObject, ObjectId> {
}

所以,现在当我想从特定集合中获取/保存/删除 GenericObject 时,我应该在每个请求之前指定集合:

// save
GenericObject obj = new GenericObject();
GenericObject.setCollection(collectionName);
genericObjectRepository.save(obj)
...
//get
GenericObject.setCollection(collectionName);
genericObjectRepository.findById(new ObjectId(id))
.orElseThrow(() -> new RecordNotFoundException("GOS00001", id, collection));

问题是:

我的方法是线程安全的吗?是否有任何我没有看到的问题?

SpringDataMongoDB版本:2.0.5.RELEASE

最佳答案

听起来你使用 MongoOperations 几乎更好直接地。为什么要担心 ThreadLocal。如果您想查看有关静态 ThreadLocal 用法的更多信息,您可以引用这个问题:Java ThreadLocal static?但是,是的,你的方法很好。 ThreadLocal 可以安全使用,因为不同的线程无法设置另一个线程的 ThreadLocal。

关于java - 从静态 ThreadLocal 变量更改 Spring Data Repositories 的 Mongo 集合是否线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49625300/

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