在开发中中我们经常会使用到数据库连接池,比如dbcp数据库连接池,本章将讲解java连接dbcp数据库库连接池的简单使用。

开发工具myeclipse2014

1,首先创建一个web项目,我把项目名取名为testjdbc,需要带有web.xml的配置文件,进行servlet的配置,创建完成以后的项目结构如下:

2,创建包,我创建的包名是com.szkingdom.db

3,创建帮助类CastUtil,代码如下:

package com.szkingdom.db;
/** * Created by jack on 2015/12/26. * 转型操作工具类 */
public class CastUtil {/* * 转为String型 * */  public static String castString(Object obj) {  return CastUtil.castString(obj, "");  }  /* * 转为String型(提供默认值) * */  public static String castString(Object obj, String defaultValue) {  return obj != null ? String.valueOf(obj) : defaultValue;  }  /* * 转为double型 * */  public static double castDouble(Object obj) {  return castDouble(obj, (double)0);  }  /* * 转为double型(提供默认值) * */  public static double castDouble(Object obj, Double defaultValue) {  double doubleValue = defaultValue;  if (obj != null) {  String strValue = castString(obj);  if (StringUtil.isNotEmpty(strValue)) {  try {  doubleValue = Double.parseDouble(strValue);  } catch (NumberFormatException e) {  defaultValue = defaultValue;  }  }  }  return doubleValue;  }  /* * 转为long型 * */  public static long castLong(Object obj) {  return castLong(obj, 0);  }  /* * 转为long型(提供默认值) * */  public static long castLong(Object obj, long defaultValue) {  long longValue = defaultValue;  if (obj != null) {  String strValue = castString(obj);  if (StringUtil.isNotEmpty(strValue)) {  try {  longValue = Long.parseLong(strValue);  }catch (NumberFormatException e){  longValue=defaultValue;  }  }  }  return longValue;  }  /* * 转为int型 * */  public static int castInt(Object obj){  return castInt(obj,0);  }  /* * 转为int型(提供默值) * */  public static int castInt(Object obj,int defaultValue){  int intValue=defaultValue;  if (obj!=null){  String strValue=castString(obj);  if(StringUtil.isNotEmpty(strValue)){  try {  intValue=Integer.parseInt(strValue);  }catch (NumberFormatException e){  intValue=defaultValue;  }  }  }  return intValue;  }  /* * 转为boolean型 * */  public static boolean castBoolean(Object obj){  return castBoolean(obj,false);  }  /* * 转为boolean型(提供默认值) * */  public static boolean castBoolean(Object obj,boolean defaultValue){  boolean booleanValue=defaultValue;  if(obj!=null){  booleanValue=Boolean.parseBoolean(castString(obj));  }  return booleanValue;  }
}

4,创建属性文件读取帮助类PropsUtil,代码如下:

package com.szkingdom.db;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/** * Created by jack on 2015/12/26. * 属性文件工具类 */
public class PropsUtil {//private static final Logger LOGGER = LoggerFactory.getLogger(PropsUtil.class);  /* * 加载属性文件 * * */  public static Properties loadProps(String fileName) {  Properties properties = null;  InputStream inputStream = null;  try {  inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);  if (inputStream == null) {  throw new FileNotFoundException(fileName + " file is not found!");  }  properties = new Properties();  properties.load(inputStream);  } catch (IOException e) {  //LOGGER.error("load properties file failure", e);System.out.println("load properties file failure:"+e);} finally {  if (inputStream != null) {  try {  inputStream.close();  } catch (IOException e) {  //LOGGER.error("close input stream failure", e); System.out.println("close input stream failure:"+e);}  }  }  return properties;  }  /* * 获取字符型属性(默认为空字符串) * * */  public static String getString(Properties props, String key) {  return getString(props, key, "");  }  /* * 获取字符型属性(可指定默认值) * */  public static String getString(Properties props, String key, String  defaultValue) {  String value = defaultValue;  if (props.containsKey(key)) {  value = props.getProperty(key);  }  return value;  }  /* * 获取数值类型属性(默认为0) * */  public static int getInt(Properties props, String key) {  return getInt(props, key, 0);  }  /* * 获取数值类型属性(可指定默认值) * */  public static int getInt(Properties props, String key, int defaultValue) {  int value = defaultValue;  if (props.containsKey(key)) {  value = CastUtil.castInt(props.getProperty(key));  }  return value;  }  /* * 获取布尔型属性(默认值为false) * */  public static boolean getBoolean(Properties props, String key) {  return getBoolean(props, key, false);  }  /* * 获取布尔型属性(可指定默认值) * */  public static boolean getBoolean(Properties props, String key, Boolean defaultValue) {  boolean value = defaultValue;  if (props.containsKey(key)) {  value = CastUtil.castBoolean(props.getProperty(key));  }  return value;  }
}

