SpringBoot基本配置詳解

SpringBoot項目有一些基本的配置,比如啟動圖案(banner),比如默認配置文件application.properties,以及相關的默認配置項。

示例項目代碼在:

一、啟動圖案banner

編寫banner.txt放入resources文件夾下,然後啟動項目即可修改默認圖案。

關於banner的生成,可以去一些專門的網站。

比如:https://www.bootschool.net/ascii

二、配置文件application

2.1 application.properties/yml

resources下通常會默認生成一個application.properties文件,這個文件包含了SpringBoot項目的全局配置文件。裏面的配置項通常是這樣的:

server.port=8080

在這個文件里我們可以添加框架支持的配置項,比如項目端口號、JDBC連接的數據源、日誌級別等等。

現在比較流行的是將properties文件改為yml文件。yml文件的格式yaml是這樣的:

server:
    port: 8080

yml和properties的作用是一樣的。而yml的好處是顯而易見的——更易寫易讀。

屬性之間互相調用使用${name}:

eknown:
    email: eknown@163.com
    uri: http://www.eknown.cn
    title: 'hello, link to ${eknown.uri} or email to ${eknown.email}'

鏈接:

2.2 多環境配置文件

通常開發一個應用會有多個環境,常見如dev/prod,也會有test,甚至其他一些自定義的環境,SpringBoot支持配置文件的靈活切換。

定義新配置文件需要遵循以下格式:application-{profile}.properties 或者application-{profile}.yml

比如現在有dev和prod兩個環境,我需要在application.yml文件之外新建兩個文件:

  1. application-dev.yml

    server:
       port: 8080
  2. application-prod.yml

    server:
      port: 8081

然後在application.yml中通過application.profiles.active={profile}指明啟用那個配置:

application:
    profiles:
      active: dev

除了在application.yml中指定配置文件外,還可以通過啟動命令指定:java -jar xxx.jar --spring.profiles.active=dev

2.2 自定義配置項並獲取它

主要介紹兩種方式,獲取單個配置項和獲取多個配置項。

舉例:

eknown:
    email: eknown@163.com
    uri: http://www.eknown.cn

2.2.1 使用@Value註解獲取單個配置項

@Value("${eknown.email}")
private String email;

@Value("${eknown.uri}")
private String url;

注意:使用@Value註解的時候,所在類必須被Spring容器管理,也就是被@Component、@Controller、@Service等註解定義的類。

2.2.2 獲取多個配置項

第一種,定義一個bean類,通過@Value獲取多個配置項:

@Component
public class MyConfigBean {
  
}

然後我們通過get方法來獲取這些值:

@RestController
public class BasicAction {
  
  @Autowired
  private MyConfigBean myConfigBean;

}

第二種,使用註解@ConfigurationProperties:

@Component
@ConfigurationProperties(perfix="eknown")
public class MyConfigBean {

  private String email;
  private String uri;
}

這裏只需要通過prefix指定前綴即可,後面的值自動匹配。

這裏我們還使用了@Component註解來讓spring容器管理這個MyConfigBean。

此外,我們可以不需要引入@Component,轉而在Application啟動類上加上@EnableConfigurationProperties({MyConfigBean.class})來啟動這個配置。

注意:我們這裡是從主配置文件,也就是SpringBoot默認的application-profile文件中獲取配置數據的。

而從自定義的配置文件,比如test.yml這種形式中獲取配置項時,情況是有點不大一樣的。

三、自定義配置文件

上面介紹的配置文件都是springboot默認的application開頭的文件。如果要自定義一個配置文件呢,比如test.yml或test.properties,怎麼獲取其中的配置項呢?

使用@PageResource註解即可。

首先我們來看一下讀取自定義的properties文件里的內容:

test.properties

hello.time=2019.11.19
hello.name=eknown

定義Configuration類:

@Configuration
@PropertySource("classpath:test.properties")
//@PropertySource("classpath:test.yml") // 注意,yml文件不能直接這樣寫,會讀不出數據
@ConfigurationProperties(prefix = "hello")
public class TestConfiguration {
    private String name;
    private String time;

    // hide get and set methods
}

測試一下:

@RestController
@RequestMapping(value = "test")
public class TestAction {

    @Autowired
    private TestConfiguration testConfiguration;

    @GetMapping(value = "config")
    public String test() {
        return testConfiguration.getName() + "<br/>" + testConfiguration.getTime();
    }
}

如果將properties文件換成yml文件呢?

