一、先来看看手工创建的方式

    public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/mytable?useUnicode=true&characterEncoding=utf8", "root",
"");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}

这种直接建立的方式一定要注意:在访问完成后链接的释放。

conn.close();

如果这个时候循环查询一个表100次,你能看到数据库建立了100个链接,如果你释放了的话,100个链接会或快或慢的全部释放掉。

如果数据库访问很频繁的话,好可惜啊,刚建立好一个链接就拆掉了,刚拆完又要新建一个链接……

所以,连接池出来了。较为熟悉的有c3p0、dbcp2等等。

二、通过dbcp2连接池获取Connection

一个较好的初始化配置实例。

     // ThreadSafe
private static final ThreadLocal<Connection> connHolder;
private static final BasicDataSource dataSource; static {
connHolder = new ThreadLocal<Connection>();
dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/mytable");
dataSource.setUsername("root");
dataSource.setPassword("");
/// 设置空闲和借用的连接的最大总数量,同时可以激活。
dataSource.setMaxTotal();
// 设置初始大小
dataSource.setInitialSize();
// 最小空闲连接
dataSource.setMinIdle();
// 最大空闲连接
dataSource.setMaxIdle();
// 超时等待时间毫秒
dataSource.setMaxWaitMillis( * );
// 只会发现当前连接失效,再创建一个连接供当前查询使用
dataSource.setTestOnBorrow(true);
// removeAbandonedTimeout :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
dataSource.setRemoveAbandonedTimeout();
// removeAbandoned :超过removeAbandonedTimeout时间后,是否进
// 行没用连接(废弃)的回收(默认为false,调整为true)
// DATA_SOURCE.setRemoveAbandonedOnMaintenance(removeAbandonedOnMaintenance);
dataSource.setRemoveAbandonedOnBorrow(true);
// testWhileIdle
dataSource.setTestOnReturn(true);
// testOnReturn
dataSource.setTestOnReturn(true);
// setRemoveAbandonedOnMaintenance
dataSource.setRemoveAbandonedOnMaintenance(true);
// 记录日志
dataSource.setLogAbandoned(true);
dataSource.setDefaultAutoCommit(true); } public static Connection getConnection() {
Connection conn = connHolder.get();
if (conn == null) {
try {
conn = dataSource.getConnection();
System.out.println("get connection success");
} catch (SQLException e) {
System.out.println("get connection failure:" + e);
} finally {
connHolder.set(conn);
}
}
return conn;
} public static void closeConnection() {
Connection conn = connHolder.get();
if (conn != null) {
try {
conn.close();
System.out.println("close connection success");
} catch (SQLException e) {
System.out.println("close connection failure:" + e);
throw new RuntimeException(e);
} finally {
connHolder.remove();
}
}
}

实际使用的时候,释放conn链接的方法可以直接调用conn.close()方法,也可以使用closeConnection()方法。

区别就是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

dbcp2连接池获取数据库连接Connection的更多相关文章

  1. DatasourceUtils类:获取连接池和数据库连接

    本工具类用于获取连接池和数据库连接 package com.itheima.utils; import java.sql.Connection; import java.sql.ResultSet; ...

  2. c3p0连接池获得的Connection执行close方法后是否真的销毁Connection对象?

    问题描述: jfinal做的api系统中,在正常调用接口一段时间后,突然再调用接口的时候,该请求无响应api系统后台也无错误信息 (就是刚开始接口调用是正常的,突然就无响应了) 于是啊,就开始找错误. ...

  3. druid连接池获取不到连接的一种情况

    数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...

  4. JSP(Servlet)中从连接池获取连接

    1) 建立连接. 2) 执行SQL. 3) 处理结果. 4) 释放资源. Connection pool:连接池 DataSource: LDAP ( Light directory access p ...

  5. ThreadLocal,LinkedBlockingQueue,线程池 获取数据库连接2改进

    package com.ctl.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQL ...

  6. 采用DBCP连接池技术管理连接

    DBCP的使用步骤步骤一:导包,使用第三方的道具,必须导入相应的jar包. 一般需要导入两个jar包: -commons-dbcp-1.x.jar包 -commons-pool-1.x.x.jar包 ...

  7. JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

    一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...

  8. 线程池-连接池-JDBC实例-JDBC连接池技术

    线程池和连接池   线程池的原理:     来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客 ...

  9. 使用MongoDB 2.6 C++驱动中的连接池

    .post p{text-indent: 2em;} MongoDB2.6的CXX驱动(mongo-cxx-driver-26compat),内置包含了数据库连接池,方便管理数据库连接,但是官方文档说 ...

随机推荐

  1. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  2. WPF ClickOnce应用程序IIS部署发布攻略

    WPF程序非常适合公司内网使用,唯一缺点就是客户端要安装.net框架4.0.优势也很明显,在客户端运行的是一个WinForm程序,自动下载,可以充分利用客户机的性能,而且是以当前的Windows用户权 ...

  3. java 日期工具类

    import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...

  4. Openfire更服务器名称后报Found RSA certificate that is not valid for the server domain的解决方法

    原文:http://blog.sina.com.cn/s/blog_ae5a3d3f0102wdrb.html Openfire更服务器名称的方法: 1.登陆openfire管理页面,在主页面下方选择 ...

  5. Mysql 会导致锁表的语法

    最近再找一些Mysql锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...

  6. 【GISER && Painter】Chapter00:OpenGL原理学习笔记

    说明:简单了解一下OpenGL的工作原理,初步认识计算机对于图形渲染的底层设计与实现,第一次接触,也没学过C艹,欢迎各位批评指正. 一  什么是OpenGL? OpenGL是一个开放标准(specif ...

  7. react的传值类型PropTypes简单说明

    1.首先可以有那么多种类型 propTypes: { // 可以声明 prop 为指定的 JS 基本类型.默认 // 情况下,这些 prop 都是可传可不传的. optionalArray: Reac ...

  8. mysql DATE_FORMAT(date, format) 函数

    DATE_FORMAT(date, format) 函数用法 DATE_FORMAT(date, format) 函数根据format字符串格式化date值. 1.把字符串转为日期格式 实例: SEL ...

  9. rqnoj-208-奥运火炬到厦门-dp

    这道题目是把一个连续的串看成一个环. 那么除了原始的求最大字段和外. 还存在一种情况是前面的连续最大值,加上后面的连续最大值. #include<stdio.h> #include< ...

  10. 高性能WEB开发:重排与重绘

    DOM编程可能最耗时的地方,重排和重绘. 1.什么是重排和重绘 浏览器下载完页面中的所有组件——HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构——DOM树和渲染树. D ...