5,创建一个字符串帮助类StringUtil,代码如下:

package com.szkingdom.db;
/** * Created by jack on 2015/12/26. * 字符串工具类 */
public class StringUtil {/* * 判断字符串是否为空 * */  public static boolean isEmpty(String str){  if(str != null){  str=str.trim();  }  //return StringUtils.isEmpty(str);return "".equals(str);}  /* * 判断字符串是否非空 * */  public static boolean isNotEmpty(String str){  return !isEmpty(str);  }
}

6,在src目录下创建一个数据库连接的属性文件dbconfig.properties

<span style="color:#333333;">jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://</span><span style="color:#ff6666;background-color: rgb(255, 0, 0);">127.0.0.1:3306/****</span><span style="color:#333333;">
jdbc.username=****
jdbc.password=****</span>

7,把必备的jar包放到lib目录下:

8,使用dbcp创建数据库帮助类

package com.szkingdom.db;import java.io.ByteArrayInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;import org.apache.commons.dbcp2.BasicDataSource;/*** Created by jack on 2015/12/26. 数据库操作助手类*/
public class DatabaseHelper {// private static final Logger LOGGER=// LoggerFactory.getLogger(DatabaseHelper.class);private static final String DRIVER;private static final String URL;private static final String USERNAME;private static final String PASSWORD;//保证一个线程一个Connection,线程安全  private static final ThreadLocal<Connection> CONNECTION_HOLDER ;  //线程池  private static final BasicDataSource DATA_SOURCE; static {CONNECTION_HOLDER = new ThreadLocal<Connection>();Properties conf = PropsUtil.loadProps("dbconfig.properties");DRIVER = conf.getProperty("jdbc.driver");URL = conf.getProperty("jdbc.url");USERNAME = conf.getProperty("jdbc.username");PASSWORD = conf.getProperty("jdbc.password");String driver = conf.getProperty("jdbc.driver");  String url = conf.getProperty("jdbc.url");  String username = conf.getProperty("jdbc.username");  String passwrod = conf.getProperty("jdbc.password"); DATA_SOURCE=new BasicDataSource();  DATA_SOURCE.setDriverClassName(driver);  DATA_SOURCE.setUrl(url);  DATA_SOURCE.setUsername(username);  DATA_SOURCE.setPassword(passwrod); //数据库连接池参数配置:http://www.cnblogs.com/xdp-gacl/p/4002804.html//http://greemranqq.iteye.com/blog/1969273//http://blog.csdn.net/j903829182/article/details/50190337//http://blog.csdn.net/jiutianhe/article/details/39670817//http://bsr1983.iteye.com/blog/2092467//http://blog.csdn.net/kerafan/article/details/50382998//http://blog.csdn.net/a9529lty/article/details/43021801///设置空闲和借用的连接的最大总数量,同时可以激活。DATA_SOURCE.setMaxTotal(60);//设置初始大小DATA_SOURCE.setInitialSize(10);//最小空闲连接DATA_SOURCE.setMinIdle(8);//最大空闲连接DATA_SOURCE.setMaxIdle(16);//超时等待时间毫秒DATA_SOURCE.setMaxWaitMillis(2*10000);//只会发现当前连接失效,再创建一个连接供当前查询使用DATA_SOURCE.setTestOnBorrow(true);//removeAbandonedTimeout  :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)DATA_SOURCE.setRemoveAbandonedTimeout(180);//removeAbandoned  :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)//DATA_SOURCE.setRemoveAbandonedOnMaintenance(removeAbandonedOnMaintenance);DATA_SOURCE.setRemoveAbandonedOnBorrow(true);//testWhileIdleDATA_SOURCE.setTestOnReturn(true);//testOnReturnDATA_SOURCE.setTestOnReturn(true);//setRemoveAbandonedOnMaintenanceDATA_SOURCE.setRemoveAbandonedOnMaintenance(true);//记录日志DATA_SOURCE.setLogAbandoned(true);//设置自动提交DATA_SOURCE.setDefaultAutoCommit(true);// DATA_SOURCE.setEnableAutoCommitOnReturn(true);System.out.println("完成设置数据库连接池DATA_SOURCE的参数!!");/*try {Class.forName(DRIVER);System.out.println("load jdbc driver success");} catch (ClassNotFoundException e) {// LOGGER.error("can not load jdbc driver",e);System.out.println("can not load jdbc driver:" + e);}finally{}*/}//private static final ThreadLocal<Connection> CONNECTION_HOLDER = new ThreadLocal<Connection>();/*** 获取数据库连接*/public static  Connection getConnection() {Connection conn = CONNECTION_HOLDER.get();// 1if (conn == null) {try {//conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);conn = DATA_SOURCE.getConnection(); System.out.println("get connection success");} catch (SQLException e) {// LOGGER.error("get connection failure", e);System.out.println("get connection failure:" + e);} finally {/*System.out.println(" 最小空闲连接MinIdle="+DATA_SOURCE.getMinIdle());System.out.println(" 最大空闲连接MaxIdle="+DATA_SOURCE.getMaxIdle());System.out.println(" 最大连接数量MaxTotal="+DATA_SOURCE.getMaxTotal());System.out.println(" 初始大小InitialSize="+DATA_SOURCE.getInitialSize());System.out.println(" 超时等待时间MaxWaitMillis="+(DATA_SOURCE.getMaxWaitMillis()/1000));System.out.println(" 获取活动的连接数getNumActive()="+DATA_SOURCE.getNumActive());System.out.println(" 获取连接数getNumIdle="+DATA_SOURCE.getNumIdle());*/CONNECTION_HOLDER.set(conn);}}return conn;}/*** 关闭数据库连接*/public static void closeConnection() {Connection conn = CONNECTION_HOLDER.get();// 1if (conn != null) {try {conn.close();System.out.println("close connection success");} catch (SQLException e) {// LOGGER.error("close connection failure", e);System.out.println("close connection failure:" + e);throw new RuntimeException(e);} finally {CONNECTION_HOLDER.remove();}}}//进行数据库操作public static  synchronized  void update(int thlsh,String ltnr) {  Connection conn = getConnection();if(conn==null){System.out.println("update方法里面的()connection为null!!");}PreparedStatement pstmt=null;System.out.println("update开始!");int ltlsh=0;try {  //String sql="update message set CONTENT = ? where id=?"; //String sql1="select ltlsh  from t_zxthlsk where lsh = ?";String sql="update t_wx_ltnrk b set b.LTNR = ? where b.lsh = "+"( select a.ltlsh  from t_zxthlsk a where a.lsh = ? )";System.out.println("更新的sql语句为:sql->"+sql);pstmt = conn.prepareStatement(sql); pstmt.setBlob(1, new ByteArrayInputStream(ltnr.getBytes()));pstmt.setInt(2, thlsh);/*pstmt.setString(1, "this is dbcp2 test 2222");pstmt.setInt(2, 6);*/if(pstmt.executeUpdate()>0){//System.out.println("更新id=1的数据成功!");System.out.println("更新thlsh="+thlsh+"的聊天内容数据成功!\n聊天内容为:"+ltnr);}//conn.commit();/*while(rs1.next()){ltlsh = rs1.getInt("ltlsh");System.out.println("查询聊天流水号成功,聊天流水号为ltlsh->"+ltlsh);}*///pstmt.setString(1, "精彩内容update1");//pstmt.setInt(2, 1);//pstmt.setBlob(1, new ByteArrayInputStream("12345中国".getBytes()));//pstmt.setInt(2, 76732);/*if(pstmt.executeUpdate()>0){//System.out.println("更新id=1的数据成功!");System.out.println("更新id=76732的数据成功!");}conn.commit();*/System.out.println("update t_wx_ltnrk success");} catch (SQLException e) {  //LOGGER.error("query entity list failure", e); System.out.println("更新数据异常connection="+conn);System.out.println("update t_wx_ltnrk failure:" + e);throw new RuntimeException(e);  } finally { //closeConnection();  //closeConnection();if(pstmt!=null){try {pstmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("PreparedStatement失败");}}if(conn!=null){try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//移除线程里面的Connection,不移除会导致connection关闭以后,获取的connection是 关闭状态,不能进行数据操作CONNECTION_HOLDER.remove();//closeConnection();}  //return entityList;  }  }

9,基本的数据库连接池就创建完毕了,之后就可以通过DatabaseHelper的update方法来模拟获取数据库连接进行数据库的操作,可根据自己的需求进行数据的操作。

java使用dbcp2数据库连接池相关推荐

