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

歡迎訪問 生活随笔!

生活随笔

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

数据库

JDBC(11)—数据库连接池

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

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

    /*** 10.使用數(shù)據(jù)庫連接池創(chuàng)建連接*一個連接池只需要創(chuàng)建一次就行,所以連接池的代碼需要使用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! --><!-- 指定數(shù)據(jù)源的基本屬性 --> <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><!-- 初始化數(shù)據(jù)庫連接池數(shù)量 --><property name="initialPoolSize">5</property> <!-- 若連接池中連接不足時,一次向數(shù)據(jù)庫服務器申請多少個連接數(shù) --><property name="acquireIncrement">5</property> <!-- 數(shù)據(jù)庫連接池中最小連接數(shù) --><property name="minPoolSize">5</property> <!-- 數(shù)據(jù)庫連接池中最大連接數(shù) --><property name="maxPoolSize">100</property> <!-- C3P0數(shù)據(jù)庫連接池中可以維護的Statement的個數(shù)--><property name="maxStatements">10</property> <!-- 每個連接同時可以使用Statement對象的個數(shù) --><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.創(chuàng)建DataSource數(shù)據(jù)源實例final BasicDataSource dataSource = new BasicDataSource();System.out.println(dataSource);//org.apache.commons.dbcp2.BasicDataSource@740545a6//2.為數(shù)據(jù)源實例指定必須的屬性dataSource.setUsername("root");dataSource.setPassword("");dataSource.setUrl("jdbc:mysql:///test");dataSource.setDriverClassName("com.mysql.jdbc.Driver");//3.為數(shù)據(jù)源實例指定非必須的屬性//——①指定數(shù)據(jù)庫連接池中初始化連接數(shù)dataSource.setInitialSize(5);//——②指定最大連接數(shù):同一時刻可以向數(shù)據(jù)庫請求的連接數(shù)dataSource.setMaxTotal(5);//——③指定最小連接數(shù):在數(shù)據(jù)庫連接池中保存的最少的空閑連接數(shù)量dataSource.setMinIdle(2);//——④等待連接池陪分配連接的最長的等待時間,單位毫秒,超出該時間報異常dataSource.setMaxWaitMillis(1000 * 5);//4.從數(shù)據(jù)源中獲取連接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.修改以上方法,使用配置文件創(chuàng)建連接池* 步驟:* ①加載dbcp的配置文件* ②調(diào)用BasicDataSourceFactory的createDataSource方法創(chuàng)建DataSource實例* ③DataSource中獲取數(shù)據(jù)庫連接* @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());//因為最大連接數(shù)是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.修改,以上方法,使用配置文件的形式,創(chuàng)建連接池* @throws SQLException * 步驟:* 1.創(chuàng)建c3p0-config.xml配置文件* 2.創(chuàng)建CombPooledDataSource實例* DataSource dataSource = new ComboPooledDataSource("helloC3P0");* 3.從dataSource中獲取連接*/@Testpublic void testC3P0WithConfigFile() throws SQLException{DataSource dataSource = new ComboPooledDataSource("helloC3P0");System.out.println(dataSource.getConnection());}/*** 測試TestTools工具類中使用連接池創(chuàng)建連接*/@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)—数据库连接池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。