数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

对于数据库连接池,我举一个小小的例子,通过这个例子(虽然不妥当)。我们可以吧数据库理解为一个大的池塘。;连接池为池塘里面的各个小的池塘(相当于一个容器),这个小的池塘里面,存储了我们岁要访问的数据库的相关信息。所以,当我们要访问数据库的时候,我们要访问这个容器,再从这个容器里卖弄取数据,因此,不产生对原数据库的直接操作,从而保护数据(个人理解,好懂就行)

我一般喜欢用C3P0。C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。即便喜欢用,但是对于通过配置C3P0来对数据库建立连接,我还是不太会,所以,我不采用这种配置的方法。

我写了另一篇文章,就是自己定义的一个C3P0连接池。那个写的比这个好用,那篇文章至少让我感觉到了感觉到了池的作用。自定义的数据库连接池(C3P0)JAVA版

在百度百科里面,有关于C3P0的具体配置,可以直接使用

config.properties配置文件
DriverClass = com.mysql.jdbc.Driver
JdbcUrl = jdbc:mysql://IP:3306/auto_smart_home_data?useUnicode=true&characterEncoding=UTF-8
User = root
Password = 123
MaxPoolSize = 20
MinPoolSize = 2
InitialPoolSize = 5
MaxStatements = 30
MaxIdleTime =100

接下来,便是java使用了:

