1、数据库连接池技术带来的优势:
1)资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2) 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3) 统一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。
2、创建连接的代码片段:
String connUrl = "jdbc:mysql://your.database.domain/yourDBname";
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection (connUrl);
当我们创建了一个Connection对象,它在内部都执行了什么:
1)“DriverManager”检查并注册驱动程序,
2)“com.mysql.jdbc.Driver”就是我们注册了的驱动程序,它会在驱动程序类中调用“connect(url…)”方法。
3)com.mysql.jdbc.Driver的connect方法根据我们请求的“connUrl”,创建一个“Socket连接”,连接到IP为“your.database.domain”,默认端口3306的数据库。
4)创建的Socket连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。
数据库连接的昂贵:每申请一个连接(Connection)会在物理网络(如 TCP/IP网络)上建立一个用于通讯的连接,在此连接上还可以申请一定数量的Statement。连接池中同一连接可提供的活跃Statement数量可以达到几百。在节约网络资源的同时,缩短了每次会话周期(物理连接的建立是个费时的操作)。
连接池初始化时创建一定数量的连接,然后从连接池中重用连接,而不是每次创建一个新的。
3、我们使用的连接池供应者,它的内部有一个连接池管理器。
1)它创建连接池的默认大小,比如指定创建5个连接对象,并把它存放在“可用”状态的任何集合或数组中。
String connUrl = "jdbc:mysql://your.database.domain/yourDBname";
String driver = "com.mysql.jdbc.Driver";
private Map<java.sql.Connection, String> connectionPool = null;
private void initPool() {
try {
connectionPool = new HashMap<java.sql.Connection, String>();
Class.forName(driver);
java.sql.Connection con = DriverManager.getConnection(connUrl);
for (int poolInd = poolSize; poolInd > 0; poolInd--) {
connectionPool.put(con, "AVAILABLE");
}
}
2)当我们调用connectionProvider.getConnection(),然后它会从集合中获取一个连接,当然状态也会更改为“不可用”。
public java.sql.Connection getConnection() throws ClassNotFoundException, SQLException
{
boolean isConnectionAvailable = true;
for (Entry<java.sql.Connection, String> entry : connectionPool.entrySet()) {
synchronized (entry) {
if (entry.getValue()=="AVAILABLE") {
entry.setValue("NOTAVAILABLE");
return (java.sql.Connection) entry.getKey();
}
isConnectionAvailable = false;
}
}
if (!isConnectionAvailable) {
Class.forName(driver);
java.sql.Connection con = DriverManager.getConnection(connUrl);
connectionPool.put(con, "NOTAVAILABLE");
return con;
}
return null;
}
3)当我们关闭得到的连接,ConnectionProvider是不会真正关闭连接。相反,只是将状态更改为“AVAILABLE”。
public void closeConnection(java.sql.Connection connection) throws ClassNotFoundException, SQLException {
for (Entry<java.sql.Connection, String> entry : connectionPool.entrySet()) {
synchronized (entry) {
if (entry.getKey().equals(connection)) {
//Getting Back the conncetion to Pool
entry.setValue("AVAILABLE");
}
}
}
}