我們嘗試一下,發現:

讀不出數據?

分析一下@PropertySource註解,發現其使用的PropertySourceFactory是DefaultPropertySourceFactory.

這個類的源碼如下:

public class DefaultPropertySourceFactory implements PropertySourceFactory {
    public DefaultPropertySourceFactory() {
    }

    public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
        return name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource);
    }
}

這個類只能處理properties文件,無法處理yml文件。所以我們需要自定義一個YmlSourceFactory。

public class YamlSourceFactory extends DefaultPropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        return new YamlPropertySourceLoader().load(resource.getResource().getFilename()
                , resource.getResource()).get(0);
    }
}

然後定義test.yml文件的config類:

@Configuration
@PropertySource(value = "classpath:test.yml", encoding = "utf-8", factory = YamlSourceFactory.class)
@ConfigurationProperties(prefix = "yml.hello")
public class TestYamlConfiguration {
    private String name;
    private String time;

    // hide get and set methods
}

注:為了區分test.properties和test.yml,這裏的test.yml中的屬性以yml.hello開頭。

編寫一下測試:

    @Autowired
    private TestYamlConfiguration ymlConfiguration;

    @GetMapping(value = "yml")
    public String testYml() {
        return "yml config: <br/>" + ymlConfiguration.getName() + "<br/>" + ymlConfiguration.getTime();
    }

訪問:

四、補充@ConfigurationProperties

網上一些資料中,為配合使用@ConfigurationProperties,還使用了@EnableConfigurationProperties註解。

經過測試發現:

  1. 從SpringBoot默認配置文件讀取配置信息,使用@ConfigurationProperties + @Component/@Configuration,或者@ConfigurationProperties + 在啟動類添加@EnableConfigurationProperties({class})。這兩種方式都能解決問題

  2. 從非默認配置文件讀取配置信息,需要利用@PropertySource註解。同樣兩種方式:

    2.1 @PropertySource + @ConfigurationProperties + @Component/@Configuration

    2.2 @PropertySource + @ConfigurationProperties + @Component/@Configuration + @EnableConfigurationProperties,第二種方式存在一個問題,即還是必須要使用@Component註解,如果不使用,則會導致讀取配置信息為null,但程序不會報錯;而如果採用了,則會導致bean類的set方法被執行兩次(也就是生成了兩個同樣類型的bean類)。這種方式不建議!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

日本伊方核電廠機組 法院裁定重啟運轉

摘錄自2018年9月25日中央社報導

日本伊方核電廠三號機組去年底被廣島高等法院做出假處分裁定而持續停止運轉,但四國電力公司提出異議要求撤銷假處分,廣島高院今天(25日)撤銷原裁定,三號機組可重啟運轉。

根據日本讀賣新聞、日本放送協會(NHK)及日本經濟新聞等報導,目前由民眾提出聲請禁止三號機組運轉的假處分,還有高松高等法院、大分地方法院及山口地方法院岩國支部等正在審理,其中大分地方法院將在28日做出裁定。

因此,廣島高院今天撤銷假處分裁定後,三號機組雖然暫時又可重啟運轉,但未來視其他法院裁定結果,仍存在立刻停止運轉的可能性。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

Google、福特、沃爾沃、Uber等合作建立自動駕駛汽車聯盟

日前,Google 已經與福特,沃爾沃,Uber和Lyft合作建立一個自動駕駛汽車聯盟,將與立法者,監管機構協調工作,讓自動駕駛汽車產生安全性和社會效益。

Google 和福特這兩大有影響力的公司走到一起,絕對是自動駕駛汽車行業一大利好消息,它們的結盟,將引起監管部門的注意。現在,自動駕駛汽車行業廠商有技術和原型,進行了無數的試駕,同時也拿出了實際的自動駕駛汽車車型,但是不健全的法律和法規限制了自動駕駛汽車上路。

如果自動駕駛汽車撞向一座建築物或其它車輛,誰應該負責?是坐在車裡的乘客還是自動駕駛汽車廠商?這些類型的問題將由聯盟將與政策制定者進行處理。目前領導該聯盟的是美國國家公路交通安全管理局前官員大衛•斯特裡克蘭。這樣聯盟就可以從監管的角度來看待問題。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

抽象工廠–設計模式

前面工廠方法模式中考慮的是一類產品的生產, 如畜牧場只管動物、電視機廠只產電視機等.

同種類稱為同等級, 也就是說,工廠方法模式只會考慮生產同等級的產品,但是在現實生活中許多工廠都是綜合性很強的,也會加大工廠的最大使用效率,能夠生產出多等級的產品. 畜牧場可以養動物,也可以養植物等.

本篇博客將講述抽象工廠方法模式.抽象工廠模式將考慮多等級的產品同時生產,將處於同一個具體工廠所生產的不同等級的產品作為一個產品族. 

模式的定義與特點

定義

是一種為訪問類創建一組相關或者相互依賴的接口,並且訪問類不需要制定所要的產品的具體類就可以得到同族不同等級的產品模式結構.

抽象工廠模式一般都是工廠模式的升級, 工廠模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品.

特點

使用抽象工廠模式一般要滿足如下條件.

  • 系統中有許多個產品族,每個具體工廠創建統一族但又屬於不同等級結構的產品.

抽象工廠有工廠模式的優點之外,還主要有以下優點:

  • 可在類的內部對產品族中相關聯的等級產品進行共同管理,並且不需要引入多個類來進行管理.
  • 當增加一個產品族時,不需要更改原來的代碼,滿足了開閉原則.

抽象工廠缺點:

  • 當產品族中需要增加新的產品時,所有的工廠類都需要更改

 

模式的結構和實現

抽象工廠和工廠方法一樣,都是由抽象工廠、具體工廠、抽象產品和具體產品4個要素組成,但是抽象工廠中方法個數有所不同,抽象的產品也會有不同.

結構:

模式的主要角色如下:

  1. 抽象工廠: 提供了創建產品的接口,包含了多個創建產品的方法,也可以創建多個不同等級的產品.
  2. 具體工廠: 實現抽象工廠的多個抽象方法, 完成具體產品的創建.
  3. 抽象產品: 定義了產品規範, 描述產品的主要特性和功能, 抽象工廠模式有多個的抽象產品.
  4. 具體產品: 實現了抽象產品定義的接口, 具體工廠來創建, 同具體工廠的關係是多對一.

結構圖如下:

模式的實現

上面的圖可發現,抽象工廠和工廠方法有些類似,不同的是產品種類不止一個, 所以創建產品方法也不止一個.

抽象工廠: 提供了產品的生產方法

interface AbstractFactory
{
    public Product1 newProduct1();
    public Product2 newProduct2();
}

具體工廠: 實現產品的生產

class ConcreteFactory1 implements AbstractFactory
{
    public Product1 newProduct1()
    {
        System.out.println("具體工廠 1 生成-->具體產品 11...");
        return new ConcreteProduct11();
    }
    public Product2 newProduct2()
    {
        System.out.println("具體工廠 1 生成-->具體產品 21...");
        return new ConcreteProduct21();
    }
}

 

模式應用實例 

[例1] 抽象工廠設計牧場類.

分析: 農場除了畜牧業可以養動物,也可以養植物,並且也可以種其他的.

抽象工廠模式設計兩個牧場, 一個農場用於養牛和種菜 ,一個用於養馬和種水果.

可以在兩個農場定義生成動物的方法和培養植物的算法.

設計如下結構圖:

代碼如下:

//抽象產品:動物類
interface Animal
{
    public void show();
}

//具體產品:馬類
class Horse implements Animal
{

    public void show()
    {
        jf.setVisible(true);
    }
}

//具體產品:牛類
class Cattle implements Animal
{
   
    public void show()
    {
        jf.setVisible(true);
    }
}

//抽象產品:植物類
interface Plant
{
    public void show();
}
//具體產品:水果類
class Fruitage implements Plant
{    
    public void show()
    {
        jf.setVisible(true);
    }
}
//具體產品:蔬菜類
class Vegetables implements Plant
{
    public void show()
    {
        jf.setVisible(true);
    }
}
//抽象工廠:農場類
interface Farm
{
    public Animal newAnimal();
    public Plant newPlant();
}
//具體工廠:農場類1
class SGfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新牛出生!");
        return new Cattle();
    }
    public Plant newPlant()
    {
        System.out.println("蔬菜長成!");
        return new Vegetables();
    }
}
//具體工廠:農場類2
class SRfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新馬出生!");
        return new Horse();
    }
    public Plant newPlant()
    {
        System.out.println("水果長成!");
        return new Fruitage();
    }
}

 

模式的應用場景

