首页 > 数据库 >数据库连接池(C3P0)

数据库连接池(C3P0)

时间:2023-10-07 14:44:53浏览次数:31  
标签:数据库 resultSet C3P0 connection null 连接池

为什么要引入数据库连接池?

在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。 这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码并为该连接分配资源,而程序则要把代表连接Connection对象等加载到内存中,所以建立数据库连接的开销很大。尤其是在大量的并发访问时,频繁地创建、断开数据库 连接势必会影响数据库的访问效率,甚至导致数据库崩溃。

为了解决该类问题的发生诞生了数据库连接池技术。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是每次都重新建立连接。

本文主要介绍C3P0数据库连接池。

C3P0

C3P0是目前最流行的开源数据库连接池之一,它支持 JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和 Spring使用的数据源正是C3P0。

第一步:添加jar包

  • c3p0-0.9.1.2.jar

  • mysql-connector-java-5.0.8-bin.jar

第二步:在src下创建C3P0的配置文件c3p0-config.xml

  • <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
     <default-config>
       <property name="driverClass">com.mysql.jdbc.Driver</property>
       <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
       <property name="user">root</property>
       <property name="password">root</property>
       <property name="initialPoolSize">15</property>
       <property name="maxIdleTime">40</property>
       <property name="maxPoolSize">150</property>
       <property name="minPoolSize">20</property>
     </default-config>
    </c3p0-config>

    第三步:编写操作C3P0的工具类C3P0Util

  • package cn.com.demo8;

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import javax.sql.DataSource;
    import com.mchange.v2.c3p0.ComboPooledDataSource;

    public class C3P0Util {

    //创建数据库连接池
    private static DataSource dataSource = new ComboPooledDataSource();

    //创建连接
    public static Connection getConnection(){
    try {
    return dataSource.getConnection();
    } catch (SQLException e) {
    throw new RuntimeException("获取数据库连接失败");
    }
    }

    //释放连接
    public static void release(Connection connection, Statement statement, ResultSet resultSet) {
    if (resultSet != null) {
    try {
    resultSet.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    resultSet = null;
    }
    if (statement != null) {
    try {
    statement.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    statement = null;
    }
    if (connection != null) {
    try {
    connection.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    connection = null;
    }
    }
    }

第四步:使用C3P0

public class TestC3P0 {
public static void main(String[] args) {
TestC3P0 demo = new TestC3P0();
demo.testC3P0();
}

public void testC3P0() {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = C3P0Util.getConnection();
preparedStatement = connection.prepareStatement("SELECT * FROM student");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
Student student = new Student();
int id = resultSet.getInt("studentid");
String name = resultSet.getString("studentname");
student.setStudentID(id);
student.setStudentName(name);
System.out.println(student);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
C3P0Util.release(connection, preparedStatement, resultSet);
}

}

 

标签:数据库,resultSet,C3P0,connection,null,连接池
From: https://www.cnblogs.com/CHOSEN1Chen/p/17746243.html

相关文章

  • 数据库 "test1007" 的 创建 失败。其他信息: 执行 Transact-SQL 语句或批处理时发生
    问题描述在我使用sqlServer登录名和密码验证登录时,出现了创建数据库错误的信息;问题解决只需要在使用Windows身份验证进行登录后,在服务器角色里面找到dbeavor,然后将我们的登录名添加进去,保存之后,重新启动;之后再使用sqlServer验证登录连接之后,就能够建立好数据库啦!......
  • 一种对数据库友好的GUID的变种使用方法
    概述.NET生成的GUID唯一性很好,用之方便,但是,缺少像雪花算法那样的有序性。虽然分布式系统中做不到绝对的有序,但是,相对的有序对于目前数据库而言,索引效率等方面的提升还是有明显效果的(当然,我认为,这是数据库的问题,而非编程的问题,数据库应该处理好任何类型数据作为主键索引时的性能,除......
  • jdbc-批量插入mssql数据库-原
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassTest2{//staticintcount=......
  • 数据泵(impdb)导入Oracle分片的数据库dump文件
    数据泵(impdb)导入Oracle数据库一.sqlplus登录目标数据库,创建导入的目录路径#该目录要在导入的数据库本机建立,如果是docker就在容器内部创建createdirectorydata_diras'/home/oracle/prd_imp/prd_dump';data_dir为路径名称,可自命名。路径是导出的dmp文件存放的路径必须......
  • Oracle数据库升级PostgreSQL 后的踩坑记录(二)之date类型处理
    踩坑二:date类型处理背景:因为业务需求,需要整个项目除了适配oracle和mysql后还需要适配PostgreSQL,在此背景下就出现了一系列的问题。接系列一databaseId映射成oracle之后问题又随之而来,由于从oracle数据库的date类型映射成postgreSQL的timestamp字段又出现了一些查询报错的问题,我......
  • 服务器没有开放3306端口 远程访问MySQL数据库方法
    一、前言​当装有MySQL的服务器为了防止数据库被黑,提高安全性,把3306端口禁止掉,禁止对外访问,我之前写过一篇是借助跳板机的SSH隧道来访问实现安全,这种情况依然需要开放3306端口和使用一个额外的跳板机,比较麻烦,后来,突发奇想,直接使用MySQL所在服务器来做SSH隧道,并且使用localho......
  • 数据库表查看缺失的索引
    缺失索引就是帮你查找你的数据库缺少什么索引,告诉你那些字段需要加上索引,这样你就可以根据提示添加你数据库缺少的索引了 SELECTTOP10[TotalCost]=ROUND(avg_total_user_cost*avg_user_impact*(user_seeks+user_scans),0),avg_user_impact,TableName=st......
  • 关系型数据库和非关系型数据库的区别
    关系型数据库(RelationalDatabase)和非关系型数据库(NoSQLDatabase)是两种不同的数据库管理系统。关系型数据库是基于关系模型的数据库,使用表格(表)来组织和存储数据。数据在表中以行和列的形式进行存储,每个表都有一个唯一的键(主键)来标识每一行数据。关系型数据库使用结构化查询语言(S......
  • 一种对数据库友好的GUID的变种使用方法
    概述.NET生成的GUID唯一性很好,用之方便,但是,缺少像雪花算法那样的有序性。虽然分布式系统中做不到绝对的有序,但是,相对的有序对于目前数据库而言,索引效率等方面的提升还是有明显效果的(当然,我认为,这是数据库的问题,而非编程的问题,数据库应该处理好任何类型数据作为主键索引时的性能,......
  • MySQL数据库
    1.事物的四大特性和隔离级别原子性:不可分割的操作单元,要么全部成功,要么回滚。一致性:如果执行事物之前数据库是一致的,那么执行后还是一致的。隔离性:事物操作之间彼此独立和透明,互不影响。持久性:事物一旦提交,其结果就是永久的。未提交读:允许脏读,其他事物只要修改了数据,即使未提交,......