|
rce dataSource),参数分别为指定的server、URL的配置信息,使用的Schema对象,这里为null,指定的datasource信息,这里为null。 每一个连接会被赋予一个全局唯一的ID,它是递增的,然后判断Provider配置,这个配置要么在URL中指定为mondrian要么不指定。接着分别提取"Catalog"、“JdbcUser”、"Jdbc"和"DataSource"配置的值,然后根据URL创建一个底层数据员的dataSource对象(DataSource是一个接口,实现了定义了getConnection函数,参数为用户名和密码),创建dataSource对象是根据URL中指定的Jdbc、JdbcUser和JdbcPassword配置完成的,另外这时还会获取URL中指定的JdbcDrivers配置加载这里指定的所有的driver(每一个driver使用,分割),接着再加载所有默认的drivers,包括"mondrian.jdbcDrivers", "sun.jdbc.odbc.JdbcOdbcDriver,org.hsqldb.jdbcDriver,oracle.jdbc.
OracleDriver,com.mysql.jdbc.Driver"(load之前会判断是否已经加载),接着再从URL中查找所有数据源jdbc连接的参数。这些参数是通过jdbc.xxx=yyy指定的,其中xxx为参数名,yyy为参数值。接着再根据URL中指定的"PoolNeeded"参数已决定是否创建一个datasource池,默认情况下是对于使用指定Jdbc创建的数据源会创建这个池子,而对于通过DataSource参数指定的数据源则不创建。这时候创建的DataSource对象分成了四种情况(当Jdbc和DataSource同时指定的时候使用Jdbc): 1、在mondrian连接的URL中指定了Jdbc并且没有指定PoolNeeded:这种情况下会RolapConnectionPool中根据jdbc的url和jdbc的配置信息从池子中获取DataSource对象(如果是mysql会加上autoReconnect=true),实际返回的是dbcp中提供的PoolingDataSource类型对象。 2、在mondrian连接的URL中指定了Jdbc同时指定PoolNeeded=false:这种情况下mondrian会认为你不需要进行缓存,因此会创建一个新的DataSource对象,类型为DriverManagerDataSource,每次getConnection的时候都是使用java提供的DriverManager老老实实地创建一个connection。 3、在mondrian连接的URL中指定了DataSource并没有指定PoolNeeded:这种情况下同样也会使用RolapConnectionPool创建一个缓存的DataSource对象。 4、在mondrian连接的URL中指定了DataSource并指定PoolNeeded=true:这种情况下会根据是否指定用户名和密码判断是否创建UserPasswordDataSource对象(这玩意其实是一个代理),如果都没指定则根据DataSource参数指定的类使用该类的默认构造函数创建一个dataSource对象。 上面不管是使用哪种方式创建DataSource都将会被保存在mondrian的connection内部成员,每次创建向数据源的连接时都是用getConnection获取。 创建完DataSource会将当前的mondrian的connection加入到server中,由一个map保存,其中key为connection分配的id,value为connection对象。 接着是根据schema参数是否为null以执行不同的操作,当前schema等于null,则会创建一个statement,并加入到Locus(这个东东在mondrian中经常用到,后面再详述)中,接着创建一个Schema对象,这个对象是这里的重点,解析并保存了xml文件中定义的所有cube的信息,等下再看,先看下创建完schema之后会解析URL中的"Role"参数,并处理当前connection的role,默认情况下使用schema的默认role(ALL)。 至此mondrian的connection就创建完成了,主要的操作就是创建DataSource对象和Schema对象,后者的创建全是通过RolapSchemaPool提高的get接口完成,在创建的时候会根据"UseSchemaPool"参数以决定是否使用schema池,默认为true,如果指定了false则创建一个新的Schema对象,否则需要根据"JdbcConnectionUuid"参数、jdbc连接的url信息、dataSource参数以及读取的catalog全部内容的md5值作为key从schemaPool中查找。除此之外,如果在URL中指定了"UseContentChecksum"参数,并根据该参数判断是否只根据catalog的全部内容的md5值作为key查找(也就是不必使用jdbc的url作为key的一部分了),当然无论使用哪种方式从池中获取schema,schema加入池子的时候都有一个过期时间,由"UseSchemaPool"参数指定,如果不指定则设为-1s(具体含义后面再讲)。 创建schema的过程是比较复杂的,主要是要加载的schema文件的全部内容并做一些初始化操作,本文不作讲述,除此之外在创建schema的时候还会创建一个mondrian连接(其实并没有什么用),这里递归的执行RolapConnection的构造函数(见上面),但是这时候schema已经不为null了,创建的时候会创建完DataSource之后创建一个connection,然后就返回了,并且schema中创建的这个InternalConnection并不会执行任何其他的操作,因此可以认为这一步创建connection只是为了测试数据源的连通性。此外Schema构造函数还会创建AggTableManager对象和DataSourceChangeListener对象。 创建完schema之后再从schema文件中(catalog内容)加载所有的cube以及相关信息,这一部相当复杂。在创建完mondrian连接之后还需要对olap4j连接进行一些额外的设置,以后用到的时候再讲。 最后对所有创建connection的URL中出现的参数进行一个总结,参数之间通过';'进行分割,如果在某一个参数的值中需要出现';'(例如jdbc的密码,hive的jdbc连接的url中)则需要将值通过引号括起来作为一个完整的值,所有的参数都保存在RolapConnectionProperties类中,包括: 1、Provider:在mondrian中它的值要么不指定要么指定为mondrian 2、Jdbc:指定数据源的jdbc的url信息。 3、JdbcDrivers:指定数据源的driver类,可以指定多个,通过','分割。 4、JdbcUser:连接数据源的用户名 5、J |