抽象工廠模式一般適用於如下場景:

  1. 當需要創建的對象是一系列的相互關聯或者依賴的產品族時. 例如工廠中的電視機,收音機以及空調等
  2. 系統有多個產品族, 但每次只使用其中的某一族產品時. 如有人只希望某種品牌的衣服和鞋子
  3. 系統提供了產品的類庫, 所有產品的接口都相同. 

模式的拓展:

  1. 當增加了一個新的產品族時只需要增加一個新的具體實現工廠,不需要更改原來的代碼,滿足了開閉原則
  2. 當產品族需要增加一個新種類的產品時, 所有的工廠類都需要更改,不符合開閉原則
  3. 當只存在了一個等級結構的產品時,也就退化到了工廠模式的結構.

 

以上就是抽象工廠的理論和實踐模式的內容,希望對大家有所幫助!!!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

二、netcore跨平台之 Linux部署nginx代理webapi

上一章,我們講了在linux上安裝netcore環境,以及讓netcore在linux上運行。

這一章我們開始講在linux上配置nginx,以及讓nginx反向代理我們的webapi。

什麼nginx???

Nginx(“engine x”)是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。

在高連接併發的情況下,Nginx是Apache服務器不錯的替代品,而且現在越來越多的公司都開始用nginx,學習nginx是程序員必不可少的一部分。

 

現實用xshell登錄到我們的linux系統中。

輸入如下命令

安裝編譯工具和對應的庫文件,輸入下面的命令,回車即可

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

如下圖示,就表示安裝好了。

 

 

接下來,我們正式安裝Nginx,我們這次選擇安裝1.6.2版本。

(1)下載nginx,輸入下面命令,回車即可。

wget http://nginx.org/download/nginx-1.6.2.tar.gz

nginx比較小,下載起來還是蠻快的,如下圖所示,表示下載完成。

 

 

 

 (2)解壓nginx壓縮包

tar zxvf nginx-1.6.2.tar.gz

(3)進入到nginx目錄中

cd nginx-1.6.2

(4)編譯和安裝,分別執行下面的命令

./configure --prefix=/usr/local/nginx
make

 

 

 (5)查看版本

/usr/local/nginx/sbin/nginx -v

看到下面這個表示成功了

(6)啟動nginx

 

/usr/local/nginx/sbin/nginx

然後在你的電腦上用瀏覽器訪問即可

注意這裏的默認監聽端口是80,所以輸入ip加上80端口即可

出現如下這種視圖就表示成功了。

 

 

 

 

接下來就是很關鍵的配置了,其實安裝還是很簡單的。

 進入到你的nginx的安裝目錄下

分別輸入如下命令,即可查看到您的配置信息

cd  /usr/local/nginx/conf
ll

 

編輯您的nginx.conf文件,我這裏用vim進行編輯

vim nginx.conf

出現如圖所示:

 我們主要看如下圖所示紅色標記的部分

 

 

listen:表示當前的代理服務器監聽的端口,默認的是監聽80端口。注意,如果配置了多個server,這個listen要配置不一樣。

server_name:表示監聽到之後需要轉到哪裡去,這時我們直接轉到本地,這時是直接到nginx文件夾內。

location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這裏

root:裏面配置了root這時表示當匹配這個請求的路徑時,將會在這個文件夾內尋找相應的文件,這裏對我們之後的靜態文件伺服很有用。

index:當沒有指定主頁時,默認會選擇這個指定的文件,它可以有多個,並按順序來加載,如果第一個不存在,則找第二個,依此類推。

然後我們把上面的location進行了修改

用鍵盤的上下左右鍵把光標移動到如下位置

 

然後輸入鍵盤的 i(鍵盤的字母i)進入到編輯模式(這裡是給不懂linux說的,懂得人請無視)

然後用鍵盤的退回 ←把這裏的都刪除

 

 然後在輸入  proxy_pass http://localhost:6666;(這裏接上一章已經配置好的netcore webapi)

 

 

 然後點擊鍵盤的ESC退出編輯狀態

然後輸入:wq退出並保存

:wq

 

 這樣就保存配置結束了,conf配置其實很複雜,網上有很多根據不同需求進行的配置

大家有興趣可以去看看,我這裏只說入門的部分,額,其實入門都算不上,能用就行,哈哈哈

最後執行下面兩個命令

這裡是檢查配置

/usr/local/nginx/sbin/nginx -t

 

 最後一個就是重啟運行nginx

/usr/local/nginx/sbin/nginx -s reload

 

 

哦,最後我們看看效果,額

