Oracle ODP.NET链接池

数据库链接池

链接池是数据库链接的缓存,每当应用程序须要链接数据库时向链接池申请数据库链接,链接池负责具体数据库链接的建立和销毁。链接池中的数据库链接会缓存一段时间,后续的链接请求首先使用缓存中的数据库链接,若是缓存中有空闲的链接则直接使用,无空闲链接时就去新建立。这样能够提升因数据库链接建立而额外消耗的资源,从而提升总体性能。sql

.NET链接Oracle

.NET链接Oracle数据库的库主要有3种:数据库

  1. .NET自带的 .NET Framework Data Provider for Oracle
  2. Devart提供的dotConnect for Oracle
  3. Oracle提供的 Oracle Data Provider for .NET / ODP.NET

 

目前xAsset系统使用的是第3种,由Oracle提供的ODP.NET。ODP.NET提供了一套实现了ADO.NET相关接口的类,并提供了使用Oracle数据库一些高级功能的接口,好比RAC,XML DB,批量插入等。相对于.NET自带的库性能上也提升很多。缓存

ODP.NET如今是Oracle ODAC(Oracle Data Access Component)的一部分。使用前须要先安装ODAC组件,Oracle提供了xcopy的方式和可执行程序的方式供下载安装。具体安装方法见官方文档。服务器

ODP.NET的数据库链接字符串格式主要有如下几种:ide

  1. 使用TNS

该方式须要配置TNS,通常须要提供用户id和密码(集成认证方式能够省略用户id和密码)。具体的字符串格式以下:性能

Data Source=TORCL;User Id=myUsername;Password=myPassword;server

 

  1. 不依赖tnsnames.ora的ODP.NET方式

该方式不须要配置TNS,以把配置在TNS里的链接字符串直接放到Data Source节点中的方式实现。链接字符串中直接提供了服务器地址,端口,实例等信息,具体格式以下:接口

Data Source=(DESCRIPTION=(ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=MyHost) (PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));生命周期

User Id=myUsername;Password=myPassword;资源

 

  1. 使用EZ Connect的方式

使用EZ Connect方式也不须要进行特殊配置,但须要数据库服务中的sqlnet.ora启用该方式,添加NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)启用,具体链接字符串格式以下:

Data Source=username/password@myserver//instancename;

ODP.NET的链接池及相关功能

ODP.NET提供了链接池的功能。固然咱们能够选择使用或不使用,是否启用链接池功能由数据库链接字符串决定。链接参数提供了Pooling这个参数,若是值为true则启用链接池,不然不启用,不提供该参数时默认是启用链接池的。

数据库链接参数中除了上面提到的标准参数Data Source,User Id,Password外,与链接池相关的参数主要有几个:Connection Lifetime, Connection Timeout, Decr Pool Size, Incr Pool Size, Max Pool Size, Min Pool Size, Pooling, Validate Connection。

当启用链接池时,取得一个数据库链接的过程大体以下:

l  若是链接池不存在(好比应用程序刚启动第一次访问数据库),则ODP.NET建立链接池并按参数“Min Pool Size”设置的值(默认1)初始化数据库链接。这个值指定了链接池中的最小链接数量,不管如何链接池中至少有该值设定的数据库链接存在。直到链接池销毁。

l  若是链接池存在,则检查是否有可用链接。

u  若是有可用链接,链接就从池中取出返回给应用程序。

n  若是启用了“Validate Connection”,则链接池会去数据库服务器验证固然链接是否有效。

u  若是没有可用链接,链接池会检查当前池中的链接数是否已达到指定的上限“Max Pool Size”(默认100)。

n  若是已经达到最大上限,则请求会等待一段“Connection Timeout”(默认15秒)指定的时间,检查是否这段时间内有链接返回到池中。

  • 若是有链接返回到池中,则直接取该链接返回给请求的应用程序。
  • 若是指定时间内仍没有链接可用,则抛出“Connection request timed out”异常。

n  若是还没达到上限,则链接池会主动建立“Incr Pool Size”(默认5)指定的值的链接,并返回其中一个给请求的应用程序。

当应用程序从数据库取得数据并调用Close()/Dispose()时,链接池检查链接的生命同期是否超过了“Connection Lifetime”(默认0,不检查)。

若是链接的生命周期超过了定义的值,则该链接会被真正关闭。这个关闭,指应用程序所在链接池到数据库服务器的物理链接关闭。

链接只有返回到池中时才会作该检查,若是在使用中不会检查。

固然若是链接真正关闭后池中的链接数量会小于“Min Pool Size”指定的值时,链接也不会关闭。

链接池每隔3分钟会关闭池中没有使用的链接,每次关闭的数量由“Decr Pool Size”设定的值(默认1)指定。

相关文章
相关标签/搜索