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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

框架前奏二

發(fā)布時(shí)間:2024/1/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 框架前奏二 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

5.數(shù)據(jù)連接方式解耦

5.1 BaseDao的問題

BaseDao這個(gè)JAVA類,包含如下java代碼,與mysql數(shù)據(jù)庫進(jìn)行鏈接。

當(dāng)我們的項(xiàng)目部署到客戶服務(wù)器上的時(shí)候,客戶的user,password,news(dbname)有變化,可能也有多次更改,不可能由程序員再多次更改我們的java代碼。這是不合理的。怎么辦?

思路:

? 將這些需要配置的內(nèi)容,放置到外部的配置文件

static String driver="com.mysql.cj.jdbc.Driver";static String url="jdbc:mysql://localhost:3306/news?useTimezone=true&serverTimezone=CTT&useUnicode=true&characterEncoding=utf8&useSSL=false";static String user="root";static String password="root";

5.2 使用外部的db.properties文件

在src下根目錄下,建立db.properties文件,這種文件和xml文件不同,里面放置的是key=value,格式的字符串

driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/news? useTimezone=true&serverTimezone=CTT&useUnicode=true&characterEncoding=utf8&useSSL=false user=root password=root

5.3 使用Properties類

我們這時(shí)候,已經(jīng)使用了外部的配置文件,讀取這個(gè)外部的配置文件。

Properties(Java.util.Properties),該類主要用于讀取Java的配置文件,不同的編程語言有自己所支持的配置文件,配置文件中很多變量是經(jīng)常改變的,為了方便用戶的配置,能讓用戶夠脫離程序本身去修改相關(guān)的變量設(shè)置。就像在Java中,其配置文件常為.properties文件,是以鍵值對的形式進(jìn)行參數(shù)配置的。

//讀取外部的配置文件,直接寫,使用類加載機(jī)制,讀取;將讀取的文件,轉(zhuǎn)換為輸入字節(jié)流對象 InputStream is=BaseDaoTwo.class.getClassLoader().getResourceAsStream("db.properties");

load(InputStream inStream) 從輸入字節(jié)流中讀取屬性列表(鍵和元素對)。

getProperty(String key) 在此屬性列表中搜索具有指定鍵的屬性。

static Properties properties=new Properties();//讀取外部的配置文件,直接寫,使用類加載機(jī)制,讀取;將讀取的文件,轉(zhuǎn)換為輸入字節(jié)流對象static InputStream is=BaseDaoTwo.class.getClassLoader().getResourceAsStream("db.properties");//如何讀取,讀取外部4個(gè)key//定義四個(gè)靜態(tài)的String變量;static String driver,url,user,password;//1.獲取公共的靜態(tài)連接資源;public static Connection getConn(){try {//加載到properties對象里面properties.load(is);//利用getProperty()得到key信息driver=properties.getProperty("driver");url=properties.getProperty("url");user=properties.getProperty("user");password=properties.getProperty("password");//加載驅(qū)動Class.forName(driver);//返回連接;conn= DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return conn;}

完畢之后,大家自行測試以下即可,發(fā)現(xiàn)可以實(shí)現(xiàn)與之前一樣的連接功能。

好處:

? 是將之前在BaseDao java類里面寫的數(shù)據(jù)庫連接代碼,配置信息,放到了外部文件。注意,以后,配置文件基本上都會存儲數(shù)據(jù)庫配置信息。

6.連接池技術(shù)

6.1什么情況下使用連接池?

? 對于一個(gè)簡單的數(shù)據(jù)庫應(yīng)用,由于對于數(shù)據(jù)庫的訪問不是很頻繁。這時(shí)可以簡單地在需要訪問數(shù)據(jù)庫時(shí),就新創(chuàng)建一個(gè)連接,用完后就關(guān)閉它,這樣做也不會帶來什么明顯的性能上的開銷。如果程序出現(xiàn)異常而未能關(guān)閉,將會導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將導(dǎo)致重啟數(shù)據(jù)庫。

? 但是對于一個(gè)復(fù)雜的數(shù)據(jù)庫應(yīng)用,有若干個(gè)數(shù)據(jù)庫連接,比如說10000個(gè),情況就完全不同了。數(shù)據(jù)庫連接頻繁的建立、關(guān)閉連接,會極大的減低系統(tǒng)的性能,因?yàn)閷τ谶B接的使用成了系統(tǒng)性能的瓶頸。連接過多,也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰。

6.2連接池的思想

為解決傳統(tǒng)開發(fā)中的數(shù)據(jù)庫連接問題,可以采用數(shù)據(jù)庫連接池技術(shù)。

數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。

數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個(gè)。

數(shù)據(jù)庫連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時(shí),這些請求將被加入到等待隊(duì)列中。

