0

0

java使用dbcp2数据库连接池

高洛峰

高洛峰

发布时间:2017-01-21 16:23:41

|

1797人浏览过

|

来源于php中文网

原创

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

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

java使用dbcp2数据库连接池

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

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

立即学习Java免费学习笔记(深入)”;

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);
  }
}

  

仿M18紫色版整站 For SHOPEX
仿M18紫色版整站 For SHOPEX

SHOPEX仿M18紫色版 ,适合综合商城,服饰商城.化妆品商城等使用.程序基于SHOPEX4.8.5 最新版制作. 安装方法:1.解压上传程序至网站根目录.. 访问:域名/bak.(用户名:admin 密码:123456)2.进入帝国备份王后,配置数据库信息.选择-www.taomoban.net目录.还原数据库.3.修改FTP目录下的config/config.php 数据库连接信息.4.登陆

下载

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

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/****
jdbc.username=****
jdbc.password=****

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_HOLDER ;
 //线程池
 private static final BasicDataSource DATA_SOURCE;
 static {
   CONNECTION_HOLDER = new ThreadLocal();
    
  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);
  //testWhileIdle
  DATA_SOURCE.setTestOnReturn(true);
  //testOnReturn
  DATA_SOURCE.setTestOnReturn(true);
  //setRemoveAbandonedOnMaintenance
  DATA_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_HOLDER = new ThreadLocal();
  
 /**
  * 获取数据库连接
  */
 public static Connection getConnection() {
  Connection conn = CONNECTION_HOLDER.get();// 1
  if (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();// 1
  if (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 block
     e.printStackTrace();
     System.out.println("PreparedStatement失败");
    }
   }
     
   if(conn!=null){
    try {
     conn.close();
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   //移除线程里面的Connection,不移除会导致connection关闭以后,获取的connection是 关闭状态,不能进行数据操作
   CONNECTION_HOLDER.remove();
   //closeConnection();
  }
  //return entityList;
 }
   
   
}

   

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多java使用dbcp2数据库连接池相关文章请关注PHP中文网!

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

90

2026.02.06

快手网页版入口与电脑端使用指南 快手官方短视频观看入口
快手网页版入口与电脑端使用指南 快手官方短视频观看入口

本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

15

2026.02.06

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

10

2026.02.06

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

6

2026.02.06

JavaScript 异步编程与事件驱动架构
JavaScript 异步编程与事件驱动架构

本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

7

2026.02.06

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

25

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

28

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.8万人学习

Java 教程
Java 教程

共578课时 | 59.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号