注:本实验是在maven工程下配置pom.xml文件导入jar包
-
概念
数据库连接池:其实就是一个容器(集合),存放数据库连接的容器
当系统初始化好之后,容器就被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
-
好处
- 节约资源
- 用户访问更高效
-
DataSource接口认知
- javax.sql.DataSource
- 该接口没有具体的实现类,而是在使用过程中由驱动程序供应商实现接口
DataSource 接口由驱动程序供应商实现。共有三种类型的实现 1. 基本实现 - 生成标准的 Connection 对象 2. 连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。 3. 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。 4. 接口的方法(获取连接) Connection getConnection() 尝试建立与此 DataSource 对象所表示的数据源的连接。 Connection getConnection(String username, String password) 尝试建立与此 DataSource 对象所表示的数据源的连接。 5. 归还链接:如果连接对象connection是从连接池中获取的,那么调用Connection.close()方法,则不会关闭连接了,而是归还连接给连接池。
- C3P0数据库连接池技术
使用步骤:
- 导入c3p0依赖
<dependencies>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId><!-- c3p0所依赖的jar包 -->
<version>0.2.12</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId> <!-- 必要依赖 -->
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <!-- 必要依赖 -->
<version>5.1.6</version>
<scope>runtime</scope> <!-- 只在运行时生效 -->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
创建c3p0-config.xml配置文件
注:c3p0-config.xml必须放在resources目录下,以遵循maven工程目录要求
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/xskc</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property><!-- 初始池中连接数量 -->
<property name="maxPoolSize">10</property><!-- 最大连接数量,超过此数量会报错 -->
<property name="checkoutTimeout">3000</property><!-- 超时时间 -->
</default-config>
<named-config name="anotherc3p0"><!-- 指定名称的配置,可以在DataSource中指定名称调用此配置,而不再使用默认配置 -->
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/xskc</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
使用C3P0连接池
package zhi.itlearn; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class C3P0Utils { public static void main(String[] args) throws SQLException { //创建数据库连接池对象 DataSource ds = new ComboPooledDataSource(); //使用anotherc3p0连接池配置 //DataSource ds2 = new ComboPooledDataSource("anotherc3p0"); //获取连接对象 Connection connection = ds.getConnection(); //打印connection,测试是否有拿到连接对象 System.out.println(connection); } }
- Durid数据库连接池技术
Durid:数据库连接池实现技术,由阿里巴巴提供
- 使用步骤
- 导入jar包依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.4</version> </dependency>
- 定义配置文件(使用properties配置文件)
注意:properties配置文件可以是任意名称,不过需要放在resources文件夹下。
在此命名为:druid-config.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/xskc username=root password=root initialSize=5 maxActive=10 maxWait=3000
- 获取数据库连接池对象,获取Connection连接:通过DruidDataSourceFactory类
package zhi.itlearn; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; public class DuridDemo { public static void main(String[] args) throws Exception { //加载配置文件 Properties pro = new Properties(); //通过类加载器获取资源文件,并返回字节流 InputStream asStream = DuridDemo.class.getClassLoader().getResourceAsStream("duril-config.properties"); //加载字节流 pro.load(asStream); //获取连接池对象:通过DruidDataSourceFactory类 DataSource source = DruidDataSourceFactory.createDataSource(pro); //获取连接 Connection connection = source.getConnection(); System.out.println(connection); } }
- 定义Druid工具类:JDBCUtils.class
package zhi.itlearn; 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 { try { //加载配置文件 Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("duril-config.properties")); //获得DataSource连接池对象 ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static DataSource getDateSource(){ return ds; } public static Connection getConnection() throws SQLException { return ds.getConnection(); } public static void close(Statement stat,Connection conn){ close(null,stat,conn); } public static void close(ResultSet rs, Statement stat, Connection conn){ if (rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stat!=null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try { conn.close(); //归还连接 } catch (SQLException e) { e.printStackTrace(); } } } }
- 测试JDBCUtils工具类
package zhi.itlearn; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JDBCUtilsTest { public static void main(String[] args) throws SQLException { Connection connection = JDBCUtils.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM student WHERE sage = 19"); ResultSet set = statement.executeQuery(); while(set.next()){ System.out.println(set.getString("sname")); } JDBCUtils.close(set,statement,connection); } }