我正在开发一个网络应用程序,我在其中手动创建数据源。 (另请参阅我的其他问题为什么: How to use Spring to manage connection to multiple databases )因为我需要连接到其他数据库(dev、prod、qa、test)。
现在我已经解决了选择和切换数据库的问题。但是如果用户退出我的应用程序。他想尝试连接到其他数据库。他仍然连接到相同的数据源,因为在运行时 myDs 不为空。当用户注销时,如何正确处理该数据源?我不希望用户每次查询数据库时都创建数据源。
private DataSource createDataSource(Environment e) {
OracleDataSource ds = null;
String url = null;
try {
if (myDs != null) {
logger.info("myDs connection: " + etmetaDs.getConnection().getMetaData().getURL());
url = myDs.getConnection().getMetaData().getURL();
}
} catch (SQLException exc) {
// TODO Auto-generated catch block
exc.printStackTrace();
}
if (myDs == null) {
try {
ds = new OracleDataSource();
} catch (SQLException ex) {
ex.printStackTrace();
}
ds.setDriverType("oracle.jdbc.OracleDriver");
ds.setURL(e.getUrl());
try {
Cryptographer c = new Cryptographer();
ds.setUser(c.decrypt(e.getUsername()));
ds.setPassword(c.decrypt(e.getPassword()));
} catch (CryptographyException ex) {
logger.error("Failed to connect to my environment [" + e.getName() + "]");
ex.printStackTrace();
return null;
}
logger.info("Connecting to my environment [" + e.getName() + "]");
myDs = ds;
} else if (url.equals(e.getUrl())) {
} else {
}
return myDs;
}
最佳答案
如果您在其他问题中阅读了 Reza 的答案,您可以看到如何创建多个数据源。
我认为这里的问题不在于数据源,而在于您在代码中存储信息的方式。我认为您的 etmetaD 是共享的,但您的所有用户都共享,因此在用户注销时处置它(= 将其设置为 null)不是一个好的选择。
您要做的就是维护每个用户的连接状态。当用户注销时,您可以重置状态,以便在下次连接时获得新连接。
更新:有很多方法可以实现这一目标。我在这里举了一个我想象的例子,但你必须根据你的需要进行调整。假设您有一个包含信息的 UserData 对象:
public class UserData
{
String id;
String name;
String database;
}
您的应用程序中可能有一个包含数据库名称(开发、测试等)的下拉列表,其中第一项为空。当用户选择一个数据库时,您将获得与 createDataSource() 的连接。如果它已经存在,则返回数据源,否则创建一个新数据源。当您的用户断开连接时(或当用户登录时),您将数据库设置为“”以强制他在下拉列表中选择数据库。无需重置数据源。
关于Java数据源,如何处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16274514/