本文共 3158 字,大约阅读时间需要 10 分钟。
首先请根据我们在上面创建数据库连接的经验,来思考下列问题:
n 为什么需要连接池?
n 什么是PooledConnection?
n 初始化连接池
n 使用连接池
当使用DriverManager或者DataSource方法来获取数据库连接时,每个对新数据库连接的请求都会导致很大的开销。如果频繁地获取新的连接,将会影响性能问题。这在Web服务器端编程的时候尤为明显。请求一个新的Connection对象会带来大量的开销和很多潜在的错误。为了最小化开销,为什么在我们使用完数据库连接后不是重新使用它们,而是删除它们呢?JDBC设计者在创建接口ConnectionPoolDataSource时使用这种流行的设计模式,这允许您创建数据库连接池,其中的连接在关闭后可以重用,而不是删除。
PooledConnection是一个特殊类型的数据库连接,在关闭时不会被删除,不象常规的Connection对象(当常规的连接不再被使用时,垃圾收集器能删除它们)。相反,PooledConnection被缓存以备将来再次使用,从而可能带来大幅度的性能提升。使用数据库连接池几乎和使用DataSource对象一样。首先,不是创建一个实现DataSource接口的类的实例,而是创建了一个实现了ConnectionPoolDataSource接口的类的实例。可以像以前一样使用JNDI来绑定这个新的数据源到一个名称。要实际使用池化的数据源对象,调用ConnectionPooledDataSource(它接下来会建立数据库连接)上的getPooledConnection()得到一个PooledConnection对象。要创建将使用的Connection对象,调用PooledConnection对象(而不是以前的DriverManager或DataSource对象)上的getConnection().这种方法的一个额外的好处是,因为是自动处理,用ConnectionPool管理一定数量的数据库连接方便多了。如果你的客户机许可限制了能够同时连接到数据库的客户机的数目,这种自动化可能非常重要。
初始化连接池。下面的例子我们将使用SQLServer2000数据库和i-net软件的第三方驱动程序来创建PooledDataSource.所有与数据库相关的代码都包含在初始化或绑定过程中。
首先应该在classpath里面再指向名字为Merlia.jar的jar文件。
2,代码如下:
import com.inet.tds.PDataSource;import java.util.Hashtable;import javax.naming.*;import com.microsoft.jdbcx.sqlserver.SQLServerDataSource;public class JNDIofPooledDataSourceTest { public static void main(String[] args) { String serverName = "192.168.0.1"; String databaseName = "mydb"; String userName = "student"; String password = "student"; // 通过下面的名字可以获得一个池化的连接 String filePath = "jdbcPool/mydatasource"; int portNumber = 1433; int poolSize = 10; // We want to create a pool with 10 connections. Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); try { Context ctx = new InitialContext(env); // 创建一个池化的数据源对象 PDataSource ds = new PDataSource(); ds.setServerName(serverName); ds.setPortNumber(portNumber); ds.setDatabaseName(databaseName); ds.setUser(userName); ds.setPassword(password); ds.setDescription("i-Net PDataSource"); ds.setMaxPoolSize(poolSize); // 绑定池化的数据源 ctx.bind(filePath, ds); ctx.close(); System.out.println("PooledDataSource Created Success!"); } catch (Exception ex) { System.err.println("ERROR: " + ex.getMessage()); } }}
一旦初始化了PooledDataSource,就能够在Java应用程序中使用它来创建数据库连接池。请看下面的例子:
import java.util.Hashtable;import javax.naming.*;import java.sql.*;import javax.sql.*;import java.io.*;public class UseJNDIOfPooledDataSource { public static void main(String[] args) { Connection con = null; try { String filePath = "jdbcPool/mydatasource"; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); Context ctx = new InitialContext(env); // 通过JNDI获得池化的数据源 ConnectionPoolDataSource ds = (ConnectionPoolDataSource) ctx .lookup(filePath); // 通过池化的数据源获得池化的连接 PooledConnection pcon = ds.getPooledConnection(); // 通过池化的连接获得连接 con = pcon.getConnection(); // 如果连接不成功,就会出现异常,不会执行下面这个语句 System.out.println("connect success!"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (con != null)// 用完连接后,要关闭释放 con.close(); } catch (Exception e) { e.printStackTrace(); } } }}
转载地址:http://tzpbn.baihongyu.com/