如果你要使用本文中所给出的相关示例来访问 Oracle 数据库,那么你的开发计算机上就需要安装下面的软件组件(请参见“下载”portlet 以获得链接):即支持 JDK 1.6 的 Oracle JDBC 瘦驱动程序 。
Oracle 通用连接池库
Oracle JDBC 瘦驱动程序是一个 Type IV JDBC 驱动程序,这意味着它独立于平台,并且在与 Oracle 数据库交互的客户端上不需要任何额外的 Oracle 软件。因此,您可以从 JDBC 驱动程序下载页面下载包含相应瘦驱动程序版本类别的 JAR 文件,然后将该驱动程序安装在您的计算机上,无需安装/升级任何其他的 Oracle 软件。
要安装该驱动程序,您只需将其 JAR 文件复制到本地文件系统,然后将这些 JAR 的路径包括在 CLASSPATH 环境变量中。例如,您可能包括以下路径:
ORACLE_HOME/jdbc/lib/ojdbc6.jar ORACLE_HOME/jlib/orai18n.jar
如果您的计算机上已经安装了 Oracle 数据库,则瘦驱动程序也已经随 Oracle 数据库安装到您的计算机上。
但是,由于瘦驱动程序独立于任何其他 Oracle 软件,因此您可以通过使用相应的 JAR 文件(可以在 JDBC 驱动程序下载页面找到)轻松升级到该驱动程序的***版本。
UCP 是从 11.1.0.7 版开始引入 Oracle 数据库 11g 的一个新特性。该特性从 Oracle 应用服务器 11g 第 1 版开始就包含在 Oracle 应用服务器中。如果您使用的是未装载 UCP 的 JAR 文件(名为 ucp.jar)的旧版本软件,或者您希望升级到***的 UCP 版本,可以从 Oracle 数据库 UCP 下载页面获取 ucp.jar。
该程序包包含 UCP 的类,以便于将其包括在类路径中来启用该特性。所包括的路径可能如下所示:
ORACLE_HOME/ucp/lib/ucp.jar
使用 UCP 缓存 JDBC 连接
如果您要开发数据库密集型应用程序,可能会因使用连接池获益。因为这样您能够重用连接,而不是在每次请求连接时都重新创建一个新连接。连接池节约了创建新数据库连接所需的资源,并提高了应用程序的性能,因为创建新连接始终是一个性能密集型操作。
Oracle Universal Connection Pool for JDBC 表示一个用于缓存 JDBC 连接的全功能实现。UCP 是一个非常有用的特性,它将使您可以重用连接对象,从而可以提高获取连接过程的速度并节约打开新数据库连接所需的资源。
假设您希望创建一个 UCP JDBC 连接池来重用到 HR/HR Oracle 数据库示例模式的已建立连接。以下程序是一个 UCP JDBC 连接池实际运行的简单示例,将向您展示如何完成此操作。您将首先创建一个支持池的数据源实例,然后设置连接和池的属性。完成后,您将从池中借用一个连接,然后使用该连接与数据库交互。***,您将关闭该连接,将其返回到池。
- import java.sql.*; import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.PoolDataSource;
public class UcpConnection { public static void main(String args[])
throws SQLException
{ try { //Creating a pool-enabled data source PoolDataSource pds
= PoolDataSourceFactory.getPoolDataSource();
//Setting connection properties of the data source pds.
setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE"); pds.setUser("hr");
pds.setPassword("hr"); //Setting pool properties pds.setInitialPoolSize(5);
pds.setMinPoolSize(5); pds.setMaxPoolSize(10);
//Borrowing a connection fro th oo Connection con = pds.getConnection();- ount(); System.out.println("\nAvailable connections: " + avlConnCount);
int brwConnCount = pds.getBorrowedConnectionsCount();
System.out.println("\nBorrowed connections: " + brwConnCount);
//Working with the connection Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select user from dual");
while(rs.next()) System.out.println("\nConnected as: "+rs.getString(1));
rs.close(); //Returning the connection to the pool conn.close(); conn=null;
System.out.println("\nConnection returned to the pool");
//Checking the number of available and borrowed connections again avlConnCount =
pds.getAvailableConnectionsCount();
System.out.println("\nAvailable connections: " + avlConnCount);
brwConnCount = pds.getBorrowedConnectionsCount();
System.out.println("\nBorrowed connections: " + brwConnCount); }
catch(SQLException e) { System.out.println("\nAn SQL exception occurred : " + e.getMessage()); } } }
这里值得注意的是关闭连接时的变化。以上程序的输出阐释了关闭从 UCP JDBC 连接池中借用的连接将使该连接返回到池,以供下一次连接请求使用。
该应用程序的输出应如下所示:
- Connection borrowed from the poolAvailable connections:
4Borrowed connections: 1Connected as:
HRConnection returned to the poolAvailable
connections: 5Borrowed connections: 0
使用 JNDI 借用连接
您还可以提前创建支持池的数据源并将其绑定到 Java 命名和目录接口 (JNDI) 上下文和逻辑名称,而不是像在之前的示例中那样即时创建。将数据源注册到 JNDI 后,可以通过执行 JNDI 查找(指定与数据源绑定的 JNDI 名称)来获取其实例。
假设您要注册一个支持池的数据源以重用到 HR/HR 数据库模式的连接,并将该数据源与 JNDI 树中的逻辑名称 jdbc/HRPool 相关联。为此,必须创建一个表示上述数据源的 PoolDataSource 对象,设置其属性,然后将其注册到一个 JNDI 命名服务。使用以下 Java 程序可以完成此操作:
- import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.PoolDataSource; import javax.naming.*;
import java.util.Hashtable; public class JNDIRegister
{ public static void main(String argv[])
{ try { //Creating a pool-enabled data source instance and
setting its properties PoolDataSource pds = PoolDataSourceFactory.
getPoolDataSource(); pds.setConnectionFactoryClassName
("oracle.jdbc.pool.OracleDataSource"); pds.setURL
("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("hr"); pds.setPassword("hr");
pds.setInitialPoolSize(5); pds.setMinPoolSize(5);
pds.setMaxPoolSize(10); //Registering the data source with
JNDI Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"
com.sun.jndi.fscontext.RefFSContextFactory");
Context ctx = new InitialContext(env);
ctx.bind("jdbc/HRPool", pds); } catch
(Exception e) { System.out.println(e); } } }
必须先设置 Sun 的文件系统 JNDI 服务提供程序(可在此处下载),然后才能运行此程序。确保将以下 JAR 文件添加到类路径中,
【编辑推荐】