Guice 启动数据库查询

Guice Startup Database Query

我需要在播放框架启动时执行数据库查询以检索服务器信息。我写了一个 ServerInstanceModule ie.

public class ServerInstanceModule extends AbstractModule {
ServerInstance serverInstance;

@Override
protected void configure() {

}

@Provides
@Inject
ServerInstance provideServerInstance(Configuration configuration){
    if (serverInstance == null) {
        String serverInstanceId = configuration.getString("instance.db.id");
        try {
            if (serverInstanceId != null) {
                serverInstance = models.managemend.ServerInstance.find.byId(Long.parseLong(serverInstanceId));
            }
        } catch (Throwable e) {
            Logger.error(e.getMessage(), e);
        }
    }
    return serverInstance;
}}

这样做正确吗?我尝试编写一个服务,将其声明为单例并急切地加载它。

@Singleton public class ServerInstanceService {
@Inject
private Configuration configuration;

ServerInstance serverInstance;

public ServerInstance get() {
    if (serverInstance == null) {
        String serverInstanceId = configuration.getString("instance.db.id");
        try {
            if (serverInstanceId != null) {
                serverInstance = ServerInstance.find.byId(Long.parseLong(serverInstanceId));
            }
        } catch (Throwable e) {
            Logger.error(e.getMessage(), e);
        }
    }
    return serverInstance;
}}

但有时 guice 会以错误开始,因为服务器实例为空。有没有人对我如何解决这个问题有任何建议?我真的很想使用服务而不是模块。

您面临竞争条件和线程安全问题。这是实现它的最简单方法,但是 serverInstance 不是线程安全的,因为它可能有修改器。

@Singleton
public class ServerInstanceService implements IServerInstanceService {

    private final ServerInstance servcerInstance;

    @Inject
    public ServerInstanceService(Configuration config) {
        Long id = // ..
        servcerInstance = ServerInstance.findById(id);
    }

}