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);
}
}
我需要在播放框架启动时执行数据库查询以检索服务器信息。我写了一个 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);
}
}