本文源码:GitHub·点这里 || GitEE·点这里

一、C3P0连接池

1、C3P0简介

C3P0是一个开源的JDBC连接池,应用程序根据C3P0配置来初始化数据库连接,可以自动回收空闲连接的功能。

2、核心依赖

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>

3、配置文件

配置文件位置:放在resources目录下,这样C3P0组件会自动加载该配置。

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 核心参数配置 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/servlet-jdbc</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<!-- 池参数配置 -->
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>

4、编写工具类

该工具类用来获取数据库连接,和释放相关连接。

public class C3P0Pool {
private static DataSource dataSource = new ComboPooledDataSource();
public static DataSource getDataSource() {
return dataSource ;
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 释放连接
*/
public static void close(ResultSet resultSet, PreparedStatement pst, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pst != null) {
try {
pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

二、数据操作封装

1、新增数据

public class UserJdbcInsert {
public static void insertUser (UserInfo userInfo){
try {
Connection connection = C3P0Pool.getConnection();
String sql = "INSERT INTO user_info (user_name,user_age) VALUES (?,?)" ;
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,userInfo.getUserName());
statement.setString(2,userInfo.getUserAge().toString());
statement.execute() ;
C3P0Pool.close(null, statement, connection);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void batchInsertUser (List<UserInfo> userInfoList){
try {
Connection connection = C3P0Pool.getConnection();
String sql = "INSERT INTO user_info (user_name,user_age) VALUES (?,?)" ;
PreparedStatement statement = connection.prepareStatement(sql);
for (UserInfo userInfo:userInfoList){
statement.setString(1,userInfo.getUserName());
statement.setString(2,userInfo.getUserAge().toString());
statement.addBatch();
}
statement.executeBatch() ;
C3P0Pool.close(null, statement, connection);
} catch (Exception e) {
e.printStackTrace();
}
}
}

2、查询数据

public class UserJdbcQuery {
public static UserInfo queryUser (String userName){
UserInfo userInfo = null ;
try {
Connection connection = C3P0Pool.getConnection();
String sql = "SELECT * FROM user_info WHERE user_name=?" ;
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,userName);
ResultSet resultSet = statement.executeQuery() ;
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("user_name");
int age = resultSet.getInt("user_age");
System.out.println("ID:"+id+";name:"+name+";age:"+age);
userInfo = new UserInfo(name,age) ;
}
C3P0Pool.close(resultSet, statement, connection);
} catch (Exception e) {
e.printStackTrace();
}
return userInfo ;
}
}

3、更新数据

public class UserJdbcUpdate {
public static void updateUser (String name,Integer age,Integer id){
try {
Connection connection = C3P0Pool.getConnection();
String sql = "UPDATE user_info SET user_name=?,user_age=? WHERE id=?" ;
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,age);
statement.setInt(3,id);
statement.executeUpdate() ;
C3P0Pool.close(null, statement, connection);
} catch (Exception e) {
e.printStackTrace();
}
}
}

4、删除数据

public class UserJdbcDelete {
public static void deleteUser (Integer id){
try {
Connection connection = C3P0Pool.getConnection();
String sql = "DELETE FROM user_info WHERE id=?" ;
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.executeUpdate() ;
C3P0Pool.close(null, statement, connection);
} catch (Exception e) {
e.printStackTrace();
}
}
}

三、Servlet接口

public class JdbcServletImpl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("userName") ;
UserInfo userInfo = UserJdbcQuery.queryUser(userName) ;
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("用户信息:"+userInfo);
}
}

测试访问:

http://localhost:6003/jdbcServletImpl?userName=LiSi

页面打印:

用户信息:UserInfo{userName='LiSi', userAge=22}

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