這裏一定不要忘記啟動我的netcore程序了

輸入命令進入到我們的項目中

cd /root/netcore/

然後輸入啟動程序的命令

dotnet WebApiTest.dll

如下圖所示,就表示啟動成功了

 

 

 

 然後,我們用測試工具測試一下我們的接口

如圖所示,我們把以前的6666接口換成了80端口,這裏還是訪問成功了,這就表示我們的nginx代理成功了

 

 

 

 

 

到這裏就基本結束了,不過大家一定有個奇怪的地方每次啟動netcore,每次關了你的xshell后就不能訪問了,

這裏建議使用下面的命令,使之成為後台進程即可

nohup dotnet  WebApiTest.dll  &

over !!!!!!!!!!!!!!!!!!!!!!!!

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

老舊柴油車釀空污 德國將提因應計畫

摘錄自2018年10月2日中央社柏林報導

德國政府2日將針對車齡較老、污染較嚴重的柴油車的未來發展方向,向數以百萬計車主提出妥協方案,而汽車製造商可能因為廢氣排放造假醜聞引發危機,而面臨嚴苛責罰。

德國總理梅克爾(Angela Merkel)和主要部門首長商議至1日深夜後,她領導的保守派基民/基社聯盟(CDU/CSU)和中間偏左執政聯盟夥伴社會民主黨(SPD)公布了「潔淨空氣和確保我國都市機動性的概念」。這起柴油高峰會目的在於清除都市空汙,同時避免車主支出額外費用。

漢堡(Hamburg)和斯圖加特(Stuttgart)等主要城市的某些地區不歡迎老舊柴油車,法院也逐漸對其他地區祭出禁令。交通部長舒爾(Andreas Scheuer)在會議開始前告訴德新社(DPA),最重要的是,「我們希望避免進一步祭出駕駛禁令」。不過,汽車製造商可能面臨嚴峻懲罰,環境部長舒爾茨(Svenja Schulze)強調,是「汽車業把我們捲進麻煩中,應該為此付出代價」。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

打擊非法交易 緬甸公開銷毀走私象牙虎骨

摘錄自2018年10月4日中央社報導

路透社報導,緬甸當局4日銷毀查獲的數以百計象牙、穿山甲鱗片和其他動物部位,總重量超過1.4公噸,黑市價格達到130萬美元(約新台幣4000萬元),作為政府打擊非法走私野生生物的一環。

緬甸位於全球非法野生生物交易的心臟地帶,大部分走私品銷往中國。緬甸、寮國和泰國的交界地區,就是惡名昭彰的「金三角」(Golden Triangle)。

保育團體「拯救大象」(Save the Elephants)本週提出的報告指出,中國近來推出的象牙交易禁令,幾乎無法阻止緬甸與中國邊界城鎮勐拉(Mong La)的交易「大量成長」。過去3年來,勐拉鎮出售新的象牙產品增加60%。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

2019年11月20日開發手記

兩種運動檢測算法的介紹:

幀差法:

幀差法是目前運動目標檢測中最常用的算法。幀差法依據的原則是:當視頻中存在移動物體的時候,相鄰幀(或相鄰三幀)之間在灰度上會有差別,求取兩幀圖像灰度差的絕對值,則靜止的物體在差值圖像上表現出來全是0,而移動物體特別是移動物體的輪廓處由於存在灰度變化為非0,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。

二維頻域運動目標檢測:

通過對動態圖像的行列分解, 將三維頻域內的運動檢測問題轉化到兩組二維頻域內進行, 從而降低了濾波器設計的難度。給出了一種提取主運動能量的自適應濾波算法, 通過剔除背景和噪聲的頻率成分, 有效地檢測出運動目標。

 

複雜度分析:

針對幀差法進行分析,代碼複雜度主要集中在absdiff與findContours部分,其中absdiff的迭代次數為2*500*500=50000次,時間為88.46ms(取兩百幀計算平均的時間)

 

針對二維頻域運動目標檢測算法,這裡有兩個代碼版本:

針對py-new-fuliye.py,代碼的複雜度主要集中在兩個部分:傅里恭弘=叶 恭弘變換以及遍歷,在py-new-fuliye.py中,共使用了兩次傅里恭弘=叶 恭弘變換與兩次遍歷,遍歷的迭代次數次數為2*50*30=300次,時間為:54.175ms

 

