【问题标题】:Is there a way to change an Oracle connection on the fly in Play! Framework?有没有办法在 Play 中即时更改 Oracle 连接!框架?
【发布时间】:2011-11-21 07:08:22
【问题描述】:

我目前在一个项目中工作,其中每个用户在 Oracle 11g DB 中都有自己的模式。之所以完成此设计,是因为访问 Oracle 表的所有安全角色和权限都存储在数据库中。我们的团队正在尝试如何在酷炫的 Play 中做到这一点!框架。有什么建议吗?

【问题讨论】:

    标签: java oracle jdbc playframework oracle11g


    【解决方案1】:

    据我了解,您可以尝试用类似这样的方式包装 DB.datasource 的值(其中 currentUser()currentPassword() 应该返回发出请求的当前用户的凭据):

    public class DataSourceWrapper {
        private DataSource original;
        public DataSourceWrapper(DataSource original) {
            this.original = original;
        }
    
        public Connection getConnection() {
            return original.getConnection(currentUser(), currentPassword());
        }
    
        ...
    
        public DataSource getOriginal() {
            return original;
        }
    }
    

    DB.datasource 的替换应该发生在 DB 和 JPA 插件的 onApplicationStart() 方法执行之间,因此您需要创建自定义插件:

    public class DataSourceReplacementPlugin extends PlayPlugin {
        public void onApplicationStart() {
            DB.datasource = new DataSourceWrapper(DB.datasource);
        }
    
        public void onApplicationStop() {
            if (DB.datasource instanceof DataSourceWrapper) {
                DB.datasource = ((DataSourceWrapper) DB.datasource).getOriginal();
            }
        }
    }
    

    并在conf/play.plugins 中以适当的优先级注册:

    350: DataSourceReplacementPlugin
    

    【讨论】:

    • 我是这么想的,但是因为静态的DB.datasource,我犹豫了。这不会杀死并发吗?
    • 阿塞姆拉德威:你什么意思?连接是从每个请求的数据源获取的,据我了解,您需要在每个请求中为不同用户获取连接,对吧?
    • 没错。我需要根据用户的 Oracle 凭据获得不同的连接。如果用户仍然登录到系统,连接可以存储在用户的会话中,如果他退出系统,连接将被销毁。
    • @AsemRadhwi:Play 通过为每个请求调用getConnection() 来获取新连接,因此上述解决方案应该是正确的(如果有效)。此外,Play 没有通常意义上的会话(由于其“无共享”架构),因此您无法在其中存储连接。连接的缓存由池化数据源执行。
    • 我会试一试,很快就会在这里回复您!感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多