JavaEE基础(06):Servlet整合C3P0数据库连接池的更多相关文章

  1. JDBC整合c3p0数据库连接池 解决Too many connections错误

    前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: ...

  2. C3P0数据库连接池使用方法

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  3. c3p0数据库连接池无法连接数据库—错误使用了username关键字

    一.问题描述 上篇博客说到了关于maven无法下载依赖jar包的问题,这篇博客再说一下关于在本个项目中遇到的关于使用C3P0连接池连接数据库的问题,真心很奇葩,在此,也请大家引起注意.首先看我的项目基 ...

  4. 【Java EE 学习 16 上】【dbcp数据库连接池】【c3p0数据库连接池】

    一.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: package day16.utils; import java.io.IOException; import java.lang.ref ...

  5. paip.c3p0 数据库连接池 NullPointerException 的解决...

    paip.c3p0 数据库连接池 NullPointerException 的解决... 程序ide里面运行正常..外面bat运行错误.. 作者Attilax  艾龙,  EMAIL:14665198 ...

  6. paip.提升稳定性---c3p0数据库连接池不能取到连接An attempt by a client to checkout a Connection has timed out

    paip.提升稳定性---c3p0数据库连接池不能取到连接An attempt by a client to checkout a Connection has timed out 作者Attilax ...

  7. [原创]java WEB学习笔记80:Hibernate学习之路--- hibernate配置文件:JDBC 连接属性,C3P0 数据库连接池属性等

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. c3p0数据库连接池(作用不重复)

    /* * c3p0数据库连接池: * 只被初始化一次 * connection对象进行close时,不是正的关闭,而是将该数据连接归还给数据库连接池 * * */ 四个架包 mysql-connect ...

  9. springboot 使用c3p0数据库连接池

    springboot 使用c3p0数据库连接池的方法  本文转自:http://www.cnblogs.com/xiaosiyuan/p/6255292.html 使用springboot开发时,默认 ...

随机推荐

  1. Qt Framework 问题之 framework/Versions/A:bundle format unrecognized, invalid, or unsuitable

    在解决标题提到的问题之后,先来介绍下Qt Framework一些基本知识. 基于QT的Mac端工程,在打包时需要对所有需要嵌入到APP的framework及dylib文件进行手动签名处理. 一.签名处 ...

  2. 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...

  3. 读取JDK API文档,并根据单词出现频率排序

    1,拿到 API 文档 登录 https://docs.oracle.com/javase/8/docs/api/ , 选中特定的类,然后 copy 其中的内容, 放入 TXT 文件中 , 2,读取T ...

  4. spring boot集成shiro-redis时,分布式根据seesionId获取session报错排查总结

    昨天在集成shiro-redis的时候,使用sessionId在其他微服务获取用户的session时,发生错误:There is no session with id [xxx]. 查遍了所有资料,基 ...

  5. Nethunter开启ssh服务

    ### 本节用来纪念我和我的Nethunter SSH服务的血泪史 刚安装好Nethunter后,手机的各种功能也是令我眼花缭乱,对手机是爱不释手,可是,手机开启ssh服务之后,电脑无法连接,这就很尴 ...

  6. vue动态样式设置

    思路: 通过 v-bind:class="true ? style1 : style2 " 配合三元表达式完成样式的切换 具体实现 //return设置控制的参数 //有多个需要样 ...

  7. 浅谈Linux中的各种锁及其基本原理

    本文首发于:https://mp.weixin.qq.com/s/Ahb4QOnxvb2RpCJ3o7RNwg 微信公众号:后端技术指南针 0.概述 通过本文将了解到如下内容: Linux系统的并行性 ...

  8. sqlalchemy 源码分析之create_engine引擎的创建

    引擎是sqlalchemy的核心,不管是 sql core 还是orm的使用都需要依赖引擎的创建,为此我们研究下,引擎是如何创建的. from sqlalchemy import create_eng ...

  9. C#学习笔记04--排序/查找/二维数组/交叉数组

    一. 冒泡排序(重点) 思路:  每次比较把较小的放在前面, 大的放到后面; 图解:下图是最坏情况下的排序 ` 冒泡排序m个元素, 就有(m-1)趟排序, 第一趟m-1次, 第二趟 m-2次....  ...

  10. AI手写输入法 - pytorch从入门到入道(二)

    本章承接上一篇的手写数字识别,利用训练好的模型,结合pyqt画板,实现简易手写输入法,为"hello world"例子增添乐趣. pyqt是开发图形界面的框架,可以百度查找相关资料 ...