首先请根据我们在上面创建数据库连接的经验,来思考下列问题:
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();
}
}
}
}