33.2. 数据库连接池管理与配置

应用服务器通过在配置文件中定义的数据源(Data Source)生成数据库连接池,每个被定义的数据源指向一个数据库连接池,根据数据源定义中对初始连接数、最小连接数等属性的指定,应用服务器在JDBC服务启动时对连接池进行初始化。

可以通过编辑datasources.xml文件对数据库连接池进行配置:

33.2.1. 编辑datasources.xml文件

Apusic应用服务器域主目录中,config子目录下的datasources.xml文件是定义数据库连接池的配置文件。datasources.xml按照文档类型定义文件(DTD)datasources.dtd进行编写。

33.2.1.1. datasource元素

datasources.xml由根元素datasources及其下属的一个或多个datasource元素构成,每个datasource元素对应一个数据源配置。Apusic应用服务器启动时,读取在datasources.xml中定义的datasource元素的设置,对相应的数据库连接池进行初始化。

datasource元素的属性如下表:

属性 描述 值类型 缺省值
name用以区别于其他datasource元素的属性,此属性是必须定义的符合xml规范中命名规则的名字
jndi-name通过命名服务可访问到此数据源的JNDI名字,此属性是必须定义的字符串
driver-class用于连接特定数据库的驱动程序类名称(一般由数据库厂商提供),此属性是必须定义的字符串
driver-classpathdriver-class属性中指定的驱动程序类所处的路径信息。如驱动程序类路径信息不在当前的环境变量“classpath”中,或驱动程序不在应用服务器目录下的\lib中,则通过此属性来指定其路径信息,可以使用绝对路径如:
c:\driver_dir\my_jdbc_driver.jar
/usr/driver_dir/my_jdbc_driver.jar
来指定,亦可使用系统变量指定路径如:
${DOMAIN_HOME}/driver_dir/my_jdbc_driver.jar
来指定;反之,可以不指定此属性。
字符串
url符合JDBC规范中URL语法的字符串,用于描述数据库的位置信息和通讯子协议,如:
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs
此属性是必须定义的
字符串
min-spare-connections连接池保持的最小备用物理连接数。当连接池中某个空闲物理连接的等待时间超过超时时间(idle-timeout),并且当前空闲连接数大于此值时,连接池会关闭此物理连接。整型5
max-spare-connections连接池保持的最大备用物理连接数。当应用程序完成对连接的操作,如果连接池中的空闲物理连接数量小于此数时,应用程序所使用的物理连接将被放到连接池中作为备用连接,反之,应用服务器将关闭此物理连接。整型30
initial-connections连接池在服务器启动时所创建的物理连接数。整型
max-connections连接池容量,即允许创建的最大连接数。连接池在连接数超出此值,并在最大等待时间内未得到被释放的数据库连接时,抛出资源不可用异常。整型-1。当该值小于或等于0时,系统默认设置为整数最大值
min-wait-time最小等待时间。当没有空闲连接可用,并且连接池的连接数量超过最大空闲连接数,但小于连接池容量时,等待空闲连接的时间,若超过此时间未得到空闲连接,则创建一个新连接。整型,单位是秒2
max-wait-time最大等待时间。当没有空闲连接可用,并且连接池的连接数量超过连接池容量时,等待空闲连接的时间,若超过此时间未能得到空闲连接,抛出资源不可用异常,客户端获取数据库连接失败。整型,单位是秒60
idle-timeout物理连接等待超时时间。当连接池中的某个数据库物理连接等待被使用的实际时间超过此属性数值时,连接池自动关闭此数据库物理连接。整型,单位是秒300
test-before-reused设置为true允许连接失效检测,false为不允许连接失效检测。字符串false
test-command用于连接失效检测的SQL语句,通常是一个有效的SELECT语句。字符串
isSameRM-override-value用于判断两个XAResource后端的Resource Manager是否是同一个时直接采用提供的属性值。默认为“无”,表示既不是true也不是false,则在判断时采用数据库XAResource自己的判断得出结果。两个XAResource是否isSameRM决定了这两个XAResource是否以两个分支加入事务。如果isSameRM为true,则两个XAResource实际上以同一个事务分支加入事务;如果isSameRM为false,则两个XAResource分别以不同的事务分支加入事务。该参数一般在数据源为Unshareable时使用,设为false可解决某些数据库在XAResource.start()方法中存在的资源无法关联到事务的问题。字符串

33.2.1.2. property