? 用戶每次請求都需要向數(shù)據(jù)庫獲得鏈接,而數(shù)據(jù)庫創(chuàng)建連接通常需要消耗相對較大的資源,創(chuàng)建時(shí)間也較長。假設(shè)網(wǎng)站一天10萬訪問量,數(shù)據(jù)庫服務(wù)器就需要創(chuàng)建10萬次連接,極大的浪費(fèi)數(shù)據(jù)庫的資源,并且極易造成數(shù)據(jù)庫服務(wù)器內(nèi)存溢出、拓機(jī)。如下圖所示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-lU2YuOky-1591174555879)(E:\政通路\課堂筆記\S2\Spring\assets\image-20200602094216914.png)]

? 數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點(diǎn)在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)的尤為突出.對數(shù)據(jù)庫連接的管理能顯著影響到整個(gè)應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo).數(shù)據(jù)庫連接池正式針對這個(gè)問題提出來的.數(shù)據(jù)庫連接池負(fù)責(zé)分配,管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個(gè)。如下圖所示:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Fr02X5Kf-1591174555883)(E:\政通路\課堂筆記\S2\Spring\assets\image-20200602094248738.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-c77wYKr5-1591174555894)(E:\政通路\課堂筆記\S2\Spring\assets\image-20200603160044219.png)]