  1. java Datasource,数据库连接池

    java Datasource,数据库连接池 目前有多重方式创建数据库连接池:JNDI,DBCP,C3P0等 为什么需要连接池: 使用java API DriverManager.getConnect ...

  2. java 简易版本数据库连接池

    写了个 Java数据库连接池,具备基本的功能点: 1.对池中活动连接的重用. 2.池满时的适时等待. 3.对空闲连接的适时关闭. 抛砖引玉,走过路过,不吝赐教. DBConnection.java如下 ...

  3. java 革命_JAVA数据库连接池的革命 -- 从BoneCP到HikariCP(转)

    从BoneCP到HikariCP 今天笔者本想更新一下项目中使用到的BoneCP版本的.却无意发现jolbox网站打不开了.起初以为是被墙掉了,经过一番查找,居然在BoneCP的Github站看到了如 ...

  4. Java Web使用数据库连接池

    这里使用的Web服务器是Tomcat服务器 方法一. 1.1  配置context.xml文件 context.xml文件路径: D:\Tomcat 7\conf\context.xml       ...

  5. java连接mysql数据库连接池_java使用原生MySQL实现数据的增删改查以及数据库连接池技术...

    一.工具类及配置文件准备工作 1.1 引入jar包 使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下: mysql mysql-connector-java 5.1.48 ...

