设为首页 加入收藏

TOP

Mondiran创建连接(二)
2015-11-21 01:52:45 来源: 作者: 【 】 浏览:6
Tags:Mondiran 创建 连接
ow reason; } println("getConnection: no suitable driver found for "+ url); throw new SQLException("No suitable driver found for "+ url, "08001"); }
整了这么多其实就是那个for语句执行真正的创建连接,前面只是设置classloader,因为在调用getConnection之前我们使用Class.forName函数只给了一个driver的类名,这里势必要使用反射创建一个对象,但是在这个for循环中遍历了registeredDrivers对象,这是DriverManager类的一个static的List对象,但是我们在调用getConnection之前并没有对DriverManager类做任何操作,这个对象是什么时候放入数据的呢,这时候就要看一下在执行getConnection之前的Class.forName方法了,这个方法其实就是使用当前的classLoader将指定的类加载进来,加载类的时候会初始化这个类(部署初始化任何对象),包括初始化一些static代码区,果然,在mondrian.olap4j.MondrianOlap4jDriver类中有这样一段static代码区:
    static {
        try {
            register();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

这里register方法执行了这样一个语句:DriverManager.registerDriver(new MondrianOlap4jDriver());哈哈,正是在这里将这个driver注册到DriverManager的,在registerDriver函数中,DriverManager将注册的driver对象加入到registeredDrivers对象中的,这样也就解开了之前的疑惑,一直在疑惑这一句forName有什么作用。我想其它的driver类(包括mysql、oracle等)都应该使用这种方式吧。 接续看getConnection方法,它遍历registeredDrivers列表中的每一个成员,然后尝试用每一个driver创建connection,直到遇到第一个能够创建成功的driver,如果都创建失败,reason中的错误信息是第一个driver创建connection的失败信息,真正创建connection的方法是Connection con = aDriver.driver.connect(url, info);,其中info是包含了user和password信息的properties,接下来就再次回到MondrianOlap4jDriver类中执行创建连接了,从这里可以看出DriverManager其实就是一个工厂,需要创建connection的时候向它注册一个driver,创建对象的时候使用每一个具体的driver完成。MondrianOlap4jDriver类中创建connection的方法如下:
    public Connection connect(String url, Properties info) throws SQLException {
        if (!MondrianOlap4jConnection.acceptsURL(url)) {
            return null;
        }
        return factory.newConnection(this, url, info);
    }

这里的factory是一个driver的一个成员变量,它是在driver初始化的时候创建的,在mondrian中它是根据不同的jdbc版本使用不同的factory,具体的策略是不同的版本的jdbc中包含不同的class,然后通过Class.forName判断该class是否存在已决定当前的版本(这个策略可以省去一些版本配置的信息),当前使用的factory是"mondrian.olap4j.FactoryJdbc41Impl",这个函数会创建并返回一个MondrianOlap4jConnectionJdbc41对象,这个对象实际创建的是他的父类对象MondrianOlap4jConnection,它的构造函数如下: MondrianOlap4jConnection( Factory factory, MondrianOlap4jDriver driver,String url,Properties info) throws SQLException 参数分别是上面提到的factory对象,driver对象。连接url和DriverManager传递过来的配置信息。我觉得这个对象其实就是为了实现olap4j接口在olap4j接口和mondrian真正的connection之间做的一层转换,创建connection主要是创建一个mondrian原生的connection,然后保存和这个connection相关的server、schema等信息,创建connection的语句如下:
        this.mondrianConnection = (RolapConnection) mondrian.olap.DriverManager .getConnection(list, null);

创建mondrian连接的是通过mondrian的DriverManager实现的,其中list为解析之后的url中的key-value对和info中的配置信息,第二个参数是CatalogLocator对象,这里为null,实际上并没有什么卵用。 创建mondrian连接的第一步就是创建指定的server,在mondrian中server是用来维护和管理connection的,每次连接创建的时候会根据URL中指定的"Instance"配置决定使用哪个server(为什么做成多个server后期再研究),如果没有指定这个配置则使用默认的server。在mondrian中所有的server是由MondrianServerRegistry这个全局对象维护的,但是在根据Instance查找server的时候如果找不到则会抛出异常,而不会创建新的server,通过跟踪调用逻辑发现只有在使用XMLA服务的时候才会创建server,这里暂不讨论,假设所有的URL中都不包含Instance配置。创建server的入口为MondrianServerRegistry.createWithRepository,它需要两个参数,分别为RepositoryContentFinder对象和CatalogLocator对象,默认的server也都是用默认的这两个对象,其中CatalogLocator对象用来处理URL中指定的Catalog信息,默认不做任何处理。 接着创建一个RolapConnection对象,这个对象就是mondrian内部的连接,它的构造函数为:RolapConnection(MondrianServer server,Util.PropertyList connectInfo,RolapSchema schema,DataSou
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MongoDB安装和简介 下一篇操作ACCESS数据库总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: