日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

JDBC(11)—数据库连接池

發布時間:2024/4/17 数据库 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC(11)—数据库连接池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 在實際開發過程中,特別是在web應用系統中,如果程序直接訪問數據庫中的數據,每一次數據訪問請求丟必須經歷建立數據庫連接、打開數據庫、存取數據和關閉數據庫連接。而連接并打開數據庫是一件既消費資源又費時的工作,如果頻繁發生這種操作,系統的性能必然會急劇下降,甚至會導致系統崩潰。數據庫連接池技術就是解決這個問題的常用方法。
  • 基本思想:
    • 為數據庫連接建立一個“緩沖池”,預先在緩沖池中放入一定量的連接,當需要建立數據庫連接時,只需從緩沖池中取出一個,使用
      *完畢之后再放回去。
  • 數據庫連接池負責:
    • 分配、管理、釋放連接,它允許應用程序重復使用一個現有的鏈接,而不是重新建立一個。
    • 4.最大最小連接數
    • 數據庫連接池在初始化時將創建一定數量的數據庫鏈接放到連接池中,這些數據庫連接數量由最小數據庫連接數來設定無論這些;連接
      *是否被使用,連接池都將保證至少擁有這么多的連接數,連接池的最大數據庫連接數限定了這個連接池能占有的最大連接數,當應用程序
      *向連接池請求的連接超過最大連接數時這些請求就被加入到等待隊列中。
  • 優點:
    • ——資源重用
    • ——更快的系統反應速度
    • ——新的資源分配手段
    • ——統一的資源管理,避免數據庫連接的泄露
  • 兩種開源的數據庫連接池
    • JDBC數據庫連接池使用javax.sql.DataSource來表示,DataSource只是一個接口,該接口通常由服務器
      *(Weblogic、WebSphere、Tomcat)提供實現,也有一些開源組織提供實現
    • ——DBCP數據庫連接池
    • ——C3P0數據庫連接池
  • DataSource通常被稱為數據源,它包含連接池和連接池管理管理部分,通常習慣上把DataSource稱為連接池

    實例:
    jar包:commons-dbcp2-2.1.1.jar、c3p0-0.9.5.2.jar
    配置文件

    /*** 10.使用數據庫連接池創建連接*一個連接池只需要創建一次就行,所以連接池的代碼需要使用static */private static DataSource dataSource= null;static {dataSource = new ComboPooledDataSource("helloC3P0");}public static Connection getConnectionWithC3P0(){try {return dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}return null;} 文件名:c3p0-config.xml <c3p0-config><!-- This app is massive! --><!-- 指定數據源的基本屬性 --> <named-config name="helloC3P0"> <property name="user">root</property><property name="password"></property><property name="jdbcUrl">jdbc:mysql:///test</property><property name="driverClass">com.mysql.jdbc.Driver</property><!-- 初始化數據庫連接池數量 --><property name="initialPoolSize">5</property> <!-- 若連接池中連接不足時,一次向數據庫服務器申請多少個連接數 --><property name="acquireIncrement">5</property> <!-- 數據庫連接池中最小連接數 --><property name="minPoolSize">5</property> <!-- 數據庫連接池中最大連接數 --><property name="maxPoolSize">100</property> <!-- C3P0數據庫連接池中可以維護的Statement的個數--><property name="maxStatements">10</property> <!-- 每個連接同時可以使用Statement對象的個數 --><property name="maxStatementsPerConnection">5</property></named-config> </c3p0-config> public class ConnectionPool {/*** 1.使用DBCP連接池* @throws SQLException * dbcp包依賴pool包*/@Testpublic void testDBCP() throws SQLException{// dataSource = null;//1.創建DataSource數據源實例final BasicDataSource dataSource = new BasicDataSource();System.out.println(dataSource);//org.apache.commons.dbcp2.BasicDataSource@740545a6//2.為數據源實例指定必須的屬性dataSource.setUsername("root");dataSource.setPassword("");dataSource.setUrl("jdbc:mysql:///test");dataSource.setDriverClassName("com.mysql.jdbc.Driver");//3.為數據源實例指定非必須的屬性//——①指定數據庫連接池中初始化連接數dataSource.setInitialSize(5);//——②指定最大連接數:同一時刻可以向數據庫請求的連接數dataSource.setMaxTotal(5);//——③指定最小連接數:在數據庫連接池中保存的最少的空閑連接數量dataSource.setMinIdle(2);//——④等待連接池陪分配連接的最長的等待時間,單位毫秒,超出該時間報異常dataSource.setMaxWaitMillis(1000 * 5);//4.從數據源中獲取連接Connection conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());Connection connection = dataSource.getConnection();System.out.println("》"+conn.getClass());//使用多線程,主線程5個連接請求,另一個線程再請求一個連接new Thread(){public void run(){Connection conn = null;try {conn = dataSource.getConnection();System.out.println(conn.getClass());} catch (SQLException e) {e.printStackTrace();}};}.start();//主線程請求的連接等3秒之后釋放一個,try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//關閉一個連接釋放資源,connection.close();}/*** 2.修改以上方法,使用配置文件創建連接池* 步驟:* ①加載dbcp的配置文件* ②調用BasicDataSourceFactory的createDataSource方法創建DataSource實例* ③DataSource中獲取數據庫連接* @throws IOException */@Testpublic void testDBCPWithDataSourceFactory() throws Exception{Properties properties = new Properties();InputStream inStream = ConnectionPool.class.getClassLoader().getResourceAsStream("dbcp.properties");properties.load(inStream);DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);System.out.println(dataSource);//org.apache.commons.dbcp2.BasicDataSource@2abbf6ed//獲取最大等待時間BasicDataSource basicDataSource = (BasicDataSource)dataSource;System.out.println("等待時間:"+basicDataSource.getMaxWaitMillis());//獲取連接Connection conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println("》"+conn.getClass());//因為最大連接數是5,所以該請求會放入到等待隊列中,等待時間為5秒,之后由于所有連接均未釋放,所以報錯conn = dataSource.getConnection();System.out.println(conn.getClass());}/*** 3.使用C3P0連接池* @throws PropertyVetoException * @throws SQLException * */@Testpublic void testC3P0() throws Exception{ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver cpds.setJdbcUrl( "jdbc:mysql:///test" ); cpds.setUser("root"); cpds.setPassword("");System.out.println(cpds.getConnection());}/*** 4.修改,以上方法,使用配置文件的形式,創建連接池* @throws SQLException * 步驟:* 1.創建c3p0-config.xml配置文件* 2.創建CombPooledDataSource實例* DataSource dataSource = new ComboPooledDataSource("helloC3P0");* 3.從dataSource中獲取連接*/@Testpublic void testC3P0WithConfigFile() throws SQLException{DataSource dataSource = new ComboPooledDataSource("helloC3P0");System.out.println(dataSource.getConnection());}/*** 測試TestTools工具類中使用連接池創建連接*/@Testpublic void testConnectionWithTestTools(){Connection conn = TestTools.getConnectionWithC3P0();System.out.println(conn);//對連接池中的連接進行關閉操作,并不是真的把連接關閉了,而是把連接歸還到連接池中去。TestTools.release(null, conn);}}

    轉載于:https://www.cnblogs.com/tengpengfei/p/10454011.html

    總結

    以上是生活随笔為你收集整理的JDBC(11)—数据库连接池的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。