什么是连接?
        连接,是我们的编程语言与数据库交互的一种方式。我们经常会听到这么一句话“数据库连接很昂贵“。
        有人接受这种说法,却不知道它的真正含义。因此,下面我将解释它究竟是什么。[如果你已经知道了,你可以跳到它的工作原理部分]
    创建连接的代码片段:
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连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。
为什么昂贵?
        现在让我们谈谈为什么说它“昂贵“。 如果创建Socket连接花费的时间比实际的执行查询的操作所花费的时间还要更长。这就是我们所说的“数据库连接很昂贵”,因为连接资源数是1,它需要每次创建一个Socket连接来访问DB。因此,我们将使用连接池,连接池初始化时创建一定数量的连接,然后从连接池中重用连接,而不是每次创建一个新的。
怎样工作?
        接下来我们来看看它是如何工作,以及如何管理或重用现有的连接。
        我们使用的连接池供应者,它的内部有一个连接池管理器,当它被初始化:
        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);  
       for (int poolInd = poolSize; poolInd < 0; poolInd++) {  
          java.sql.Connection con = DriverManager.getConnection(dbUrl);  
          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");  
             }  
         }  
     }  
 }  
    基本上连接池的实际工作原理就是这样,但也有可能使用不同的方式。

【JAVA】 Java 连接池的工作原理的更多相关文章

  1. Java 连接池的工作原理(转)

    原文:Java 连接池的工作原理 什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释 ...

  2. Java 连接池的工作原理

    什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释它究竟是什么.[如果你已经知道了, ...

  3. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  4. Java垃圾回收机制的工作原理

    Java垃圾回收机制的工作原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 获取更多内容,请关注小编个人微信公众平台: 一.Java中引入垃圾回收机制的作用 ...

  5. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  6. Java中的HashMap的工作原理是什么?

    问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...

  7. MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物

    dbcp下载 传送门 Commons Pool下载 传送门 Commons log下载 传送门 MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_( ...

  8. MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池

    MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...

  9. jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一)

    jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池)(一) 线程池介绍 在日常开发中经常会遇到需要使用其它线程将大量任务异步处理的场景(异步化以及提升系统的吞吐量),而在 ...

随机推荐

  1. ecshop 后台 审核功能

    有三个关键文件 html文件<img src="images/{if $vo.is_check}yes{else}no{/if}.gif" onclick="lis ...

  2. GIT本地配置和PUSH

    因为GIT使用的是LINUX命令,所以可以参考LINUX的相关命令 一.在本地配置好GIT仓库: 1.首先进入当前工程的目录:cd [filepath] (记住这里的目录应该用/,因为LINUX是这样 ...

  3. 100多个基础常用JS函数和语法集合大全

    网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法: 1.输出语句:document.write(""); 2.JS中的注释为//3.传统 ...

  4. AOP基本名词解释

  5. R语言爬虫初尝试-基于RVEST包学习

    注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧.. 最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://w ...

  6. mount img

    直接挂载img文件有时会有  mount:您必须指定文件系统类型   的错误,但加 -t ext2 等类型还是没用. 这是因为img文件包含了mbr引导导致的问题.解决方法如下: $sudo fdis ...

  7. linux安装php & nginx

    1.安装libxml2 地址:http://ftp.gnome.org/pub/GNOME/sources/libxml2/ wget http://caesar.acc.umu.se/pub/GNO ...

  8. js 制作MD5加密

    主要使用已经写好的JS插件,由于网上有很多,同时自己也可根据原理写出,但为了加快开发速度,我选择了能使用的,写得还不错的js http://pajhome.org.uk/crypt/md5/md5.h ...

  9. [PHP][位转换积累]之与运算截取二进制流的值

    function getBit( $num, $bit, $mask ){ return $num>>$bit&$mask; } var_dump( getBit( 41, 3, ...

  10. Metro下读取txt文件

    情况1:txt是Utf8格式的. 读取代码:IList<String> lines = await Windows.Storage.FileIO.ReadLinesAsync(file); ...