在开发中中我们经常会使用到数据库连接池,比如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);
  //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方法来模拟获取数据库连接进行数据库的操作,可根据自己的需求进行数据的操作。

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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。