对于datasources.xml中定义的一个数据源元素,对应于一个JDBC规范中定义的DataSource的对象,JDBC规范中还定义了一套标识和描述此DataSource对象的属性。JDBC规范标准属性如下表:

属性名 属性描述 值类型
databaseName服务器上的特定数据库名称字符串
datasourceName数据源名称;用于命名底层的XADataSource对象或ConnectionPoolDataSource对象字符串
description数据源的描述字符串
networkProtocol用于与数据库服务器交互的网络协议名称字符串
password数据库密码字符串
portNumber数据库服务器监听请求的端口号字符串
roleName初始的SQL角色名字符串
serverName数据库服务器名称字符串
user用户账号名字字符串
isolation-level用于指定数据库连接的事务隔离级别,如果不配置此属性,则采用数据库默认的事务隔离级别,可设置值为read-uncommitted,read-committed,repeatable-read,serializable。字符串

这些属性值是否有效取决于JDBC驱动程序提供者的实现,JDBC规范中仅仅指定了提供者必须提供description属性。

对于上述属性,可以在datasources.xml文件中使用datasource元素的零个或多个子property元素来进行设置。

一个property元素必须包含两个属性,name属性用于说明需要设置的属性值的名称,value属性用于需要设置的值。如缺省的datasources.xml文件中使用property子元素指定了一个数据源所使用的数据库账号的名字和密码:

 <datasource name="SampleDB"
        jndi-name="jdbc/sample" driver-class="sun.jdbc.odbc.JdbcOdbcDriver"
        url="jdbc:odbc:apusic" > <property name="user"
        value="scott"/> <property name="password" value="tiger"/>
        </datasource> 

33.2.1.3. remote-acl

Apusic应用服务器中,应用程序可以远程访问数据库连接池,对于需要被远程客户访问的数据源,必须在对应的datasource元素中申明remote-acl元素,指定远程客户访问此数据源时必须具有的系统用户或组的名字列表,同时,在远程客户指定使用正确的用户身份信息:用户名,密码。

这样,当远程客户请求访问此数据源时,如远程客户请求中指定的用户名或密码可通过服务器的身份鉴定,则服务器根据数据源中指定的用户或组的名字,对远程客户请求进行授权。如远程客户请求中指定的用户名是remote-acl中指定的用户或属于remote-acl中指定的组,则授权远程客户进行访问。

下例定义了一个可被远程访问的数据源SampleDB,此数据源只授权给名为foo的用户或属于bar组的远程访问请求:

 <datasource name="SampleDB" ... > <property
        .../> ... <remote-acl> <user>foo</user>
        <group>bar</group> </remote-acl>
        </datasource>

33.2.1.4. 结果集缓存

对于Session Bean、JSP、Servlets为主的JavaEE应用中,频繁访问数据库而缺少对应的数据缓存等机制,往往会成为企业应用的瓶颈。因此,Apusic应用服务器提供了JDBC结果集缓存技术,通过将数据库返回的结果集保存在内存中可以大幅提高应用系统的性能,同时,使用结果集缓存对应用开发者是完全透明的,保证了应用的可移植特性。

 <datasource name="SampleDB" ... > <property
        .../> ... <property name="pre-fetch-size" value="100"/>
        </datasource>

33.2.1.5. 语句缓存

Apusic应用服务器提供了JDBC语句缓存技术,同时使用预编译的查询语句,提高应用程序访问数据库的效率。

当应用程序通过使用定义了语句缓存的数据源访问数据库时,即可使用语句缓存中的预编译的查询语句对数据进行查询。

结果集缓存包含一个属性,即缓存的语句数量,此属性无缺省值。

下例中对SampleDB数据源定义了一个语句数量为20的语句缓存:

 <datasource name="SampleDB" ... > <property
        .../> ... <property name="stmt-cache-size" value="20"/>
        </datasource>

33.2.1.6. 连接失效检测

test-before-reused:设置为true允许连接失效检测,false为不允许连接失效检测。

test-command:用于连接失效检测的SQL语句,通常是一个有效的SELECT语句。当所用的数据库为Oracle时,不需要配置此参数,只需将test-before-reused设置为true,这时应用服务器会通过连接的createStatement判断所用的连接是否失效。当所用的数据库为SQL Server或Sybase时,必须在将test-before-reused设置为true的同时配置此参数,因为这两个数据库对Statement做了客户端缓冲,无法通过连接的createStatement判断所用的连接是否失效,这时需要执行一条具体的SQL语句来判断连接是否可用。