package com.MySql;
import java.sql.Connection;
import java.util.Properties;
import com.mchange.v2.c3p0.ComboPooledDataSource;/*
* @author 22923
* @date 创建时间 2018年5月13日
* @description 通过配置文件的形式,建立对C3P0的操作,
*/
public class C3P0Mysql {private ComboPooledDataSource cpds;private static C3P0Mysql c3P0Properties;static{c3P0Properties = new C3P0Mysql();}public C3P0Mysql() {try {cpds = new ComboPooledDataSource();//加载配置文件Properties props = new Properties();props.load(C3P0Mysql.class.getClassLoader().getResourceAsStream("config.properties"));cpds.setDriverClass(props.getProperty("DriverClass"));cpds.setJdbcUrl(props.getProperty("JdbcUrl"));cpds.setUser(props.getProperty("User"));cpds.setPassword(props.getProperty("Password"));cpds.setMaxPoolSize(Integer.parseInt(props.getProperty("MaxPoolSize")));cpds.setMinPoolSize(Integer.parseInt(props.getProperty("MinPoolSize")));cpds.setInitialPoolSize(Integer.parseInt(props.getProperty("InitialPoolSize")));cpds.setMaxStatements(Integer.parseInt(props.getProperty("MaxStatements")));cpds.setMaxIdleTime(Integer.parseInt(props.getProperty("MaxIdleTime")));} catch (Exception e) {e.printStackTrace();}}public static C3P0Mysql getInstance(){return c3P0Properties;}public Connection getConnection(){Connection conn = null;try {conn = cpds.getConnection();} catch (Exception e) {e.printStackTrace();}return conn;}public static void main(String[] args) {// TODO Auto-generated method stubConnection connection = C3P0Mysql.c3P0Properties.getConnection();System.out.println("已经连接成功");}}

上面的结果是这个:

似乎感觉还没有我直接用来的好。下main是我直接在java中建立连接。

package com.MySql;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class MyDBManger {
/*** @author sunyang_ah@163.com* @return * @function  利用数据库连接池对数据库进行连接* */ComboPooledDataSource combo = new ComboPooledDataSource();private MyDBManger() {// TODO Auto-generated method stubtry {combo.setDriverClass("com.mysql.jdbc.Driver"); // 加载驱动combo.setPassword(""); combo.setUser("root");combo.setJdbcUrl("jdbc:mysql:///auto_smart"); // 地址可以换成云端combo.setMaxPoolSize(10); //池中最大的数量combo.setMinPoolSize(3);combo.setCheckoutTimeout(20000); // 超时连接,断//测试下combo.getConnection().close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("error : "+ e.getMessage());}}private static MyDBManger DBManager = new MyDBManger();public static MyDBManger getDBManger(){return DBManager;} //外面调用获得数据库连接对象,调用此方法public Connection getconnection() throws SQLException{return combo.getConnection();}public static void main(String[] args) {// TODO Auto-generated method stubnew MyDBManger();}}

就向上面的那样,我们调用这个程序,就可以直接得到一个数据库的连接。

package com.MySql;import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import java.sql.Connection;public class DemoTest {Connection connection = null ; ResultSet rs = null ;Statement statement = null ; public DemoTest() {// TODO Auto-generated constructor stubtry {connection = MyDBManger.getDBManger().getconnection();statement = connection.createStatement();// statement 相当于一辆货车,把数据库连接里取数据出来rs = statement.executeQuery("SELECT * FROM autohome ");System.out.println("编号" +"\t"+ "名字" +"\t"+"密码" +"\t");while(rs.next()) {System.out.println(rs.getString("ID") +"\t"+ rs.getString("DATETIME") +"\t"+rs.getString("TEMPTURE") +"\t");}connection.close();rs.close();statement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {// TODO Auto-generated method stubnew DemoTest();}}

对于常用的数据库操作,无非增删查改,对于一些存储过程,触发器之类的,还是算了吧。

先看增,增无非就是insert 。

 // 往数据库中插入数据private void Insert() {try {// 得到一个数据库的连接connection = DataBaseManger.getDBManger().getconnection();statement = connection.createStatement();// 做插入statement.executeUpdate(sql);  // sql为sql语句} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

再看删,其实删和增,是一样的。包括改在内。也就是一个sql语句的不一样。其他的都一样的操作。

对于查,整的来说,也是一样的,唯一不同的是,他的返回值可以有好多,而对于增删改,返回值是int 类型:

int executeUpdate(String sql) throws SQLException;

下面的这个是查找的代码,因为做的是一个服务器,所以最后都是转化成json的格式发。不影响。

 try {connection = MyDBManger.getDBManger().getconnection();// 得到一个连接st = connection.createStatement();rs = st.executeQuery("select id,temperature,humidity,co,createTime from checkdata order by id desc LIMIT 1");System.out.println("====================================");while(rs.next()){try {json.put("id", rs.getInt("id"));json.put("temp", rs.getDouble("temperature"));json.put("hum", rs.getDouble("humidity"));json.put("co", rs.getDouble("co"));json.put("time", rs.getString("createTime"));out.write(json.toString());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(json.toString());}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();
} 

具体的怎么实现这个增删查改,我就直接用网上的一些代码好了。别人写的也是挺好的代码,为啥不用呢?是吧。做个参考。

这个DBConnection.java类,其实就是一个数据库的开关,只是他没用数据库连接池。是直接连接的。

public class DBConnection {String driver = "com.mysql.jdbc.Driver";String url= "jdbc:mysql://localhost:3306/test";String user = "root";String password = "123456";public Connection conn;public DBConnection() {try {Class.forName(driver);// 加载驱动程序conn = (Connection) DriverManager.getConnection(url, user, password);// 连续数据库if(!conn.isClosed())System.out.println("Succeeded connecting to the Database!"); } catch (Exception e) {e.printStackTrace();}}public void close() {try {this.conn.close();} catch (Exception e) {e.printStackTrace();}}
}
public class JDBCTest {public static void main(String[] args){//add(uname, uemail, upwd);//update("李诗诗","lishishi@com","666");//show();del("王小五");}//插入操作public static int add(String uname,String uemail,String upwd) {int i=0;String sql="insert into employee (name,email,pwd) values (?,?,?)";DBConnection db = new DBConnection();try {        PreparedStatement preStmt = (PreparedStatement) db.conn.prepareStatement(sql);preStmt.setString(1, uname);preStmt.setString(2, uemail);preStmt.setString(3, upwd);preStmt.executeUpdate();//Statement statement = (Statement) db.conn.createStatement();//statement.executeUpdate(sql);preStmt.close();db.close();//关闭连接 } catch (Exception e) {e.printStackTrace();}return i;//返回影响的行数,1为执行成功}//查找操作public static void show(){String sql ="select * from employee";DBConnection db = new DBConnection();System.out.println("-----------------");System.out.println("姓名" +"\t"+ "邮箱" +"\t"+ "日期");System.out.println("-----------------");try {Statement stmt = (Statement) db.conn.createStatement();ResultSet rs = (ResultSet) stmt.executeQuery(sql);while(rs.next()){String uname = rs.getString("name");String uemail = rs.getString("email");String uhiredate = rs.getString("hiredate");//可以将查找到的值写入类,然后返回相应的对象 //这里 先用输出的端口显示一下System.out.println(uname +"\t"+ uemail +"\t"+ uhiredate);}rs.close();db.close();//关闭连接 } catch (SQLException e) {e.printStackTrace();} }//更新操作public static int update(String uname,String uemail,String upwd) {int i =0;String sql="update employee set email=?,pwd=? where name=?";DBConnection db = new DBConnection();try {PreparedStatement preStmt = (PreparedStatement) db.conn.prepareStatement(sql);preStmt.setString(1, uemail);preStmt.setString(2, upwd);preStmt.setString(3, uname);preStmt.executeUpdate();preStmt.close();db.close();//关闭连接 } catch (SQLException e) {e.printStackTrace();}return i;//返回影响的行数,1为执行成功}//删除操作public static int del(String uname) {int i=0;String sql="delete from employee where name=?";DBConnection db = new DBConnection();try {    PreparedStatement preStmt = (PreparedStatement) db.conn.prepareStatement(sql);preStmt.setString(1, uname);preStmt.executeUpdate();preStmt.close();db.close();//关闭连接 } catch (SQLException e){e.printStackTrace();}return i;//返回影响的行数,1为执行成功}
}

上面的这个代码来自博客:https://www.cnblogs.com/liushao/p/6381678.html,但愿这哥们不要怪我

其他的就没啥了。

我没找到上传附件的地方,就不上传了,关于C3P0连接池的一些jar包网上一堆。直接下载就好了。我也是因为同学找我要一些资料。才写的这个。

java通过数据库连接池的方式连接数据库(C3P0)相关推荐

  1. java 常用的数据库连接池,java通过数据库连接池的方式

    数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏 ...

  2. Java数据库连接池知识汇总(C3P0+DBCP+Druid)

    为什么要使用数据库连接池技术? 数据库连接池技术的优点 1. 资源重用 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性 ...

  3. java使用数据库连接池连接MySQL/MariaDB--DBCP2

    如果每次操作数据库都需要重新连接数据库,那么会很浪费资源.因此建议使用数据库的连接池来满足多线程的数据库操作. Java中数据库连接池有多种实现方法,推荐使用DBCP,这是Apache 提供的数据库连 ...

  4. Java jdbc数据库连接池

    1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...

  5. Java创建线程池的方式

    Java创建线程池的方式 文章目录 Java创建线程池的方式 一.通过Executors工厂方法创建 1.Executors.newSingleThreadExecutor() 2.Executors ...

  6. java 数据库连接池配置方式

    一,Tomcat配置数据源: 方式一:在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,内容如下:  <Context>       <Resour ...

  7. 数据库连接池的作用及c3p0的详解

    1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模 ...

  8. 数据库连接池简单介绍和 C3P0的JDBC配置

    前面一节我们介绍了怎样利用jdbc连接数据库,已经实现了数据库的连接,可是在实际的项目开发中,能够发现基本上都使用了数据库连接池技术.为什么要使用数据库连接池呢?根源在于对数据库连接的低效管理 答: ...

  9. Java中数据库连接池原理机制的详细讲解

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(ResourcePool).该模式正 ...

最新文章

  1. 上海交大情感脑电数据集(SJTU Emotion EEG Dataset,SEED)
  2. 计算机存储器与寄存器的区别,存储器和寄存器区别
  3. ruby中的复制 dup clone
  4. 【三维深度学习】多视角立体视觉 MVSNet代码解读
  5. RMAN备份恢复报错 ORA-19573: cannot obtain exclusive enqueue for datafile 5
  6. Google Hacking技术
  7. PHP去除顽固空格和编码问题
  8. 中国吉他效果市场趋势报告、技术动态创新及市场预测
  9. 2. Anaconda下使用Pip或者conda安装库指南
  10. POJ-2262 Goldbach's Conjecture
  11. 夏宇闻《Verilog数字系统设计教程》 - 第1章 Verilog的基本知识
  12. 计算机二级公共基础知识点整理
  13. 计算机软件网络工程师考试试题,计算机软件水平考试《网络工程师》试题及答案(6)...
  14. easypanel b.php,easypanel 免费主机面板
  15. MOSFET开关管的结构以及在MATLAB中的连接
  16. 荐读:FPGA设计经验之图像处理
  17. linkerd1.6 local安装方式文档
  18. 老树新芽 体验Visual Basic 9.0新功能
  19. Socket详解-socket建立
  20. 傻瓜式ensp380启用NGFW USG6000v教程,并附web网管教程

热门文章

  1. 2021年T电梯修理考试及T电梯修理模拟试题
  2. 清空mysql的历史记录
  3. 构建GLFW详细全过程
  4. 深聊测开领域之:一文搞懂什么是敏捷测试,如何做敏捷测试,建议先收藏再学习。
  5. 所有人都应该接受行善的成本是伪善行为
  6. python 使用cv2.resize()后输出颜色不正确
  7. 【Kali】WPA / WPA2破解
  8. 天涯若比邻的上一句是什么,这首诗作者是谁、表达的是什么意思?
  9. 资深建模师曝光:做3D游戏建模师,工资到底如何?
  10. Matlab中加法器是什么,加法器,加法器是什么意思