4.6. 管理数据库连接池

消息应用中如果牵涉到数据库的应用,例如消息的存储采用数据库方式时,需要预先配置好对应的数据库连接池配置。

对于所有的信息对于一个未使用数据库连接池技术,应用程序直接管理数据库连接的企业应用中,对数据库的物理连接和客户端的连接对象是一对一的。当连结对象关闭,物理连接也被相应关闭,因此,打开、初始化和关闭数据库的物理连接等等操作,充斥在每个运行中的客户端会话中。

管理与配置

AMQ 通过在配置文件中定义的数据源(Data Source)生成数据库连接池,每个被定义的数据源指向一个数据库连接池,根据数据源定义中对初始连接数、最小连接数等属性的指定, AMQ 对连接池进行初始化。AMQ 默认时没有配置数据库连接池服务,要使配置的数据库连接池生效,必须在 AMQ 服务器中加上数据库连接池服务。

编辑 APUSIC_MQ_HOME/config/mq.conf 文件,在其中加上以下配置段来添加数据库连接池服务。注意,为了使服务器中依赖于该服务的其它服务能够正常启动,该配置段必须添加在 SecurityService 配置段之后。

...
<SERVICE
    CLASS="com.apusic.jdbc.JDBCService"
    >
    <ATTRIBUTE NAME="EnableLog" VALUE="False"/>
    <ATTRIBUTE NAME="LogFileName" VALUE="logs/jdbc.log"/>
    <ATTRIBUTE NAME="LogFileLimit" VALUE="1000000"/>
    <ATTRIBUTE NAME="LogFileCount" VALUE="10"/>
</SERVICE>
...

可以使用以下方式对数据库连接池进行配置:

编辑datasources.xml文件。

在 AMQ 的安装 目录中,config子目录下的datasources.xml文件是定义数据库连接池的配置文件。datasources.xml按照文档类型定义文件(DTD)datasources.dtd进行编写。

datasource元素

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

datasource元素的属性如下表:

属性描述值类型缺省值
name用以区别于其他datasource元素的属性,此属性是必须定义的。符合xml规范中命名规则的名字
jndi-name通过命名服务可访问到此数据源的JNDI名字,此属性是必须定义的。字符串
driver-class用于连接特定数据库的驱动程序类名称(一般由数据库厂商提供),此属性是必须定义的。字符串
driver-classpathdriver-class属性中指定的驱动程序类所处的路径信息。如驱动程序类路径信息不在当前的环境变量“classpath”中,或驱动程序不在 AMQ 目录下的\lib中,则通过此属性来指定其路径信息,可以使用绝对路径如:c:\driver_dir\my_jdbc_driver.jar或usr/driver_dir/my_jdbc_driver.jar来指定,亦可使用相对于Apusic安装目录的相对路径如:driver_dir\my_jdbc_driver.jar来指定;反之,可以不指定此属性。字符串
url符合JDBC规范中URL语法的字符串,用于描述数据库的位置信息和通讯子协议,如: jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;此属性是必须定义的。字符串
min-spare-connections连接池保持的最小备用物理连接数。当连接池中的备用物理连接被分配给客户请求后,连接池中的备用物理连接的实际数量小于此数时, AMQ 将建立新的物理连接到连接池中备用。整型5
max-spare-connections连接池保持的最大备用物理连接数。当应用程序完成对连接的操作,应用程序所使用的物理连接被返回到连接池中作为备用连接,当连接池中的实际备用物理连接的实际数量大于此数时, AMQ 将关闭此物理连接。整型30
idle-timeout物理连接等待超时时间。当连接池中的某个数据库物理连接等待被使用的实际时间超过此属性数值时,连接池自动关闭此数据库物理连接。整型,单位是秒300
test-before-reused设置为true允许连接失效检测,false为不允许连接失效检测。字符串FALSE
test-command用于连接失效检测的SQL语句,通常是一个有效的SELECT语句。字符串

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

属性名属性描述值类型
databaseName服务器上的特定数据库名称。字符串
datasourceName数据源名称;用于命名底层的XADataSource对象或ConnectionPoolDataSource对象。字符串
description数据源的描述。字符串
networkProtocol用于与数据库服务器交互的网络协议名称。字符串
password数据库密码。字符串
portNumber数据库服务器监听请求的端口号。字符串
roleName初始的SQL角色名。字符串
serverName数据库服务器名称。字符串
user用户账号名字。字符串

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

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

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