針對pepoplefft.py(改進版)進行分析,使用了兩次傅里恭弘=叶 恭弘變換(一次正一次逆),進行了一次嵌套遍歷,遍歷次數為:50*10=500次,時間為:  ms

 

針對pepoplefft.py進行優化調參:

搜尋噪點:

要找到噪點,就要知道經傅里恭弘=叶 恭弘高通濾波變換后,剩餘的邊緣部分在數組中的表現規律,採用numpy繪圖表示出來:

 

經過閾值去噪后,效果如圖:

 

在隨後的視頻測試中發現其面對複雜環境表現仍不理想,此時考慮選擇繪製多個矩形來框選標記多個候選目標,暫時不考慮使用其他的濾波進行去噪,原因為1、會佔用原本就不多的處理時間,2、不認為在經過高通濾波后還未被濾掉的噪點會被其他濾波函數濾掉,目標被濾掉的可能性反而更大。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

Mysql備份還有這麼多套路,還不了解下?

邏輯備份和物理備份

邏輯備份

邏輯備份用於備份數據庫的結構(CREAET DATABASE、CREATE TABLE)和數據(INSERT),這種備份類型適合數據量小、跨SQL服務器、需要修改數據等場景。如mysqldump命令就是產生一個邏輯備份工具,使用mysqldump輸出的文件包含CREATE TABLEINSERT語句,能夠直接重建表內容和表結構。

使用邏輯備份有以下優勢和劣勢:

優勢
  • 可移植性高,SQL語句可直接適用於其他SQL服務器;
  • 在數據恢復之前可增加、修改數據;
  • 數據恢復粒度小可以是服務器、數據庫、表級別;
  • 使用文本格式,可讀性高;
劣勢
  • 備份時需要訪問mysql服務器,影響其他客戶端;
  • 需要將數據轉換成邏輯格式(SQL,CSV);
  • 如果命令運行在客戶端,mysql服務器還需要將數據發送給客戶端;
  • 因為輸出格式為文本文件,佔用空間較大;

物理備份

物理備份是包括存儲數據庫內容的目錄和文件的副本,這種類型的備份適用於需要在出現問題時快速恢復的大型重要數據庫。

優勢
  • 完整的Mysql文件和目錄備份,只需要複製文件不需要轉換,速度比邏輯備份更快;
  • 除了備份數據,還能備份配置文件和日誌文件;
  • 不需要運行Mysql服務器就可以完成備份;
  • 備份工具簡單使用cp、scp、tar命令即可完成備份;
劣勢
  • 可移植性不高,恢複數據只適用於相同或類似的機器上;
  • 為了保持數據庫文件的一致性,需要停機備份;
  • 恢復粒度不能按表或用戶恢復;

在線備份和離線備份

在線備份需要mysql服務器處理運行狀態,以便備份工具從mysql服務器中獲取數據。離線備份表示mysql服務器處理停止狀態。兩種備份形式也可以稱為“熱備份”和“冷備份“。

在線備份的主要特性

  • 備份不需要停機,對其他客戶端影響較小其他連接能夠正常訪問mysql服務器(依賴操作類型,如讀操作);
  • 備份需要加鎖,以免在備份期間對數據做出修改;

離線備份的主要特性

  • 備份期間服務器不可用;
  • 備份過程更簡單,不會受到客戶端的干擾;

邏輯備份(mysqldump使用)

mysqldump屬於邏輯備份命令,使用mysqldump備份的優勢是它非常方便和靈活,可以直接編輯輸出文件或者使用導入到其他的SQL服務器中去,但是它不能用作備份大量數據的快速解決方案,對於大數據量,即使備份花費的時候可以接受,但是恢複數據也可能會非常緩慢,因為執執行SQL語句會涉及磁盤I/O進行插入,創建索引等。mysqldump的使用方式非常簡單:

shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases

使用mysqldump備份時要注意:數據庫的一致狀態,在執行mysqldump命令時要保證數據不會再發生變更,保持數據的一致性有二種方法:

  • 使Mysql服務器只讀
  • 使用事務加上隔離級別:REPEATABLE READ

使用REPEATABLE READ事務隔離級別執行mysqldump命令(使用事務保持數據庫的一致狀態):

mysqldump --master-data=2 \
 --flush-logs  \
 --single-transaction  \
 --all-databases > /backup/`date +%F-%H`-mysql-all.sql  

備份參數說明:

  • –master-data: 將二進制日誌文件的名稱和位置備份
  • –flush-logs: 開始備份之前刷新mysql服務器日誌文件
  • –single-transaction:開始備份之前設置事務隔離級別為REPEATABLE READ然後發送一個START TRANSACTION命令。
  • –all-databases:備份所有數據庫

