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

时间:2018-04-03 08:15:24

标签: java mongodb spring-boot spring-data spring-data-mongodb

我想使用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

1 个答案:

答案 0 :(得分:0)

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