200 likes | 377 Views
第 16 章 Oracle JDBC 连接池和缓存. 本章简介. JDBC 连接池不为每个请求创建一个新连接,而是预先创建一个数据库连接,每当 JDBC 程序需要临时访问数据库时就使用这个连接。 创建一个连接缓存( Connection Cache )间接地使用连接池,连接缓存在创建一个连接池后,可以在需要时向连接池自动添加连接。 本章通过示例,介绍 JDBC 连接池以及连接缓冲的实现方式。. 16.1 Oracle JDBC 连接池和缓存包. 16.2 实现 Oracle JDBC 连接池. ( 1 )创建一个连接池数据源对象。
E N D
本章简介 • JDBC连接池不为每个请求创建一个新连接,而是预先创建一个数据库连接,每当JDBC程序需要临时访问数据库时就使用这个连接。 • 创建一个连接缓存(Connection Cache)间接地使用连接池,连接缓存在创建一个连接池后,可以在需要时向连接池自动添加连接。 • 本章通过示例,介绍JDBC连接池以及连接缓冲的实现方式。
16.2 实现Oracle JDBC连接池 (1)创建一个连接池数据源对象。 (2)使用这个连接池数据源对象设置物理数据库连接的属性。 (3)创建一个缓冲的连接对象,它代表物理数据库连接。 (4)请求、使用和最终关闭连接实例。使用连接实例访问数据库。需要再次访问数据库时,只需请求另一个连接实例。 (5)关闭连接池的连接对象。
16.2.1 创建一个连接池数据源对象 • OracleConnectionPoolDataSource类实现了javax.sql包中定义的ConnectionPoolDataSource接口,还扩展了OracleDataSource类。 • 例如,下面的语句: OracleConnectionPoolDataSource myOCPDS = new OracleConnectionPoolDataSource( );
示例: OracleDataSource myDataSource = new OracleDataSource( ); // 创建Oracle数据源对象 setServerName( ) — 设置正在运行该数据库的服务器名称 setDatabaseName( ) — 设置数据库名 setPortNumber( ) — 设置Oracle Net监听器在哪个端口上等待请求 setDriverType( ) — 设置用于与数据库进行通信的Oracle JDBC驱动程序。 setUser( ) — 指定在数据库连接中使用的数据库用户名 setPassword( ) — 指定在数据库连接中使用的数据库口令
示例: String serverName = myDataSource.getServerName( ); String databaseName = myDataSource.getDatabaseName( ); String driverType = myDataSource.getDriverType( ); String portNumber = myDataSource.getPortNumber( );
示例: myOCPDS.setServerName("DELL"); myOCPDS .setDatabaseName("SONGBO"); myOCPDS.setPortNumber(1521); myOCPDS.setDriverType("thin"); myOCPDS.setUser("store_user"); myOCPDS.setPassword("store_password");
16.2.3 创建一个缓冲的连接对象 • 缓冲的连接对象代表物理连接,可以使用它请求数据库连接实例。javax.sql包中定义的OraclePooledConnection类实现了PooledConnection接口,所以可以使用这个类来创建缓冲的连接对象。 • 例如,下面的语句: • PooledConnection myPooledConnection = myOCPDS.getPooledConnection( );
16.2.4 请求、使用和最终关闭连接实例 • 例如,下面的语句: • Connection myConnection = myPooledConnection.getConnection( ); • 例如,下面的语句: • myConnection.close( );
16.2.5 关闭缓冲的连接对象 • 在程序结束之前,应该使用close( )方法关闭PooledConnection对象。 • 例如,下面的语句: • myPooledConnection.close( );
16.3 Oracle JDBC连接缓存 • 连接缓存的主要优点如下: (1)可以使用一个连接缓存同时建立多个物理数据库连接,然后使用连接实例访问这些物理连接。 (2)创建和管理表示所有物理连接所需的各个缓冲的连接对象不需要开发人员来处理。默认情况下,在需要连接的时候连接缓存会动态创建缓冲的连接对象。
16.3.1 创建连接缓存 • OracleConnectionCacheImpl myOCCI = new OracleConnectionCacheImpl( ); • myOCCI.setServerName("DELL"); • myOCCI.setDatabaseName("SONGBO"); • myOCCI.setPortNumber(1521); • myOCCI.setDriverType("thin"); • myOCCI.setUser("store_user"); • myOCCI .setPassword("store_password");
16.3.2 请求、使用和关闭连接实例 • 访问数据库是通过一个连接实例实现的,所以需要使用OracleConnectionCacheImpl对象的getConnection( )方法来请求一个连接实例。 • 例如,下面的语句使用getConnection( )方法从myOCCI对象请求一个连接实例,并且将返回的连接实例存储在my Connection类的对象中。 • Connection myConnection = myOCCI.getConnection( );
16.3.3 关闭连接缓存 • 在程序结束之前,应该使用close( )方法关闭OracleConnectionCacheImpl对象。 • 例如,下面的语句: • myOCCI.close( ); • 关闭myOCCI也会关闭缓存中的所有PooledConnection对象。
16.3.5 控制PooledConnection对象数量 有下列3种连接缓存模式: (1)dynamic ——这是默认的模式,通常应该使用这种模式。在请求连接实例时,如果满足这两个条件,那么将创建一个新的PooledConnection对象来满足这个请求。当连接实例被关闭时,为处理请求而创建的额外PooledConnection对象被关闭。 (2)fixed wait ——在请求连接实例时,如果前面的条件成立,那么请求被迫等待有连接实例空闲下来。 (3)fixed with no wait —— 在请求连接实例时,如果前面的条件成立,那么请求立即被拒绝(不等待响应),而且对getConnection( )方法的调用返回null。
示例: • myOCCI.setCacheScheme(OracleConnectionCacheImpl.DYNAMIC_SCHEME); • myOCCI.setCacheScheme(OracleConnectionCacheImpl.FIXED_WAIT_SCHEME); • myOCCI.setCacheScheme(OracleConnectionCacheImpl.FIX_RETURN_NULL_SCHEME);
16.4 本章小结 • Oracle JDBC连接池实际上就是一个存储数据库连接的容器,当JDBC程序需要连接数据库时,就直接从连接池中获取一个连接,当使用结束时,再将连接归还给连接池。 • 这样一个数据库连接可以被很多JDBC程序实例共享,无需每次与数据库交互时都进行数据库的连接与断开,大大提高了访问数据库的速度。 • 有时候一个JDBC程序需要访问不同的数据库,这就需要为每一个数据库都建立一个连接池。 • Oracle JDBC连接缓存就是用于管理和优化JDBC连接池的管理器。