集团站切换校区

验证码已发送,请查收短信

图标

学习文章

当前位置:首页 > >学习文章 > >

{Java}简单连接池的基本工作原理与实现

发布时间: 2017-10-19 10:22:55

一:​连接池的概念;

连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要的连接数据库的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接对象使用完毕后,将返回到连接池中,等待为其他的线程服务。



二:连接池的工作原理;

连接池的工作原理主要由三部分组成,分别为连接池的建立、连接池中连接的使用管理、连接池的关闭。

       第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。

       第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:

       当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。

       当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。

       该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

       第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

三:连接池的优点​;

连接池的主要优点有以下三个方面。

       第一、减少连接创建时间。连接池中的连接是已准备好的、可重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。

       第二、简化的编程模式。当使用连接池时,每一个单独的线程能够像创建一个自己的JDBC连接一样操作,允许用户直接使用JDBC编程技术。

       第三、控制资源的使用。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的连接数量,增强了系统在大量用户应用时的稳定性。


四:连接池的实现;

1:数据配置文件;

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/togogo_java_1338

username=java1338

password=123456


2:代码实现;

package net.togogo.java.jdbc.day2.pool;


import java.io.InputStream;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

import java.util.Properties;


public class JdbcPool {

private static String driver;

private static String url;

private static String username;

private static String password;


private static LinkedList<Connection> pool = new LinkedList<Connection>();

private static int poolsize = 10;


static {

try {

Properties prop = new Properties();

InputStream in = JdbcPool.class.getClassLoader().getResourceAsStream("jdbc.properties");

prop.load(in);

driver = prop.getProperty("driver");

url = prop.getProperty("url");

username = prop.getProperty("username");

password = prop.getProperty("password");

Class.forName(driver);


/**

* 初始化连接池的连接对象

*/

if (pool.size() == 0) {

for (int i = 0; i < poolsize; i++) {

try {

Connection conn = DriverManager.getConnection(url, username, password);

pool.add(conn);

System.out.println("[初始化]" + conn + "被加到池里面了!!!");

} catch (SQLException e) {

e.printStackTrace();

}

}

}


} catch (Exception e) {

throw new ExceptionInInitializerError(e);

}

}


/*

* 这里使用动态代理技术返回一个假的Connection,当dao调用假connection的任何方法时,

* 该方法体内会调用InvocationHandler.invoke方法

* 在invoke方法体内,发现dao调用的是close方法,则把链接还到池里,否则,调用真connection的对应方法。

* (non-Javadoc)

*

* @see javax.sql.DataSource#getConnection()

*/

public static Connection getConnection() throws SQLException { // spring aop

if (pool.size() > 0) {

final Connection conn = pool.removeFirst();

System.out.println("[被使用]" + conn + "从池里面取出去了!!!");

return (Connection) java.lang.reflect.Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),

conn.getClass().getInterfaces(), new InvocationHandler() {

// proxy为代理对象 method为要调用的方法 args为方法的参数

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

if (method.getName().equals("close")) {

pool.addFirst(conn);

System.out.println("[被回收]" + conn + "------被还到池里面了!!------");

return null;

} else {

return method.invoke(conn, args);

}

}

});


}

throw new RuntimeException("对不起,池里没有资源了!!!");

}

}


3:编写测试类;

package net.togogo.java.jdbc.day2.pool;


import java.sql.Connection;

import java.sql.SQLException;


public class TestJdbcPool {


public static void main(String[] args) {

try {

Connection con = JdbcPool.getConnection();

System.out.println("被使用的:" + con);

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}


}


4:结果实现;

​​


上一篇: {UI}设计-APP的颜色搭配的技巧

下一篇: {思科CCNA-RS}STP生成树

十年老品牌
QQ咨询:450959328 微信咨询:togogozhong 咨询电话:020-38289118 咨询网站客服:在线客服

相关课程推荐

在线咨询 ×

您好,请问有什么可以帮您?我们将竭诚提供最优质服务!