JDBC是标准的Java API,几乎所有需要访问数据库的J2EE应用程序都直接或间接地使用了它。在BEA WebLogic 8.1中,配置JDBC连接包括创建和配置两个主要的工件——JDBC连接池和数据源。与这两个主要工件相关的是其他次要的可配置工件,比如多池或数据源工厂。
连接池还是多池?
在深入讨论如何创建和配置连接池之前,我们需要简要地看一看需要使用连接池的原因。
如果您没有使用JDBC连接池访问数据库,那么为了建立到数据库的连接,您将需要进行以下步骤:
- 加载JDBC驱动程序类。
- 创建JDBC驱动程序的一个实例,并把它注册到驱动程序管理器中。
- 通过提供一个数据库URL和其他所需的参数,从驱动程序管理器中获得一个到数据库的连接。
- 完成之后关闭连接。
与这种一次一个连接的方法相比,连接池是数据库连接的一个现存集合,而且可以在多个活动的J2EE应用程序中回收这些数据库连接。连接池中的连接是开放的,可用于访问。应用程序使用一个连接之后,这个连接没有被销毁,而是被返回到连接池中,随后可以为其他应用程序所用。通过节省与频繁建立和断开数据库连接相关的计算资源,连接池提高了数据库访问的性能,尤其是在负载高峰期内。
多池是连接池的集合。多池的主要目的是提高可用性和在一组连接池间实现负载均衡。
为什么使用数据源?
一个数据源就是一个提供对连接池或多池访问的Java命名和目录接口(Java Naming and Directory Interface,JNDI)对象。连接池或多池对于配置数据源是必需的。可以使用事务属性来配置数据源。非事务性的数据源用于本地事务;而事务性的数据源用于分布式事务。
数据源封装了对数据库的访问,隐藏了访问连接池或多池所涉及的细节。另外,数据源使配置数据库连接的事务性特性变得容易。
JDBC Data Source Factory是一个JNDI对象,企业应用程序使用它从应用程序范围内的连接池中获得连接。
JDBC驱动程序设置
在WebLogic Server和 DBMS之间建立连接所需的JDBC驱动程序分为两种类型:Type 2和 Type 4。 Type 2 JDBC驱动程序需要本地库。使用Type 2 JDBC驱动程序时,需要把到WebLogic共享库(或动态链接库)目录的路径<WEBLOGIC>/server/bin/oci817_8和到Oracle客户端库目录的路径<ORACLE>/bin添加到系统变量< PATH >的开头部分。
WebLogic 8.1 Server安装在< WEBLOGIC >目录中。Oracle 8.1.7数据库安装在< ORACLE >目录中。< PATH >是WebLogic Server Path变量。
对于Type 2和 Type 4驱动程序来说,在WebLogic Server CLASSPATH中,需要相关的JDBC驱动程序类来配置连接池或数据源。把包含Oracle Type 2 JDBC驱动程序类的<ORACLE>/JDBC/lib/classes12.zip文件添加给<domain>/startWebLogic脚本文件中的<CLASSPATH>变量。
- <CLASSPATH>:WebLogic Server Classpath变量。
- <domain>:WebLogic Server Domain目录。
配置JDBC连接池
现在,我们将考虑如何创建连接池和配置与其相关的各种参数。
要创建一个JDBC连接池,在Administration Console中右击JDBC>Connection Pools节点,然后选择Configure a new JDBC Connection Pool。
这将显示一个Configure a JDBC Connection Pool画面。为Oracle数据库选择Database Type – Oracle。选择一个Database Driver,然后点击Continue按钮(参见图1)。
图1
随后显示Define Connection Properties画面。在这个画面中,指定一个Database Name、一个Database User Name和一个Password。点击Continue按钮。
随后显示Test DataBase Connection。在这个画面中,指定Driver Classname、URL和Properties字段的值。Driver Classname就是用于获得数据库连接的驱动程序类名。URL是用于获得连接的数据库URL。Properties是用于创建连接的属性列表。
表1中指定了用于不同Oracle JDBC驱动程序的Driver Classname和URL设置。
表1 驱动程序类名和URL设置
在URL设置中,< host >是在<ORACLE>/network/ADMIN/tnsnames.ora文件中指定的HOST值,<port>是在tnsnames.ora文件中指定的PORT值,而<database>是数据库实例名称。
在Properties文本框中的设置是:
user=<user>
server=<database>
<user>是指定登录到Oracle数据库中的用户名。<database>是Oracle数据库实例名称。如果使用了Oracle瘦(Type 4)驱动程序,就不应该指定服务器属性。
点击Test Driver Configuration按钮,以测试JDBC Connection Pool。如果驱动程序配置测试成功,会显示一条“Connection successful”消息。如果驱动程序配置有错误,则会显示一条错误消息。
随后会显示Create and Deploy画面。在这个画面中,选择一台服务器部署连接池,然后点击Create and Deploy按钮来创建和部署一个JDBC连接池。这将在被选中的服务器上创建和部署一个连接池。也可以把它部署在多台服务器上。Administration Console中的JDBC>Connection Pools节点将会增加一个<JDBCConnection Pool>节点。<JDBCConnection Pool>是连接池的名称。
要修改JDBC Connection Pool配置,点击JDBC>Connection Pools><JDBCConnection Pool>节点,然后选择Configuration选项卡。要修改目标服务器,选择Target and Deploy选项卡。选择一台目标服务器,然后点击Apply按钮。选择Connections选项卡以配置JDBC Connections属性。
连接属性
- Initial Capacity:创建连接池时所创建的数据库连接的数目。
- Maximum Capacity: 连接池中连接的最大数目。
- Capacity Increment: 连接池容量在最大容量限制范围内的增量。
- LoginDelay: 在创建每个物理数据库连接之前要延迟的秒数。
- Allow Shrinking: 将该项设置为true时,如果没有使用额外的连接,则允许连接池把容量减小到InitialCapacity。
- Shrink Frequency: 在减小连接池容量之前要等待的秒数。如果将Shrink Frequency设置为true,那么也必须将Allow Shrinking设置为true。
- Test Frequency: 数据库连接测试之间间隔的秒数。在每个Refresh Period时间间隔之后,如果设置了TestTableName,就会使用TestTableName测试未使用的数据库连接。
- Test Reserved Connections: 如果选择了这个选项,服务器会在把连接提供给客户端之前对其进行测试。
- Test Created Connections: 如果选择了这个选项,就会在创建一个JDBC连接之后和在把它添加到JDBC连接池中的可用连接列表之前,对该JDBC连接进行测试。
- Test Released Connections: 如果选择了这个选项,服务器就会在把连接返回给连接池之前对其进行测试。
- Test Table Name: 用于JDBC连接测试的数据库表名。如果指定了Test Frequency,并且选择了Test Reserved Connections、Test Created Connections或Test Released Connections,则Table Name是必需的。
在配置Connections画面之后,选择Apply按钮。
配置JDBC多池
一个多池就是连接池的一个集合。在创建多池之前为多池配置连接池。要创建和配置一个新的多池,右击Administration Console中的JDBC>Multi Pools节点,然后选择Configure a New Multi Pool。
随后会显示Configuration画面。在Multi Pool Configuration画面中,指定Algorithm Type并选择Create按钮。如果将Algorithm Type设置为“High availability”,那么在使用另一个池中的连接之前,一个池中的所有可用连接应已经用完。如果将Algorithm Type设置为“Load balancing”,多池会将连接请求平均地分布给多池中的所有连接池(参见图2)。
图2
选择Pools选项卡,然后在Pools画面中选择要添加到多池中的连接池。点击Apply按钮。被选中的连接池将被添加到多池中。连接中使用的连接池是基于Algorithm Type进行选择的。
选择Target and Deploy选项卡,然后在Target and Deploy画面中选择一台目标服务器。点击Apply按钮。可以把一个多池部署在多台服务器上。Administration Console中的JDBC>Multi Pools节点将会增加一个<Multi Pool>节点。<Multi Pool>是多池的名称。
配置JDBC数据源
数据源是用于访问连接池或多池的JNDI对象。连接池或多池对于创建数据源是必需的。连接池对于创建事务性的数据源是必需的。应在创建数据源之前创建连接池或多池。
要创建和配置数据源,在Administration Console中右击JDBC>Data Sources节点,然后选择Configure a new JDBCTxData Source。
随后会显示Configuration画面。在Data Source Configuration画面中指定字段的设置。JNDI Name是数据源的JNDI路径。
选择Honor Global Transactions,以创建一个事务性的(Tx)数据源。如果没有选中Honor Global Transactions,那么所创建的数据源就是非Tx数据源(参见图3)。
图3
随后会显示Connect to Connection Pool画面。在Pool Name字段中,从可用连接池的列表中选择一个JDBC连接池,然后点击Continue按钮。数据源与被选中的连接池相连接。
随后会显示Target the Data Source画面。在这个画面中,选择一台目标服务器,然后点击Continue按钮。这将在被选中的服务器上部署数据源,但是也可以在多台服务器上部署它。Administration Console中的JDBC>Data Sources节点将增加一个<JDBCData Source>节点。<JDBCData Source>是数据源的名称。要修改数据源配置,点击管理控制台中的JDBC>Data Sources><JDBCData Source>节点,选择Configuration选项卡。为了可以在一次服务器访问中把每个Result Set的多个行从服务器取到外部客户端,选择Row Prefetch Enabled并指定Row Prefetch Size。要为非XA的JDBC驱动程序启用全局事务,为非XA的驱动程序选择Emulate Two-Phase Commit,并选择Honor Global Transactions。要修改数据源的目标服务器,选择Target and Deploy选项卡。选择一台目标服务器,然后点击Apply按钮。
数据源和Tx数据源之比较
如果在数据源配置中选择了Honor Global Transactions,数据源就是Tx数据源。数据源是和连接池或多池一起使用的。Tx数据源和连接池一起使用。数据源用于本地事务。Tx数据源用于分布式事务。
在下列情况下,应该使用Tx数据源而不是数据源:
- 使用容器托管的持久性实体bean。
- 在事务期间访问多项资源。
- 在一个事务中进行多个数据库更新。
- 在多台服务器上使用同一个连接池。
配置JDBC数据源工厂
JDBC数据源工厂是一项JNDI数据源资源。企业应用程序使用数据源工厂从应用程序范围内的连接池中获得连接。
要创建和配置一个JDBC数据源工厂,在Administration Console中右击JDBC>Data Source Factories节点,然后选择Configure a new JDBCDataSourceFactory。
随后会显示Configuration画面。在这个画面中,指定URL、Driver Class Name、 Factory Name和Properties字段的值,然后点击Create按钮(参见图4)。
图4
Administration Console中的JDBC>Data Source Factories节点将增加一个<JDBCData Source Factory>节点。<JDBCData Source Factory>是数据源工厂的名称。要使用<JDBCData Source Factory>,需要重新启动服务器。
JDBC配置和服务器性能
下面列出了BEA针对 WebLogic Server的各种JDBC配置设置给出的建议。
为了提高生产模式下服务器的性能:
- 在JDBC连接池配置中,把InitialCapacity的值设置为等于 MaxCapacity。如果InitialCapacity的值小于MaxCapacity,那么当负载增加时,服务器就会创建额外的数据库连接。在负载增加的情况下,必须分配资源以创建额外的数据库连接,同时资源对于完成jdbc客户端请求也是必需的。
- 把MaxCapacity的值设置为等于需要JDBC连接的并发客户端会话的数量:为了确定一个连接池中的并发客户端会话,选择该连接池节点。选择Monitoring选项卡。Active Connections栏中的值是并发客户端会话的平均数目。Connections High的值是并发客户端会话的最大数量。在部署应用程序和监视活动连接之后,可以修改MaxCapacity的值。
- 当外部客户端通过WebLogic Server使用JDBC访问数据库时,在数据源配置中选择Row Prefetch Enabled:通过在一次服务器访问中取多个行,行预取可以提高性能。
结束语
按照上面概述过程,WebLogic开发人员应该能够针对Oracle 8.1数据库配置BEA WebLogic 8.1 Server了。配置其他数据库类似于配置Oracle 8.1。把包含相应数据库的驱动程序类的zip/jar文件添加给CLASSPATH变量,然后在JDBC连接池配置中指定相应的连接URL和驱动程序类名。
参考资料
- Programming WebLogic JDBC: http://e-docs.bea.com/wls/docs81/jdbc/
关于作者
Ajay Vohra 是Compuware公司的资深软件工程师。 (更多)
我的个人补充:
注意在使用weblogic进行conection pool的配置时,不要修改propoties的最终选项生成的配置。
虽然有时修改后,看起来能连上,实际是没有连上。因为它只是按生成的配置生成相关的连接。
在配置成功之后,如果没有任何配置,在用weblogic测试时,会出如下错误:(但是你的连接池还是可以用的)
Warning! Connectivity to backend database not verified. This is either because required connection pool attributes "TestConnectionsOnReserve" or "TestConnectionsOnRelease" have not been enabled, or an invalid value has been specified for attribute "TestTableName". Please check the server log for more details.
为了使测试成功的办法:
将连接池Configuration里的Connections的高级选项Advanced Options
中的测试选项选中Test Reserved Connections、Test Created Connections、Test Released Connections这样就应该可以了,三个选项可以不用都选但Test Reserved Connections和Test Released Connections必须选中一项,否则测试就会出现你所说的问题。如果你要指定Test Frequency并将Test Reserved Connections、Test Created Connections、Test Released Connections这三项都启用,必须为Test Table Name指定一个值。
这样你会得到一个测试结果。