java使用dbcp2数据库连接池

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

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

java使用dbcp2数据库连接池

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); 
  //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> CONNECTION_HOLDER = new ThreadLocal<Connection>(); 
 
 /** 
  * 获取数据库连接 
  */ 
 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方法来模拟获取数据库连接进行数据库的操作,可根据自己的需求进行数据的操作。

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