物理備份(複製原始文件)

為了保證複製文件的完整性,備份原始文件最好是停止mysql服務器,複製原始文件備份由以下步驟完成:

  1. 停止mysql服務器
    $ mysqladmin shutdown
  2. 使用合適的工具複製原始數據文件
    $ tar cf /tmp/dbbackup.tar ./data
  3. 備份完成后,運行mysql服務器
    $ mysqld_safe

使用主從備份模式

使用mysqldumptar備份或多或少都會對業務產生影響,使用mysqldump備份需要對數據加鎖,加鎖就意味着其他客戶端操作受到限制。使用tar命令需要停止服務器直接導致數據庫服務器不可用,有沒有辦法能解決這兩種問題呢?答案是有的,就是使用主從備份模式。

在單機的基礎上增加一台Slave機器對Master機器的數據進行同步:

開始備份時對Slave進行備份,這樣即使Slave停機或對數據加鎖也不會影響業務的正常使用,如果公司有條件或業務非常重要可以選擇這種方案來備份數據。

歡迎關注微信公眾號《架構文摘》,高質量技術文章第一時間推送。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

EFCore批量操作,你真的清楚嗎

背景

EntityFramework Core有許多新的特性,其中一個重要特性便是批量操作。

批量操作意味着不需要為每次Insert/Update/Delete操作發送單獨的命令,而是在一次SQL請求中發送批量組合指令。

EFCore批量操作實踐

批處理是期待已久的功能,社區多次提出要求。現在EFCore支持開箱即用確實很棒,可以提高應用程序的性能和速度。

P1 對比實踐

下面以常見的批量插入為例,使用SQL Server Profiler 觀察實際產生並執行的SQL語句。

 還有一種關注EFCore產生的sql語句的方式,添加Nlog支持,關注Microsoft.EntityFrameworkCore.Database.Command 日誌

<logger name=”Microsoft.EntityFrameworkCore.Database.Command” minlevel=”Debug” writeTo=”sql” />

定義插入模型Category, 插入4個實體,這裏為什麼強調4,請留意下文。

    public class Category
    {
        public int Id { get; set; }
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
    }

/*EFCore 查看模型屬性,有Id使用id作為主鍵,
沒有Id,搜索public "{TableName}Id"作為主鍵,默認為int形主鍵設置標記列自增;
*/ info: Microsoft.EntityFrameworkCore.Database.Command[20100]
      Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [Categories] (
          [Id] int NOT NULL IDENTITY,
          [CategoryID] int NOT NULL,
          [CategoryName] nvarchar(max) NULL,
          CONSTRAINT [PK_Categories] PRIMARY KEY ([Id])
      );

using (var db = new BloggingContext())
{
  db.Categories.Add(new Category() { CategoryID = 1, CategoryName = “Clothing” });
  db.Categories.Add(new Category() { CategoryID = 2, CategoryName = “Footwear” });
  db.Categories.Add(new Category() { CategoryID = 3, CategoryName = “Accessories” });
  db.Categories.Add(new Category() { CategoryID = 4, CategoryName = “Accessories” });
  db.SaveChanges();
} 

當執行SaveChanges(), 日誌显示:

