数据连接池详解
简述
数据库连接池本质就是一个容器,存放数据库连接的容器。当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后会将连接对象归还给容器。使用数据库连接池会节省资源,用户访问也会更加高效。在javax.sql包下有一个DataSource接口哦,各厂商可以实现该接口提供各自的数据库连接池。常用的数据库连接池有C3P0和Druid,顺便一提C3P0名字的由来是星球大战的一个机器人的名字,Druid德鲁伊数据库连接池是由阿里提供的,号称是世界上最好的连接池。
C3P0详解
使用C3P0之前必须导入它的jar包,或者在maven中添加c3p0的依赖
<dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency>
若手动导入jar包,我们必须导入c3p0-xxx.jar 和mchange-common-java-xxx.jar两个jar包
然后我们必须定义数据库连接池的配置文件,我们必须在classpath路径下定义配置文件c3p0.properties或者c3p0-config.xml
<c3p0-config> <default-config> <!--连接参数--> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property> <property name="user">root</property> <property name="password">123456</property> <!--连接池参数--> <property name="initialPoolSize">5</property> <property name="maxPoolSize">10</property> <property name="checkoutTimeout">3000</property> </default-config> <named-config name="otherc3p0"> <!--连接参数--> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property> <property name="user">root</property> <property name="password">123456</property> <!--连接池参数--> <property name="initialPoolSize">5</property> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">3000</property> </named-config> </c3p0-config>
连接池就是用来获取连接的,所以我们可以创建连接池对象,然后从连接池对象处获取连接
public static void main(String[] args) throws Exception{ //1.创建数据库连接池对象 DataSource ds = new ComboPooledDataSource(); //2.获取连接对象 Connection connection = ds.getConnection(); }
需要注意的是,使用连接池获取的连接close会归还连接到连接池中。
在ComboPooledDataSource()中可以写一个string参数,可以选择xml配置的不同连接配置
Druid详解
使用德鲁伊连接池也需要导入jar包,druid-xxx.jar
然后需要在类路径新建任意名称的properties或xml
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
username = root
password = 123456
initialSize = 5
maxActive = 10
maxWait = 3000
德鲁伊数据库连接池是通过一个工厂类来获取的,然后获取到连接池后才可以获取连接
public static void main(String[] args) throws Exception{ //1.加载配置文件 Properties properties = new Properties(); InputStream is = demo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(is); //2.获取连接池对象 DataSource ds = DruidDataSourceFactory.createDataSource(properties); //3.获取连接 Connection connection = ds.getConnection(); System.out.println(connection); }
使用连接池一般我们会搭配自己写的数据库工具类来使用
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCUtils { private static DataSource ds; static {//使用静态代码块完成DataSource的赋值操作 try { Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void close(Statement stmt,Connection conn){ close(null,stmt,conn); } public static void close(ResultSet resultSet,Statement stmt, Connection conn){ try { if(stmt!=null){ stmt.close(); } if(conn!=null){ conn.close(); } if(resultSet!=null){ resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static DataSource getDataSource(){ return ds; } }
一点一点积累,一点一点蜕变!