Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从静态ThreadLocal变量更改Spring数据存储库的Mongo集合是否线程安全?_Java_Mongodb_Spring Boot_Spring Data_Spring Data Mongodb - Fatal编程技术网

Java 从静态ThreadLocal变量更改Spring数据存储库的Mongo集合是否线程安全?

Java 从静态ThreadLocal变量更改Spring数据存储库的Mongo集合是否线程安全?,java,mongodb,spring-boot,spring-data,spring-data-mongodb,Java,Mongodb,Spring Boot,Spring Data,Spring Data Mongodb,我想使用SpringDataMongo存储库并在运行时指定文档的集合。 我在这张票中找到了实现它的方法,以及我所做的: 已使用ThreadLocal变量创建GenericObject,并将集合名称链接为 此静态变量: @Data @Document(collection = "#{T(com.test.myproject.model.GenericObject).getCollection()}") public class GenericObject { private static

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

已使用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();
    }

}
问题是:

我的方法是线程安全的吗?有什么我看不到的问题吗


SpringDataMongoDB版本:2.0.5。发布版

听起来直接使用几乎更好。为什么要担心
ThreadLocal
。若你们想看到更多关于静态线程本地使用的信息,你们可以参考这个问题:但你们的方法是好的。ThreadLocal可以安全使用,因为其他线程无法设置其他线程的ThreadLocal。

@OliverGierke,DATAMONGO-525是否在最新版本中?感谢answer@Strelok,挑战在于使用MongoRepositories而不使用MongoTemplate或MongoOperations实施CRUD操作。我只是想确定春天不会有任何副作用。
public interface GenericObjectRepository extends MongoRepository<GenericObject, ObjectId> {
}
// 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));