數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設(shè)置要考慮到以下幾個(gè)因素:

  • 最小連接數(shù):是連接池一直保持的數(shù)據(jù)庫連接,所以如果應(yīng)用程序?qū)?shù)據(jù)庫連接的使用量不大,將會有大量的數(shù)據(jù)庫連接資源被浪費(fèi).
  • 最大連接數(shù):是連接池能申請的最大連接數(shù),如果數(shù)據(jù)庫連接請求超過次數(shù),后面的數(shù)據(jù)庫連接請求將被加入到等待隊(duì)列中,這會影響以后的數(shù)據(jù)庫操作
  • 如果最小連接數(shù)與最大連接數(shù)相差很大:那么最先連接請求將會獲利,之后超過最小連接數(shù)量的連接請求等價(jià)于建立一個(gè)新的數(shù)據(jù)庫連接.不過,這些大于最小連接數(shù)的數(shù)據(jù)庫連接在使用完不會馬上被釋放,他將被放到連接池中等待重復(fù)使用或是空間超時(shí)后被釋放.
  • 6.3數(shù)據(jù)庫連接池技術(shù)的優(yōu)點(diǎn)

    1.資源重用

    由于數(shù)據(jù)庫連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開銷。在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增加了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性。

    2.更快的系統(tǒng)反應(yīng)速度

    數(shù)據(jù)庫連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫連接置于連接池中備用。此時(shí)連接的初始化工作均已完成。對于業(yè)務(wù)請求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫連接初始化和釋放過程的時(shí)間開銷,從而減少了系統(tǒng)的響應(yīng)時(shí)間

    3.新的資源分配手段

    對于多應(yīng)用共享同一數(shù)據(jù)庫的系統(tǒng)而言,可在應(yīng)用層通過數(shù)據(jù)庫連接池的配置,實(shí)現(xiàn)某一應(yīng)用最大可用數(shù)據(jù)庫連接數(shù)的限制,避免某一應(yīng)用獨(dú)占所有的數(shù)據(jù)庫資源

    4.統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄露

    在較為完善的數(shù)據(jù)庫連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的占用超時(shí)設(shè)定,強(qiáng)制回收被占用連接,從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄露

    6.4連接池的實(shí)現(xiàn)

    c3p0 dhcp

    ? 數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。

    外部使用者可通過 getConnection 方法獲取連接,使用完畢后再通過 close 方法將連接返回,注意此時(shí)連接并沒有關(guān)閉,而是由連接池管理器回收,并為下一次使用做好準(zhǔn)備。

    ? Java 中有一個(gè) DataSource 接口, 數(shù)據(jù)庫連接池就是 DataSource 的一個(gè)實(shí)現(xiàn)。

    ? Druid(德魯伊)是阿里巴巴開發(fā)的號稱為監(jiān)控而生的數(shù)據(jù)庫連接池,Druid是目前最好的數(shù)據(jù)庫連接池。在功能、性能、擴(kuò)展性方面,都超過其他數(shù)據(jù)庫連接池,同時(shí)加入了日志監(jiān)控,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況。Druid已經(jīng)在阿里巴巴部署了超過600個(gè)應(yīng)用,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗(yàn)。

    屬性說明建議值
    url數(shù)據(jù)庫的jdbc連接地址。一般為連接oracle/mysql。示例如下:
    mysql : jdbc:mysql://ip:port/dbname?option1&option2&…
    oracle : jdbc:oracle:thin:@ip:port:oracle_sid
    username登錄數(shù)據(jù)庫的用戶名
    password登錄數(shù)據(jù)庫的用戶密碼
    initialSize啟動程序時(shí),在連接池中初始化多少個(gè)連接10-50已足夠
    maxActive連接池中最多支持多少個(gè)活動會話
    maxWait程序向連接池中請求連接時(shí),超過maxWait的值后,認(rèn)為本次請求失敗,即連接池100
    沒有可用連接,單位毫秒,設(shè)置-1時(shí)表示無限等待
    minEvictableIdleTimeMillis池中某個(gè)連接的空閑時(shí)長達(dá)到 N 毫秒后, 連接池在下次檢查空閑連接時(shí),將見說明部分
    回收該連接,要小于防火墻超時(shí)設(shè)置
    net.netfilter.nf_conntrack_tcp_timeout_established的設(shè)置
    timeBetweenEvictionRunsMillis檢查空閑連接的頻率,單位毫秒, 非正整數(shù)時(shí)表示不進(jìn)行檢查
    keepAlive程序沒有close連接且空閑時(shí)長超過 minEvictableIdleTimeMillis,則會執(zhí)true
    行validationQuery指定的SQL,以保證該程序連接不會池kill掉,其范圍不超
    過minIdle指定的連接個(gè)數(shù)。
    minIdle回收空閑連接時(shí),將保證至少有minIdle個(gè)連接.與initialSize相同
    removeAbandoned要求程序從池中g(shù)et到連接后, N 秒后必須close,否則druid 會強(qiáng)制回收該false,當(dāng)發(fā)現(xiàn)程序有未
    連接,不管該連接中是活動還是空閑, 以防止進(jìn)程不會進(jìn)行close而霸占連接。正常close連接時(shí)設(shè)置為true
    removeAbandonedTimeout設(shè)置druid 強(qiáng)制回收連接的時(shí)限,當(dāng)程序從池中g(shù)et到連接開始算起,超過此應(yīng)大于業(yè)務(wù)運(yùn)行最長時(shí)間
    值后,druid將強(qiáng)制回收該連接,單位秒。
    logAbandoned當(dāng)druid強(qiáng)制回收連接后,是否將stack trace 記錄到日志中true
    testWhileIdle當(dāng)程序請求連接,池在分配連接時(shí),是否先檢查該連接是否有效。(高效)true
    validationQuery檢查池中的連接是否仍可用的 SQL 語句,drui會連接到數(shù)據(jù)庫執(zhí)行該SQL, 如果
    正常返回,則表示連接可用,否則表示連接不可用
    testOnBorrow程序 申請 連接時(shí),進(jìn)行連接有效性檢查(低效,影響性能)false
    testOnReturn程序 返還 連接時(shí),進(jìn)行連接有效性檢查(低效,影響性能)false
    poolPreparedStatements緩存通過以下兩個(gè)方法發(fā)起的SQL:true
    public PreparedStatement prepareStatement(String sql)
    public PreparedStatement prepareStatement(String sql,
    int resultSetType, int resultSetConcurrency)
    maxPoolPrepareStatementPerConnectionSize每個(gè)連接最多緩存多少個(gè)SQL20
    filters這里配置的是插件,常用的插件有:stat,wall,slf4j
    監(jiān)控統(tǒng)計(jì): filter:stat
    日志監(jiān)控: filter:log4j 或者 slf4j
    防御SQL注入: filter:wall
    connectProperties連接屬性。比如設(shè)置一些連接池統(tǒng)計(jì)方面的配置。
    druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    比如設(shè)置一些數(shù)據(jù)庫連接屬性:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Io6LyXR2-1591174555899)(E:\政通路\課堂筆記\S2\Spring\assets\image-20200603161443399.png)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-7dEA2WjY-1591174555902)(E:\政通路\課堂筆記\S2\Spring\assets\image-20200603161646924.png)]

    步驟:

    1.在src下新建一個(gè)druid.properties 連接池配置文件

    driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/news?useTimezone=true&serverTimezone=CTT&useUnicode=true&characterEncoding=utf8&useSSL=false user=root password=root initialSize=5 maxActive=10

    |
    | | 比如設(shè)置一些數(shù)據(jù)庫連接屬性: | |

    [外鏈圖片轉(zhuǎn)存中…(img-Io6LyXR2-1591174555899)]

    [外鏈圖片轉(zhuǎn)存中…(img-7dEA2WjY-1591174555902)]

    步驟:

    1.在src下新建一個(gè)druid.properties 連接池配置文件

    driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/news?useTimezone=true&serverTimezone=CTT&useUnicode=true&characterEncoding=utf8&useSSL=false user=root password=root initialSize=5 maxActive=10
  • 總結(jié)

    以上是生活随笔為你收集整理的框架前奏二的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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