  6. Java使用独立数据库连接池(DBCP为例)

    目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O操作).一般来说一次访问数据库就需要一个数据库连接.而每次创建数据库连接都需要访问,分配空闲资源 ...

  7. java day30【数据库连接池 、Spring JDBC : JDBC Template】

    第一章  数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后 ...

  8. Java JDBC和数据库连接池 韩顺平老师自学笔记

    JDBC和数据库连接池 JDBC 概述 基本介绍 原理示意图 代码示例 JdbcInterface 模拟Java公司提供给其它数据库厂商的接口,供给调用 TestJdbc 模拟一个类来实现数据库的调用 ...

  9. 【JAVA】JDBC数据库连接池

    目录 [JDBC] [JDBC--项目示例] [JDBC-API] [DriverManager]--驱动管理类 [Connection]--数据库连接对象 [Statement]--执行 [Resu ...

最新文章

  1. 北京中天荣泰视觉检测 仿真
  2. 移动互联网时代之用户名和密码何去何从(1)
  3. 近期笔试小结(附数据库工程师面试准备)
  4. windows下expdp自动备份脚本
  5. 代码缺陷导致 CloudFlare 泄露大量客户站点的密码等私密信息
  6. ORA-25153: Temporary Tablespace is Empty
  7. 天天象棋 残局闯关 第12关
  8. python time localtimeq获取准确时间_python的内置模块time和datetime的方法详解以及使用(python内的time和datetime时间格式)...
  9. 优化在深度学习中的挑战
  10. 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)
  11. vue3.0实现jsoneditor组件
  12. 有关彩虹猫病毒的一些小小的分析
  13. 惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描)驱动安装记录...
  14. 手机应用(App)推广服务-App收录,App推广,App评测,App下载,App搜索-搜应用网(www.souapp.com)
  15. 嵌入式是什么 ?为什么要学好嵌入式呢?
  16. 互联网、因特网、万维网的区别
  17. csh/python/tcl常用功能
  18. 恒指长期情况研判(期指来判断)
  19. boj489. 小妹妹去划船
  20. python四级属于什么水平_大学英语四级成绩等级划分是什么样的呢?

热门文章

  1. 为什么进不去Pycharm官网--解决办法一
  2. 对于tomcat升级导致游览器访问页面出现的中文乱码问题解决方案
  3. Windows 7安装ArcGIS DeskTop10:错误1935,处理办法
  4. 内核调试番外篇 - KDB的介绍与简单使用
  5. [Mac OS]ASUS z97-K R2.0 + GTX960 + Clover v2.4k r4098 Install Sierra 10.12.5 安装过程中遇到的问题及解决方案
  6. 涨点利器:推荐系统中对双塔模型的各种改造升级(上)
  7. NTP时钟同步原理及误差简析
  8. 神奇的魔术师——简单工厂模式
  9. fig翻译_Fig. 2. (a) Loading equipment; (b) Distributi简体中文怎么写 - 什么意思? - 怎么翻译?...
  10. 全球所有国家中英文名称