info: Microsoft.EntityFrameworkCore.Database.Command[20100]
      Executing DbCommand [Parameters=[@p0='1', @p1='Clothing' (Size = 4000), @p2='2', @p3='Footwear' (Size = 4000), @p4='3', @p5='Accessories' (Size = 4000), @p6='4', @p7='Accessories' (Size = 4000)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      DECLARE @inserted0 TABLE ([Id] int, [_Position] [int]);
      MERGE [Categories] USING (
      VALUES (@p0, @p1, 0),
      (@p2, @p3, 1),
      (@p4, @p5, 2),
      (@p6, @p7, 3)) AS i ([CategoryID], [CategoryName], _Position) ON 1=0
      WHEN NOT MATCHED THEN
      INSERT ([CategoryID], [CategoryName])
      VALUES (i.[CategoryID], i.[CategoryName])
      OUTPUT INSERTED.[Id], i._Position
      INTO @inserted0;

      SELECT [t].[Id] FROM [Categories] t
      INNER JOIN @inserted0 i ON ([t].[Id] = [i].[Id])
      ORDER BY [i].[_Position];

從SQL Profiler追溯到的SQL:

exec sp_executesql N’SET NOCOUNT ON;
DECLARE @inserted0 TABLE ([Id] int, [_Position] [int]);
MERGE [Categories] USING (
VALUES (@p0, @p1, 0),
(@p2, @p3, 1),
(@p4, @p5, 2),
(@p6, @p7, 3)) AS i ([CategoryID], [CategoryName], _Position) ON 1=0
WHEN NOT MATCHED THEN
INSERT ([CategoryID], [CategoryName])
VALUES (i.[CategoryID], i.[CategoryName])
OUTPUT INSERTED.[Id], i._Position
INTO @inserted0;

SELECT [t].[Id] FROM [Categories] t
INNER JOIN @inserted0 i ON ([t].[Id] = [i].[Id])
ORDER BY [i].[_Position];

‘,N’@p0 int,@p1 nvarchar(4000),@p2 int,@p3 nvarchar(4000),@p4 int,@p5 nvarchar(4000),@p6 int,@p7 nvarchar(4000)’,@p0=1,@p1=N’Clothing’,@p2=2,@p3=N’Footwear’,@p4=3,@p5=N’Accessories’,@p6=4,@p7=N’Accessories’

 如你所見,批量插入沒有產生4個獨立的語句,而是被組合為一個傳參存儲過程腳本(用列值作為參數);如果使用EF6執行相同的代碼,則在SQL Server Profiler中將看到4個獨立的插入語句 。

① 就性能和速度而言,EFCore批量插入更具優勢。 ② 若數據庫是針對雲部署,EF6運行這些查詢,還將產生額外的流量成本。

 經過驗證:EFCore批量更新、批量刪除功能,EFCore均發出了使用sp_executesql存儲過程+批量參數構建的SQL腳本。

 P2 深入分析

起關鍵作用的 sp_executesql存儲過程: 可以多次執行的語句或批處理 (可帶參)

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
  
sp_executesql [ @stmt = ] statement  
[   
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }   
     { , [ @param1 = ] 'value1' [ ,...n ] }  
]  

注意官方限制: 

The amount of data that can be passed by using this method is limited by the number of parameters allowed. SQL Server procedures can have, at most, 2100 parameters. Server-side logic is required to assemble these individual values into a table variable or a temporary table for processing.       // SQL存儲過程最多可使用2100個參數

P3 豁然開朗

SqlServer  sp_executesql存儲過程最多支持2100個批量操作形成的列值參數,所以遇到很大數量的批量操作,EFCore SqlProvider會幫我們將批量操作分塊傳輸, 

實際上EFCore 對於少於4個的批量命令,不會使用sp_executesql 存儲過程,我這邊自己根據官方驗證確實如此:

估摸着EFCore使用sp_executesql 也是有點耗資源的,對於小批量(小於4條的批量操作)依舊是產生單條sql。

// 同時EFCore開放了【配置關係型數據庫批量操作大小】
protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder) { string sConnString
= @"Server=localhost;Database=EFSampleDB;Trusted_Connection=true;"; optionbuilder.UseSqlServer(sConnString , b => b.MaxBatchSize(1)); // 批量操作的SQL語句數量,也可設定為1禁用批量插入 }

總結

① EFCore 相比EF6,已經支持批量操作,能有效提高應用程序的性能

② EFCore的批量操作能力,由對應的DataBaseProvider支撐(Provider實現過程跟背後的存儲載體密切相關)

      –  對於小批量操作(當前EFCore默認MinBatchSize為4》),EFCore不會啟用sp_executesql

  - 大批量關注存儲過程sp_executesql ,存儲過程的列值參數最多2100 個,這個關鍵因素決定了在大批量操作的時候 依舊會被分塊傳輸。

③ 另外一個批量操作的方法,這裏也點一下:構造Rawsql【EFCore支持Rawsql】。

  sqlite不支持存儲過程,為完成批量插入提高性能,可採用此方案。

var insertStr = new StringBuilder();
insertStr.AppendLine("insert into ProfileUsageCounters (profileid,datetime,quota,usage,natureusage) values");
var txt = insertStr.AppendLine(string.Join(',', usgaeEntities.ToList().Select(x =>
{
       return $"({x.ProfileId},{x.DateTime},{x.Quota},{x.Usage},{x.NatureUsage})";
}).ToArray()));
await _context.Database.ExecuteSqlCommandAsync(txt.ToString());

+

+

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?