百度 谷歌 http://commons.apache.org/ 可以找到DBCP , 这里选择使用C3P0,百度一下。https://www.mchange.com/projects/c3p0/
在maven 库,找到C3p0添加到MAVEN的版本文件。
数据库连接池的运行机制
(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
选择使用最多的版本,复制添加到Maven依赖关系如下:
到maven项目中添加
接下来使用,连接一个数据库测试
public class DbUtil { private static Connection conn = null; // 声明Connection对象,Connection接口用于建立与特定数据库的连接,私有private只能在本类调用 private PreparedStatement pstmt; private ResultSet rs; // 使用单例模式式创建数据库连接池 private static ComboPooledDataSource dataSource; // 连接数据库的构造方法, 1加载驱动, 2建立连接, 3使用sql语句进行数据库操作, 4释放资源。 // (1)构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有;// // (2)构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。 // (3)每个类可以有零个或多个构造方法;(4)不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。 // (5)构造方法在创建对象时自动执行,一般不能显式地直接调用。 public static ComboPooledDataSource getDateSource() { if (dataSource == null) { try { dataSource = new ComboPooledDataSource(); // try { 执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 } // 获取连接对象,地址,用户名,密码 dataSource.setUser("root"); // 用户名 dataSource.setPassword(""); // 密码 dataSource.setDriverClass("com.mysql.jdbc.Driver"); // mysql数据库驱动程序,这里可以换成你要的其他数据库驱动程 String url = "jdbc:mysql://localhost:3306/dev?characterEncoding=UTF-8"; dataSource.setJdbcUrl(url);// 数据库地址 dataSource.setInitialPoolSize(5); // 初始化连接数 dataSource.setMinPoolSize(1);// 最小连接数 dataSource.setMaxPoolSize(10);// 最大连接数 dataSource.setMaxStatements(50);// 最长等待时间 dataSource.setMaxIdleTime(60);// 最大空闲时间,单位毫秒 System.out.println(dataSource); // System.out.println("连接mysql数据库成功");// 控制台输出 // catch { 除非try里面执行代码发生了异常,否则这里的代码不会执行 } } catch (Exception e) { // 这将捕获任何发生的异常。另外,还提供e参数,可以在处理异常时使用e参数来获得有关异常的信息。 e.printStackTrace(); } } return dataSource; } public static Connection getConnection() { if (conn == null) { try { conn = getDateSource().getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return conn; } /** * 主要针对增,删,改的通用方法 * * @param sql * 要执行的SQL语句(insert, delete, updata) * @param paramsValue * 参数数组,用来处理SQL语句中的占位符参数,如果没有参数,请传入null */ public void update(String sql, String[] str) { try { // 2. 获取PreparedStatement pstmt =getConnection().prepareStatement(sql); // 3. 得到参数元数据个数 int count = pstmt.getParameterMetaData().getParameterCount(); // 4. 利用参数元数据给SQL语句的占位符需要的参数赋值 if (str != null && str.length > 0) { for (int i = 0; i < count; i++) { // 循环结束,就是可以给SQL语句完整赋值 pstmt.setObject(i + 1, str[i]); } } // 5. 执行 pstmt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e); } finally { closeAll(); } } /** * 查询语句 * * @param sql * SQL语句 * @param params * SQL语句 * @return ResultSet结果集 */ public ResultSet executeQueryRS(String sql, Object[] params) { try { pstmt =getConnection().prepareStatement(sql); for (int i = 0; i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } rs = pstmt.executeQuery(); } catch (SQLException e) { System.out.println(e.getMessage()); } return rs; } /** * 获取结果集,并将结果放在List中 * * @param sql * SQL语句 * @return List结果集 */ public List<Object> excuteQuery(String sql, Object[] params) { ResultSet rs = executeQueryRS(sql, params); ResultSetMetaData rsmd = null; int columnCount = 0; try { rsmd = rs.getMetaData(); columnCount = rsmd.getColumnCount(); } catch (SQLException e1) { System.out.println(e1.getMessage()); } List<Object> list = new ArrayList<Object>(); try { while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (int i = 1; i <= columnCount; i++) { map.put(rsmd.getColumnLabel(i), rs.getObject(i)); } list.add(map); } } catch (SQLException e) { System.out.println(e.getMessage()); } finally { closeAll(); } return list; } private void closeAll() { if (rs != null) { try { rs.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } }
使用C3p0,连接数据库成功。并查询数据成功。