0

我正在开发一个手动创建数据源的 web 应用程序。(另请参阅我的另一个问题为什么:如何使用 Spring 管理与多个数据库的连接)因为我需要连接到其他数据库(开发、产品、质量保证、测试)。

现在我已经解决了在数据库之间选择和切换的问题。但是,如果用户退出我的应用程序。他想尝试连接到另一个数据库。他仍然连接到同一个数据源,因为在运行时 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;
}
4

1 回答 1

1

如果您在其他问题中阅读了 Reza 的答案,您可以看到如何创建多个数据源。
我认为这里的问题不是数据源,而是您在代码中存储信息的方式。我想你的 etmetaDs 是共享的,但你的所有用户都是共享的,所以当用户注销时处理它(= 将其设置为 null)不是一个好的选择。

您要做的是维护每个用户的连接状态。并且当用户注销时,您可以重置状态以便在下次连接时获得新的连接。

更新:有很多方法可以实现这一点。我在这里举一个我想象的例子,但你必须根据自己的需要进行调整。假设您有一个保存信息的 UserData 对象:

public class UserData
{
String id;
String name;
String database;
}

您的应用程序中可能有一个包含数据库名称(dev、test、...)的下拉列表,其中第一项为空。当用户选择一个数据库时,您将获得与 createDataSource() 的连接。如果它已经存在,则返回 DataSource,否则创建一个新的。当您的用户断开连接时(或用户登录时),您将数据库设置为“”以强制他在下拉列表中选择数据库。无需重置数据源。

于 2013-04-29T09:02:05.617 回答