要素服务之FDO连接池

要素服务基于FDO技术,通过FDO访问各种类型的要素源,这就意味着在访问要素源中的数据之前必须创建一个到要素源的FDO连接,但是MapGuide应用程序一般都是B/S架构的,用户通过浏览器访问要素源的数据,如果由客户端来维护FDO连接,会造成如下的问题:

l  每个FDO连接会占用一定的资源,在大量用户访问MapGuide服务器时,即使一个客户端只打开了一个FDO连接,也会造成大量FDO连接被打开,从而导致MapGuide服务器占用大量的资源。而且,许多要素源有最大连接数的限制,在大量并发用户访问的情况下,FDO连接数非常容易超出要素源有最大连接数的限制,最终导致要素源拒绝访问。

l  浏览器端必须在不需要FDO连接的时候记得关闭FDO连接,如果客户端忘记关闭FDO连接,就会导致此FDO连接所占用的资源无法被释放。

所以,要素服务使用了连接池技术,它的核心思想是连接复用,通过建立一个FDO连接池以及一套连接使用、分配、治理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了要素源连接频繁建立、关闭的开销。另外,由于对FDO连接进行了封装,客户端无法显式地打开或关闭一个FDO连接,所以MapGuide应用程序无需关心FDO连接,提高了开发效。

连接池主要由三部分组成:连接池的建立、连接池中连接的使用治理、连接池的关闭。下面就着重讨论这三部分及连接池的配置问题。

1)  连接池的建立

MapGuide服务器启动的时候,会为每个注册的FDO Provider创建一个连接池。在初始状态下,连接池中并不包含任何FDO连接,它是按需创建FDO连接的。

2)  连接池的治理

连接池治理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行治理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。

由于大部分FDO Provider不是线程安全的,不同的线程同时使用相同的FDO连接实例会造成一定的问题,所以连接池中的连接不能同时被不同的客户请求所共享。

当客户请求需要用到FDO连接时,首先查看连接池中是否有空闲连接(即标记为空闲的连接)。如果存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用)。如果没有空闲连接,则查看正在使用的连接数是不是已经达到最大连接数,如果没达到最大连接数就重新创建一个连接给客户请求,并将其放入连接池中;如果达到最大连接数就每隔100毫秒进行一次检测,查看是否有空间的联接,如果检测次数超过600次仍没有空闲连接,就抛出一个异常给用户。在新建连接时,如果连接池中连接数小于最大连接数,直接将其放入连接池中,否则删除掉连接池中最后被使用的空闲的连接,然后将新建的连接加入连接池。

当将客户请求的结果返回给客户之后,将此请求用到的FDO连接标记为空闲。当某个FDO连接的空闲时间(即当前时间和连接最后使用时间的时间差)超过设定的值时,会关闭此连接,然后将其从连接池中删除。

3)  连接池的关闭

MapGuide关闭服务器的时候,会关闭连接池中的所有FDO连接,然后销毁连接池。

4)  连接池的配置

通过修改MapGuide服务器配置文件serverconfig.ini可以配置是否启用FDO连接池、为那些FDO Provider使用连接池、连接池的最大连接数、每一种FDO Provider的最大连接数、FDO连接超时时间、超时检测时间间隔,这些参数的具体含义请参考1016,如下的参数值开启了数据连接池,为除SDFSHP以外的要素源创建FDO连接池,其中Oracle要素源连接池的大小为100,其它类型要素源连接池的大小为50FDO连接超时时间为20个小时(28800秒),超时检测时间间隔为1小时(28800秒)。

[FeatureServiceProperties]

DataConnectionPoolEnabled          = 1

DataConnectionPoolExcludedProviders  = OSGeo.SDF,OSGeo.SHP

DataConnectionPoolSize             = 50

DataConnectionPoolSizeCustom       = Autodesk.Oracle:100

DataConnectionTimeout              = 28800

DataConnectionTimerInterval         = 3600

连接池中的最大连接数是多少才能使系统的性能更佳,这取决于并发用户数、计算机配置、数据库服务器、网络带宽等信息,所以需要通过反复试验来确定合适的值。

虽然使用FDO连接池改善了MapGuide服务器的性能,但是也带来一些负面影响,最主要的问题是客户端无法控制要素服务对不同的时刻要素服务请求使用相同的FDO连接,例如在下面的代码中,执行SQL语句“SAVEPOINT X”、“SAVEPOINT Y”、“ROLLBACK TO X”、“ROLLBACK TO Y”和“COMMIT”所用的的FDO连接可能完全是不同的FDO连接,这样在执行“ROLLBACK TO X”、“ROLLBACK TO Y”和“COMMIT”就会导致错误。所以,要避免依赖相同的FDO连接的要素服务调用,否则会导致不可预知的错误,这个问题将会在MapGuide开源版2.2中解决。

featureService.ExecuteSqlNonQuery(featureSourceId, "SAVEPOINT X");

try

{

    featureService.ExecuteSqlNonQuery(featureSourceId, "SAVEPOINT Y");

    try

    {

        featureService.ExecuteSqlNonQuery(featureSourceId,

"INSERT INTO TEST (FID) VALUES (1)");

    }

    catch (System.Exception)

    {

        featureService.ExecuteSqlQuery(featureSourceId, "ROLLBACK TO Y");

    }

    featureService.ExecuteSqlNonQuery(featureSourceId,

"INSERT INTO TEST(FID) VALUES(2)");

}

catch (System.Exception)

{

    featureService.ExecuteSqlNonQuery(featureSourceId, "ROLLBACK TO X");

}

featureService.ExecuteSqlNonQuery(featureSourceId, "COMMIT");

 

属性名称

描述

DataConnectionPoolEnabled

用于指定是否启用FDO连接池,它的值可以为101代表启用,0代表禁用。

DataConnectionPoolExcludedProviders

用于指定哪些类型FDO Provider的连接不可以放置在连接池中Provider之间使用逗号分隔开来,例如“OSGeo.SDF,OSGeo.SHP”。

DataConnectionPoolSize

用于指定所有类型的FDO Provider连接池中默认的最大连接数,它可以为大于1小于等于1024的任何整数。

DataConnectionPoolSizeCustom

用于指定某种类型的FDO Provider连接池中的最大连接数,此属性值会覆盖DataConnectionPoolSize的值,例如“OSGeo.SDF:10,OSGeo.SHP:15”指定OSGeo.SDFOSGeo.SHP FDO Provider在连接池中的最大连接数分别为1015

DataConnectionTimeout

用于指定单位为秒的FDO连接超时时间

DataConnectionTimerInterval

用于指定单位为秒的超时检测时间间隔,即每隔指定的时间,MapGuide服务器会检测连接池中是否有超时的FDO连接,如果有的话会将它们从连接池中删除

JoinQueryBatchSize

用于指定创建联接(Join)的结果集时,每次处理多少个主要素类中的记录,它可以为大于1小于等于10000的任何整数。

1016 要素服务的配置信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值