我有一个使用Project Wonder框架的WebObjects应用程序。如果我没记错的话,似乎在我们开始使用Project Wonder之前,我们可以在不重新启动应用程序的情况下更改数据库连接设置。几年前搬到项目Wonder之后,我们失去了动态更改数据库设置的能力。似乎Project Wonder预计连接设置在启动时已作为WebObjects属性存在,因此在应用程序启动后更改属性不会产生任何影响。当时我们并没有过多地对抗它,并认为在数据库更改时只是简单地重新启动应用程序并不是什么大问题,因为我们没有预料到这种更改会频繁出现。
多年来情况发生了变化,并且在更改数据库后需要重新启动不再像以前那样合理。我试过在Project Wonder / WebObjects中找到什么来缓存设置,但还没有找到答案。我想知道是否有人在WebObjects / Project Wonder应用程序中动态更改数据库设置。
答案 0 :(得分:0)
我不认为这是“当天回来”或“现在使用Project Wonder”问题。我认为当WO被移植到Java时行为发生了变化。
理论上,人们应该能够做到这一点。在实践中,我认为它不会很好地值得它。 WO和EOF中的所有数据结构都被懒惰地实例化。如果你想切换数据库,你需要销毁所有,并且我的意思是所有引用旧数据库的对象。有可能找到大部分并清除它们吗?是的,这甚至都不太难。是否有可能找到所有这些?也许不是。
首先,Java比ObjC的动态要小得多。在java中的静态块中实例化了很多东西。所有这些类都可以注册更改EOModel时发生的通知。他们都注册了吗?可能不是。
所以,你可以摆脱一些应用程序的状态,你将能够用新数据库做一些事情,事情可能会工作一段时间,然后他们可能会停止工作。你或许可以找出原因。或者你可以重新启动这个应用程序....
答案 1 :(得分:0)
或者你可以在这里遵循这些lil说明;)
要在运行时更改Connection,您必须基本设置对象存储协调器
您可以像这样创建自定义对象商店协调员:
NSMutableDictionary<String, String> temp = new NSMutableDictionary<String, String>();
temp.put("URL", String.format("%s?useBundledJdbcInfo=true", url));
temp.put("username", username);
temp.put("password", password);
temp.put("name", name);
connectionDictionary=temp.immutableClone();
// Create a new Object store coordinator
objectStoreCoordinator = new ERXObjectStoreCoordinator();
ERXModelGroup.setModelGroupForObjectStoreCoordinator(
objectStoreCoordinator, ERXModelGroup.defaultGroup()
);
// Set the model that you want to use to connect to multiple databases
EOAdaptor adaptor =ERXDatabaseContext.registeredDatabaseContextForModel(
ERXModelGroup.defaultGroup().modelNamed("YourModelName"),
objectStoreCoordinator
).adaptorContext().adaptor();
// update the connection dictionary
adaptor.setConnectionDictionary(
updateDictionary(adaptor.connectionDictionary(),
connectionDictionary)
);
通过这种方式,您可以轻松创建指向您选择的数据库的新编辑上下文
ERXEC.newEditingContext(objectStoreCoordinator);
如果您的应用程序被多个用户使用,并且他们都需要在多个数据库之间切换而不互相干扰,我建议您不要使用共享编辑上下文。
像这样你可以避免人们改变对象存储协调器,使其他人也指向那个数据库(不是那么有趣)。