第三方连接池
1 連接池的概念和作用
問題:連接池的本質是什么?有什么作用?
- 概念:連接池的本質就是一個容器,該容器中會初始化一些Connection對象,我們程序只需要從連接池中獲取連接,使用完畢之后歸還連接即可。
- 作用:大大減少了頻繁的創建和釋放連接的時間,提高數據庫操作的效率
2.c3p0連接池[用的不多]
【1】使用步驟
【前提】導入c3p0依賴jar包[以及連接mysql-connector-java-5.1.47.jar]
c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar
【第一步】將c3p0-config.xml配置文件復制到src中(位置和名稱是固定的)
【第二步】創建ComboPooledDataSource核心對象
【第三步】獲取連接
- c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar資源下載
【2】src目錄下的屬性配置文件寫法
注意:如果兩種配置文件都存在,優先使用xml配置文件。
<1>用c3p0-config.xml配置
c3p0-config.xml的配置文件的名稱和位置是固定的,配置文件放在src目錄中,配置文件中的屬性名也是固定的,否則無法根據屬性名或者對應的屬性值。
<c3p0-config><!-- 使用默認的配置讀取連接池對象 --><default-config><!-- 連接參數 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</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="oracle"> <!-- 連接參數 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/db15</property><property name="user">root</property><property name="password">itheima</property><!-- 連接池參數 --><property name="initialPoolSize">5</property><property name="maxPoolSize">8</property><property name="checkoutTimeout">1000</property></named-config></c3p0-config><2>用c3p0.properties配置
屬性文件的名稱必須是c3p0.properties,必須放在src路徑下,文件中的key是固定的,必須以c3p0.開頭
【3】c3p0連接實現代碼
由于最大連接數為10,而又設置了1和10歸還連接,則i=1和10會重復使用,且不會超過上限等待超時
3.Druid連接池[常用]
【1】使用步驟
【前提】導入druid依賴jar包[以及連接mysql-connector-java-5.1.47.jar]
【第一步】在src編寫配置文件,名稱任意,一般叫做druid.properties
【第二步】使用Properties對象加載配置文件
【第三步】使用DruidDataSourceFactory工廠創建連接池對象
【第四步】獲取連接
druid-1.0.9.jar資源下載
【2】src目錄下的屬性配置文件內容
#key是固定的,value根據實際情況修改 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbc username=root password=123456 # 初始化連接數量 initialSize=5 # 最大連接數 maxActive=10 # 等待超時時間 maxWait=3000在src編寫配置文件,名稱任意,一般叫做druid.properties
【3】druid連接操縱數據庫實現代碼
import com.alibaba.druid.pool.DruidDataSourceFactory; import com.itheima.domain.Student; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Properties;public class DruidDemo1 {public static void main(String[] args) throws Exception {//方式一:通過DruidDataSourceFactory對象創建連接池對象//1.通過Properties集合,加載druid.properties配置文件Properties properties = new Properties();//通過累加器獲取類路徑下(src)的文件輸入流InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(is);//2.通過Druid連接池工廠類獲取數據庫連接池對象DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);//3.通過連接池對象獲取數據庫連接進行使用Connection conn = dataSource.getConnection();System.out.println(conn);/* //方式二:直接new DruidDataSource連接池對象,硬編碼。[了解]//創建連接池對象DruidDataSource dataSource = new DruidDataSource();//設置參數dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/jdbc");dataSource.setUsername("root");dataSource.setPassword("123456");//獲取連接DruidPooledConnection conn = dataSource.getConnection();*///4.執行sql語句,接收結果集ArrayList<Student> list = new ArrayList<>();//獲取執行對象PreparedStatement pstm = conn.prepareStatement("select * from student");//執行操作,獲取結果ResultSet rs = pstm.executeQuery();//處理結果while (rs.next()) {int sid = rs.getInt("sid");String name = rs.getString("name");int age = rs.getInt("age");String birthday = rs.getString("birthday");//封住到list集合Student stu = new Student(sid, name, age, birthday);list.add(stu);}list.forEach(student -> System.out.println(student));rs.close();conn.close();//如果連接對象是從連接池中獲取的,那么連接的close方法就不是關閉而是歸還。pstm.close();} }打印結果: ------------------------------------------------------------------------------------------ com.mysql.jdbc.JDBC4Connection@551bdc27 Student{sid=1, name='張三', age=23, birthday='1999-09-23'} Student{sid=2, name='李四', age=24, birthday='1998-08-10'} Student{sid=3, name='王五', age=25, birthday='1996-06-06'} Student{sid=4, name='趙六', age=26, birthday='1994-10-20'}4連接池工具類的書寫
目的:將DruidDataSource連接池封裝進來,對外提供獲取連接和釋放資源的代碼
/* 目的:將DruidDataSource連接池封裝進來,對外提供獲取連接和釋放資源的代碼 */ public class DruidDataSource {private static DataSource dataSource;static {try {//1.加載druid.properties屬性文件(一次)Properties properties = new Properties();InputStream is = DruidDataSource.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(is);//2.創建DruidDataSource連接池對象(一次)dataSource = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//3.對外提供獲取連接池的方法public static DataSource getDataSource(){return dataSource;}//4.對外提供一個方法,獲取連接public static Connection getConnection() throws SQLException{return dataSource.getConnection();}//5.對外提供一個方法釋放資源,同時規劃連接public static void close(Connection conn, Statement stat, ResultSet rs){try {if (rs != null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}try {if (rs != null) {stat.close();}} catch (SQLException e) {e.printStackTrace();}try {if (rs != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}} }druid獲取連接測試代碼
import com.itheima.domain.Student; import com.itheima.utils.DruidDataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList;public class DruidDemo2 {public static void main(String[] args) throws Exception {Connection conn = DruidDataSource.getConnection();//4.執行sql語句,接收結果集ArrayList<Student> list = new ArrayList<>();//獲取執行對象PreparedStatement pstm = conn.prepareStatement("select * from student");//執行操作,獲取結果ResultSet rs = pstm.executeQuery();//處理結果while (rs.next()) {int sid = rs.getInt("sid");String name = rs.getString("name");int age = rs.getInt("age");String birthday = rs.getString("birthday");//封住到list集合Student stu = new Student(sid, name, age, birthday);list.add(stu);}list.forEach(student -> System.out.println(student));//如果連接對象是從連接池中獲取的,那么連接的close方法就不是關閉而是歸還。DruidDataSource.close(conn,pstm,rs);} }打印結果: ------------------------------------------------------------------------------------------ com.mysql.jdbc.JDBC4Connection@58fdd99 Student{sid=1, name='張三', age=23, birthday='1999-09-23'} Student{sid=2, name='李四', age=24, birthday='1998-08-10'} Student{sid=3, name='王五', age=25, birthday='1996-06-06'} Student{sid=4, name='趙六', age=26, birthday='1994-10-20'}總結
- 上一篇: 书写JDBC工具类
- 下一篇: Http协议的请求和响应