亚洲色成人网站www永久,亚洲欧美人成视频一区在线,亚洲国产成人高清在线观看,亚洲精品久久久久久动漫,亚洲国产精品久久电影欧美

數(shù)據(jù)專欄

智能大數(shù)據(jù)搬運工,你想要的我們都有

科技資訊

科技學院

科技百科

科技書籍

網(wǎng)站大全

軟件大全

在查詢的時候,一個字段查詢多個方法 如: {title:[/深圳 /,/廣州 /]} 如何把深圳和廣州寫成變量傳過去?
來源:V2EX
發(fā)布時間:2020-08-27 16:55:58
在 MySQL 時間“不正確”問題 - V2EX 中,通過在 connection URL string 中顯式地設置時區(qū)( serverTimezone=Asia/Shanghai )解決了問題。 但是我還是有很多疑問。為什么“在 connection URL string 中設置時區(qū)”會將所設置時區(qū)的時間存儲到 MySQL ?到底是哪里進行這樣的處理的? 以下是我查閱的一些資料: java - MySQL client vs server time zone - Stack Overflow java - MySQL JDBC Driver 5.1.33 - Time Zone Issue - Stack Overflow
來源:V2EX
發(fā)布時間:2020-08-27 16:55:51
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 我在Ubuntu上安裝的xen, 輸入指令xl list 和xl top 都顯示出domain0 在正常運行 為什么安裝完virt-manager卻沒有顯示domain0的運行情況。
來源:開源中國
發(fā)布時間:2015-08-31 11:49:00
準備工作(數(shù)據(jù)庫) docker run --rm --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=test -e TZ='Asia/Shanghai' -p 3306:3306 -d mysql:8 docker exec -it some-mysql mysql -u root -pmy-secret-pw use test; create table t (dt datetime); 真實結果 & 期望結果 程序通過 MyBatis 執(zhí)行 insert into t (dt) values (#{now}) ,變量 now 是通過 Instant.now() 產(chǎn)生的,其值為 2020-08-22T11:48:22.150Z ,這是正確的。但是為什么數(shù)據(jù)庫存儲的是 2020-08-22 06:48:22 呢?不應該是 2020-08-22 19:48:22 嗎? 2020-08-22 06:48:22 是怎么來的?
來源:V2EX
發(fā)布時間:2020-08-27 16:55:45
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 按照centos6xen4的官方搭建方式在實機上搭建了xen,但是由于xen需要安裝新的內(nèi)核,所以要啟動新內(nèi)核才能實現(xiàn)xen的搭建,但是reboot后新內(nèi)核一直顯示error 13 : invalid or unsupported executable format,我以為是盤符的問題,于是將ext4退至ext3發(fā)現(xiàn)還是一樣結果,猜測是grub啟動項寫的有問題,但是檢查了grub發(fā)現(xiàn)沒有問題,不知道有大神遇到過這種問題嗎?
來源:開源中國
發(fā)布時間:2016-12-14 15:20:00
我的一臺機器上( 192.168.1.10 ,固定 IP ),原本設置了一個網(wǎng)橋 br0,兩張網(wǎng)卡(暫時標記為 eth1 和 eth2 )加入了這個網(wǎng)橋,然后還有一個 kvm 虛擬機在這個網(wǎng)橋上,虛擬機里裝的是軟路由系統(tǒng),接在網(wǎng)橋上的是 LAN 口,WAN 口是直通給虛擬機的一張網(wǎng)卡(暫時標記為 eth0 )。eth0 接在光貓上,eth1 接在路由器上( 192.168.1.100 ,AP,固定 ip ),eth2 直接連電腦( 192.168.1.x,dhcp )。 以前的情況: 虛擬機里的軟路由撥號 主機可以正常上網(wǎng) 接在 eth2 上的電腦可以正常上網(wǎng),可以正常連接主機,可以正常連接虛擬機 路由器下的無線設備( 192.168.1.x,dhcp )可以正常上網(wǎng) 我在主機上裝了 docker 之后,自動創(chuàng)建了 docker0 ( 172.17.0.0/16 ),之后的情況就是: 虛擬機里軟路由撥號正常 主機可以正常上網(wǎng)( ping 和 wget 都可以) 接在 eth2 上的電腦不能正常上網(wǎng),可以正常連接主機,不能連接虛擬機,可以連接 docker 映射出來的端口 接在路由器下的無線設備和電腦一樣 未測試 docker 能否正常連接外網(wǎng) 感覺像是主機里面網(wǎng)路哪里出問題了,從主機能連到虛擬機,從外面的網(wǎng)口(eth1)也可以連到主機,但是從外面的網(wǎng)口(eth1),不能連到虛擬機。 請教一下各位大神,我應該怎么操作,才能讓,在 docker 網(wǎng)絡正常的情況下,其他的網(wǎng)絡設備也正常。
來源:V2EX
發(fā)布時間:2020-08-27 16:55:37
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 我現(xiàn)在要在ubuntu測試安裝xen從高到低的各個版本,請問這些版本對ubuntu 的版本有什么要求,如題。
來源:開源中國
發(fā)布時間:2015-04-03 09:17:00
第一種是不持久化配置文件,如下所示,使用 redis-server --requirepass "123456" --appendonly yes 進行相關的配置并啟動。 docker run -d --name one-Redis \ -p 6379:6379 \ -v Redis_data:/data \ redis:4.0.9 \ redis-server --requirepass "123456" --appendonly yes 第二種是使用配置文件,自己在 /home/user/docker/redis/redis.conf 設置好相關的配置,通過 -v /home/user/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf 將配置導入 container,然后通過 redis-server /usr/local/etc/redis/redis.conf 啟動。 docker run -d --name another-Redis \ -p 6379:6379 \ -v Redis_data:/data \ -v /home/user/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf \ redis:4.0.9 \ redis-server /usr/local/etc/redis/redis.conf 我個人覺得,第一種做法移植性很好,無需自己維護 docker host 中的配置。我自己并沒有使用 docker 很久,所以想聽聽大家的意見。 還有一個問題,有沒有什么情況是只能使用第二種方式的呢?
來源:V2EX
發(fā)布時間:2020-08-27 16:55:28
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> @xen-fans 你好,想跟你請教個問題:您好我是一名研究生最近在做Xen的的一些研究 但是怎么也安裝不上 請問這個需要怎么安裝呢 網(wǎng)上找到的一些文件都找安裝不上
來源:開源中國
發(fā)布時間:2016-05-04 10:36:00
執(zhí)行 docker run --rm --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=test -e TZ='Asia/Shanghai' -p 3306:3306 -d mysql:8 之后再執(zhí)行 docker volume ls ,出現(xiàn)了如下的一個 volume 。為什么會出現(xiàn)這樣一個 volume 呢?明明 docker run 沒有創(chuàng)建 volume 呀。 local 888bc3f68ce91c4a790a59c6f389a743d38eeee87d11002e8ff98293cf48cd6c docker run --rm -it -v 888bc3f68ce91c4a790a59c6f389a743d38eeee87d11002e8ff98293cf48cd6c:/tmp/myvolume busybox ls -l /tmp/myvolume 的輸出如下: total 186788 -rw-r----- 1 999 999 196608 Aug 23 15:17 #ib_16384_0.dblwr -rw-r----- 1 999 999 8585216 Aug 23 15:16 #ib_16384_1.dblwr drwxr-x--- 2 999 999 4096 Aug 23 15:16 #innodb_temp -rw-r----- 1 999 999 56 Aug 23 15:16 auto.cnf -rw-r----- 1 999 999 3104424 Aug 23 15:16 binlog.000001 -rw-r----- 1 999 999 156 Aug 23 15:16 binlog.000002 -rw-r----- 1 999 999 32 Aug 23 15:16 binlog.index -rw------- 1 999 999 1680 Aug 23 15:16 ca-key.pem -rw-r--r-- 1 999 999 1112 Aug 23 15:16 ca.pem -rw-r--r-- 1 999 999 1112 Aug 23 15:16 client-cert.pem -rw------- 1 999 999 1680 Aug 23 15:16 client-key.pem -rw-r----- 1 999 999 5419 Aug 23 15:16 ib_buffer_pool -rw-r----- 1 999 999 50331648 Aug 23 15:17 ib_logfile0 -rw-r----- 1 999 999 50331648 Aug 23 15:16 ib_logfile1 -rw-r----- 1 999 999 12582912 Aug 23 15:17 ibdata1 -rw-r----- 1 999 999 12582912 Aug 23 15:17 ibtmp1 drwxr-x--- 2 999 999 4096 Aug 23 15:16 mysql -rw-r----- 1 999 999 30408704 Aug 23 15:17 mysql.ibd drwxr-x--- 2 999 999 4096 Aug 23 15:16 performance_schema -rw------- 1 999 999 1680 Aug 23 15:16 private_key.pem -rw-r--r-- 1 999 999 452 Aug 23 15:16 public_key.pem -rw-r--r-- 1 999 999 1112 Aug 23 15:16 server-cert.pem -rw------- 1 999 999 1680 Aug 23 15:16 server-key.pem drwxr-x--- 2 999 999 4096 Aug 23 15:16 sys drwxr-x--- 2 999 999 4096 Aug 23 15:16 test -rw-r----- 1 999 999 10485760 Aug 23 15:17 undo_001 -rw-r----- 1 999 999 12582912 Aug 23 15:17 undo_002
來源:V2EX
發(fā)布時間:2020-08-27 16:55:20
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 安裝在Centos 6.5 上, 1、安裝 Xen4CentOS 軟件源 2、yum install xen 3、/usr/bin/grub-bootxen.sh 重啟界面如下:
來源:開源中國
發(fā)布時間:2015-04-11 14:09:07
如題, 目前網(wǎng)上搜索找到了以下兩種方式返回靜態(tài)文件 server { location ~ ^/a { default_type text/html; return 200 'asdfasdfasdfasdf'; } location ~ ^/b { default_type application/json; add_header Content-Type 'text/html; charset=utf-8'; alias /tmp/b.json; } if ($var = true) { return 200 "asdf"; } } 那么有沒有辦法在 if 結構中返回一個指定路徑的文件內(nèi)容呢, 而不是一個固定的字符串, 如下偽代碼 server { if ($var = true) { return 200 /path/to/file; } } 不一定必須 if 中實現(xiàn), 只要是在滿足變量$var=true 的情況下, 返回指定路徑靜態(tài)文件內(nèi)容即可
來源:V2EX
發(fā)布時間:2020-08-27 16:55:11
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 大神給推薦個方便的虛擬機管理工具吧??梢詗in上用的。bs cs都可以。謝謝
來源:開源中國
發(fā)布時間:2014-11-02 17:22:00
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 求科普 xen, xenserver, citrix xenserver 這三者是同一個東西么?都有什么區(qū)別?
來源:開源中國
發(fā)布時間:2014-07-09 18:54:00
需求: 使用 nginx 反代 wordpress,證書使用 Let's Encrypt,SSL 證書更新使用 acme.sh 問題: 使用 acme.sh 更新時,無法訪問到.well-known 目錄導致無法續(xù)期證書 試過指定以下配置,訪問不到 location /.well-known { root /path/to/web; } location /.well-known/ { root /path/to/web; } location ~/.well-known { root /path/to/web; } 現(xiàn)有配置: location / { proxy_pass http://wordpress; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-proto https; proxy_redirect off; }
來源:V2EX
發(fā)布時間:2020-08-27 16:54:55
關于個人家用服務器選擇?頭大,完全不懂,求前輩指點。云服務器太貴,2 核 4G 就得好幾千一年。低配又是相當多的事情做不了,部署一個 blog 感覺就差不多了。我現(xiàn)在用樹莓派,但是不敢長期開機,怕等下燒壞。求教有啥高性價比的方案。
來源:V2EX
發(fā)布時間:2020-08-27 16:54:49
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 機房斷電后 再開機 Xenserver中的虛擬機全部都不能啟動了. 使用xe相關命令 或用xencenter連接時都提示 Error: Connection refused (calling connect ) 請問有人知道如何處理嗎? 谷歌無果了
來源:開源中國
發(fā)布時間:2012-10-04 15:26:00
這次百度云的活動一直到 9 月 9 日,且包含代理商伙伴及代理商合作的客戶,云服務器 1.2 折,AI 產(chǎn)品 7 折,媒體云 5.5 折起,看種哪款聯(lián)系我還能再打折。 活動地址: http://dwz.date/ceya 需要注意的是百度云賬號已之前沒有過消費,才能綁定我的代理賬戶,享受折上折。 V+Q:7-1234-2013
來源:V2EX
發(fā)布時間:2020-08-27 16:54:43
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 大家好。 本人使用的是Ubuntu12.04 64位系統(tǒng)?,F(xiàn)下載了XEN4.3的源碼,并通過Make dist&Make install安裝好了。但是本人想修改XEN Source Code中的部分內(nèi)容(比如在Domain0中的后端驅動網(wǎng)絡部分中修改內(nèi)容,或者修改XEN Criedt的調(diào)度方法,其實這些內(nèi)容的修改暫時沒有頭緒,希望大家指導幫助),如果修改完成后,需要跟開始階段一樣使用Make Xen&Make install之類的命令來重新編譯和安裝XEN嗎,還是有什么方法。 謝謝大家的幫助。 PS。本人是一個XEN大白菜。
來源:開源中國
發(fā)布時間:2013-10-28 16:14:00
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 今兒上午安裝在centos中源碼安裝xen,中間遇到個問題要安裝acpica,于是從 http://acpica.org/downloads/ 上下了個acpic,然后進入源碼包的compiler,然后make的時候,遇到如下問題: //*********************************************************************************************************** [root @localhost compiler]# make cc -c -D_LINUX -D_GNU_SOURCE -DACPI_ASL_COMPILER -I../include -I../compiler -ansi -Wall -Wbad-function-cast -Wdeclaration-after-statement -Werror -Wformat=2 -Wmissing-declarations -Wmissing-prototypes -Wstrict-aliasing=0 -Wstrict-prototypes -Wswitch-default -Wpointer-arith -Wundef -Waddress -Waggregate-return -Wchar-subscripts -Wempty-body -Wlogical-op -Wmissing-declarations -Wmissing-field-initializers -Wmissing-parameter-type -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wredundant-decls -Wtype-limits -oadfile.o ../common/adfile.c cc1: 錯誤:無法識別的命令行選項“-Waddress” cc1: 錯誤:無法識別的命令行選項“-Wempty-body” cc1: 錯誤:無法識別的命令行選項“-Wlogical-op” cc1: 錯誤:無法識別的命令行選項“-Wmissing-parameter-type” cc1: 錯誤:無法識別的命令行選項“-Wold-style-declaration” cc1: 錯誤:無法識別的命令行選項“-Wtype-limits” make: *** [adfile.o] 錯誤 1 //************************************************************************************************************ 讀了源碼包里的readme,各種需要軟件都安了。于是我用裝了個centos,再make,還是不行。出現(xiàn)如上錯誤。請高手指點
來源:開源中國
發(fā)布時間:2012-02-10 11:54:00
Rust Enhanced 和 RustAutoComplete 插件都裝上了,自動補全插件工作正常。Build System 選擇 Rust Enhanced,構建一個單 rs 文件,代碼就是輸出 Hello World 。 點 build,跟我說必須要是一個 Cargo 項目不能構建一個單一的 rs 腳本。 好了又用終端 cargo new Hello_World --bin 了,再用 sublime 來 build,這次直接沒反應,控制臺一點輸出都沒有????
來源:V2EX
發(fā)布時間:2020-08-27 16:54:33
眾所周知,逐浪 CMS 支持強大的字段定義功能,其中省市縣三級字段更是無比強大,可以自由的實現(xiàn)地區(qū)的定制,方便 web 和移動開發(fā)者們。 這里分享幾則技巧。 1.定義省市縣三級字段的顯示順序 只要點擊網(wǎng)站后臺快速幫助,就能進入維護工具,自由的定義省市,甚至增加或減少。 這個功能非常實用,因為日新月異的行政區(qū)劃是會不變更的,同時有時網(wǎng)站平臺需要開展靈活的電子商務,需要有個性化分區(qū),在此就可以自由定制了。 2.定義省市縣三級字段默認必須選擇 默認省市縣三級字段,是以北京為排第一的,你可以根據(jù)上面方法重調(diào)順序,那么有沒有辦法,讓默認是未選中狀態(tài),必須下拉才可以選擇呢? 可以的。 你只要編輯 \wwwroot\js\Controls\ZL_PCC.js 約第 11 行: this.option = option; //{ text: "請選擇", value: "" };//附加的選項 this.defProvince = "test", this.defCity = "", this.defCounty = "", this.stwon = ""; } 修改為: this.option = { text: "請選擇", value: "" };//附加的選項 this.defProvince = "", this.defCity = "", this.defCounty = "", this.stwon = ""; } 就能實現(xiàn)字段默認為空的狀態(tài)了,如下所示:
來源:V2EX
發(fā)布時間:2020-08-27 16:54:28
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> xen虛擬機里,domU都有自己的網(wǎng)卡。在dom0里也會有對應的vifx.y網(wǎng)卡。那這個vifx.y是干嘛用的?在不同的網(wǎng)絡連接方式里,它的作用是什么?是否需要ip地址?mac地址設置為廣播地址的作用又是什么?求指導
來源:開源中國
發(fā)布時間:2013-11-25 10:14:00
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 維護公司一個老項目,上個哥們留下來的,發(fā)現(xiàn)用的是nutz,沒辦法,也得跟著用了.今天寫一個東西涉及到關聯(lián)查詢,掛了.代碼如圖: 我想說的是:作為一個框架的開發(fā)者你應該明白你根本滿足不了所有的需求,你封裝的所謂的面向對象的東西遇到復雜的查詢搞不定,或者使用中不想用你封裝的東西,那總得寫原生的sql吧,為什么不暴漏Connection出來. 或者提供一個支持原生語句的api,當我看到dao.run這個方法時仿佛看到一絲曙光,new 了ConnCallback發(fā)現(xiàn)還是沒有Connection,下面是我的偽代碼.國產(chǎn)的所謂的框架啊,麻煩那些人先不要說多好,多牛逼,牛逼的原理是啥呢?web層無法是對servlet的封裝,加上數(shù)據(jù)庫的操作,先把基本的需求滿足在說.所謂的好用的框架應該是極易上手,基本上有幾年開發(fā)經(jīng)驗的人看一下就知道怎么用,你得知道你開源出去的東西有人在使用,這時候就不餓能以自我為中心了,得滿足各種不同人的需求,我看了看框架里面各種變量名,注解名.也是醉了.不能老站在自己的角度閉門造車,就說這些.可能是我對這個框架還不了解不熟悉吧,接下來打算試試在開源社區(qū)人氣很旺的JFinal.
來源:開源中國
發(fā)布時間:2015-06-26 13:09:00
將 restful api 視作一個資源,即 /api/book/foor===get, get 請求 /api/book/foor 整體視為一個資源 /api/book/foor===post, post 請求 /api/book/foor 整體視為另一個資源 資源和角色相映射,用戶再和角色對應。即角色擁有資源,用戶所屬對應角色,用戶才能訪問此 api. 上面這種方式咋樣? 自薦一個開箱即用的高效認證鑒權包,專注于 Restful Api 的動態(tài)保護 su.usthe.com github: https://github.com/tomsun28/sureness com.usthe.sureness sureness-core 0.0.2.7
來源:V2EX
發(fā)布時間:2020-08-27 16:54:19
首先,我是此文原作者,可能有同學看過這篇文章。在 V 站只是為了介紹 Forest 這個神器,幫助大家在工作中選擇 http 客戶端時多一個選擇。望大家積極討論。 1.背景 因為業(yè)務關系,要和許多不同第三方公司進行對接。這些服務商都提供基于 http 的 api 。但是每家公司提供 api 具體細節(jié)差別很大。有的基于 RESTFUL 規(guī)范,有的基于傳統(tǒng)的 http 規(guī)范;有的需要在 header 里放置簽名,有的需要 SSL 的雙向認證,有的只需要 SSL 的單向認證;有的以 JSON 方式進行序列化,有的以 XML 方式進行序列化。類似于這樣細節(jié)的差別太多了。 不同的公司 API 規(guī)范不一樣,這很正常。但是對于我來說,我如果想要代碼變得優(yōu)雅。我就必須解決一個痛點: 不同服務商 API 那么多的差異點,如何才能維護一套不涉及業(yè)務的公共 http 調(diào)用套件。最好通過配置或者簡單的參數(shù)就能區(qū)分開來。進行方便的調(diào)用? 我當然知道有很多優(yōu)秀的大名鼎鼎的 http 開源框架可以實現(xiàn)任何形式的 http 調(diào)用,在多年的開發(fā)經(jīng)驗中我都有使用過。比如 apache 的 httpClient 包,非常優(yōu)秀的 Okhttp , jersey client 。 這些 http 開源框架的接口使用相對來說,都不太一樣。不管選哪個,在我這個場景里來說,我都不希望在調(diào)用每個第三方的 http api 時寫上一堆 http 調(diào)用代碼。 所以,在這個場景里,我得對每種不同的 http api 進行封裝。這樣的代碼才能更加優(yōu)雅,業(yè)務代碼和 http 調(diào)用邏輯耦合度更低。 可惜,我比較懶。一來覺得封裝起來比較費時間,二來覺對封裝這種底層 http 調(diào)用來說,應該有更好的選擇。不想自己再去造輪子。 于是,我發(fā)現(xiàn)了一款優(yōu)秀的開源 http 框架,能屏蔽不同細節(jié) http api 所帶來的所有差異。能通過簡單的配置像調(diào)用 rpc 框架一樣的去完成極為復雜的 http 調(diào)用。 Forest https://gitee.com/dt_flys/forest 2.上手 Forest 支持了 Springboot 的自動裝配,所以只需要引入一個依賴就行 com.dtflys.forest spring-boot-starter-forest 1.4.0 定義自己的接口類 public interface MyClient { @Request(url = "http://baidu.com") String simpleRequest(); @Request( url = "http://ditu.amap.com/service/regeo", dataType = "json" ) Map getLocation(@DataParam("longitude") String longitude, @DataParam("latitude") String latitude); } 在啟動類里配置代理接口類的掃描包 @SpringBootApplication @ForestScan(basePackages = "com.example.demo.forest") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } 這時候,你就可以從 spring 容器中注入你的代理接口,像調(diào)用本地方法一樣去調(diào)用 http 的 api 了 @Autowired private MyClient myClient; @Override public void yourMethod throws Exception { Map result = myClient.getLocation("124.730329","31.463683"); System.out.println(JSON.toJSONString(result,true)); } 日志打印, Forest 打印了內(nèi)部所用的 http 框架,和實際請求 url 和返回。當然日志可以通過配置去控制開關。 3.特點 我覺得對于尤其是做對接第三方 api 的開發(fā)同學來說,這款開源框架能幫你提高很多效率。 Forest 底層封裝了 2 種不同的 http 框架: Apache httpClient 和 OKhttp 。所以這個開源框架并沒有對底層實現(xiàn)進行重復造輪子,而是在易用性上面下足了功夫。 我用 Forest 最終完成了和多個服務商 api 對接的項目,這些風格迥異的 API,我僅用了 1 個小時時間就把他們轉化為了本地方法。然后項目順利上線。 Forest 作為一款更加高層的 http 框架,其實你并不需要寫很多代碼,大多數(shù)時候,你僅通過一些配置就能完成 http 的本地化調(diào)用。而這個框架所能覆蓋的面,卻非常之廣,滿足你絕大多數(shù)的 http 調(diào)用請求。 Forest 有以下特點: 以 Httpclient 和 OkHttp 為后端框架 通過調(diào)用本地方法的方式去發(fā)送 Http 請求, 實現(xiàn)了業(yè)務邏輯與 Http 協(xié)議之間的解耦 相比 Feign 更輕量,不依賴 Spring Cloud 和任何注冊中心 支持所有請求方法: GET , HEAD , OPTIONS , TRACE , POST , DELETE , PUT , PATCH 支持靈活的模板表達式 支持過濾器來過濾傳入的數(shù)據(jù) 基于注解、配置化的方式定義 Http 請求 支持 Spring 和 Springboot 集成 實現(xiàn) JSON 和 XML 的序列化和反序列化 支持 JSON 轉換框架: Fastjson , Jackson , Gson 支持 JAXB 形式的 XML 轉換 支持 SSL 的單向和雙向加密 支持 http 連接池的設定 可以通過 OnSuccess 和 OnError 接口參數(shù)實現(xiàn)請求結果的回調(diào) 配置簡單,一般只需要 @Request 一個注解就能完成絕大多數(shù)請求的定義 支持異步請求調(diào)用 4.兩個很棒的功能 這里不對使用方式和配置方式一一描述,有興趣的可以去閱讀詳細文檔: https://dt_flys.gitee.io/forest 這里只想分析這個框架 2 個我認為比較好的功能 4.1 模板表達式和參數(shù)的映射綁定功能 模板表達式在使用的時候特別方便,舉個栗子 @Request( url = "${0}/send?un=${1}&pw=${2}&ph=${3}&ct=${4}", type = "get", dataType = "json" ) public Map send( String base, String userName, String password, String phone, String content ); 上述是用序號下標進行取值,也可以通過名字進行取值: @Request( url = "${base}/send?un=${un}&pw=${pw}&ph=${3}&ct=${ct}", type = "get", dataType = "json" ) public Map send( @DataVariable("base") String base, @DataVariable("un") String userName, @DataVariable("pw") String password, @DataVariable("ph") String phone, @DataVariable("ct") String content ); 甚至于可以這樣簡化寫: @Request( url = "${base}/send", type = "get", dataType = "json" ) public Map send( @DataVariable("base") String base, @DataParam("un") String userName, @DataParam("pw") String password, @DataParam("ph") String phone, @DataParam("ct") String content ); 以上三種寫法是等價的 當然你也可以把參數(shù)綁定到 header 和 body 里去,你甚至于可以用一些表達式簡單的把對象序列化成 json 或者 xml: @Request( url = "${base}/pay", contentType = "application/json", type = "post", dataType = "json", headers = {"Authorization: ${1}"}, data = "${json($0)}" ) public PayResponse pay(PayRequest request, String auth); 當然數(shù)據(jù)綁定這塊詳情請參閱文檔 4.2 對 HTTPS 的支持 以前用其他 http 框架處理 https 的時候,總覺得特別麻煩,尤其是雙向證書。每次碰到問題也只能去 baidu 。然后根據(jù)別人的經(jīng)驗來修改自己的代碼。 Forest 對于這方面也想的很周到,底層完美封裝了對 https 單雙向證書的支持。也是只要通過簡單的配置就能迅速完成。舉個雙向證書栗子: @Request( url = "${base}/pay", contentType = "application/json", type = "post", dataType = "json", keyStore = "pay-keystore", data = "${json($0)}" ) public PayResponse pay(PayRequest request); 其中 pay-keystore 對應著 application.yml 里的 ssl-key-stores forest: ... ssl-key-stores: - id: pay-keystore file: test.keystore keystore-pass: 123456 cert-pass: 123456 protocols: SSLv3 這樣設置,就 ok 了,剩下的,就是本地代碼形式的調(diào)用了。 5.最后 Forest 有很多其他的功能設定,如果感興趣的同學還請仔細去閱讀文檔和示例。 但是我想說的是,相信看到這里,很多人一定會說,這不就是 Feign 嗎? 我在開發(fā) Spring Cloud 項目的時候,也用過一段時間 Feign ,個人感覺 Forest 的確在配置和用法上和 Feign 的設計很像,但 Feign 的角色更多是作為 Spring Cloud 生態(tài)里的一個成員。充當 RPC 通信的角色,其承擔的不僅是 http 通訊,還要對注冊中心下發(fā)的調(diào)用地址進行負載均衡。 而 Forest 這個開源項目其定位則是一個高階的 http 工具,主打友好和易用性。從使用角度出發(fā),個人感覺 Forest 配置性更加簡單直接。提供的很多功能也能解決很多人的痛點。 開源精神難能可貴,好的開源需要大家的添磚加瓦和支持。希望這篇文章能給大家在選擇 http 客戶端框架時帶來一個新的選擇: Forest 6.聯(lián)系作者 覺得有用的話,請關注下我的公眾號「元人部落」,作者堅持原創(chuàng)的內(nèi)容技術分享,也有開源作品,歡迎關注 開源倉庫為: https://gitee.com/bryan31 公眾號一般周更,每次會分享一些實用的技術,陪你一起成長 關注后回復“資料”領取 50G 的視頻資料,包括一套企業(yè)級微服務的視頻教學
來源:V2EX
發(fā)布時間:2020-08-27 16:54:11
前言 GitHub 應該是廣大開發(fā)者最常去的站點,這里面有大量的優(yōu)秀項目,是廣大開發(fā)者尋找資源,交友學習的好地方。尤其是前段時間 GitHub 公布了一項代碼存檔計劃——Arctic Code Vault,要把代碼埋入地下 250 米深的永久凍土層,可以將代碼保存一千年。此外,GitHub 還為開發(fā)者在配置文件中設計了紀念徽章。 想想自己的代碼可以作為人類的技術瑰寶被保存一千年,是不是有點自豪呢。 好了,言歸正傳。 雖然 GitHub 沒有被 Q,但是由于 CDN 服務器都在國外,所以國內(nèi)訪問 GitHub 的速度實在是慢的一匹,有時候經(jīng)常頁面刷不出,在我獲取知識的道路上增加了重重的阻礙。 所以,我肝了 3 小時,寫了一個在不用 T 子的情況下,加速 GitHub 訪問速度的小工具,最后會分享給大家。 同時,這篇文章也會分享其他加速 GitHub 訪問的方法。算是一個比較全的整理吧。 Let's get it! 自動生成最快訪問 host 的小工具 GitHub 在國內(nèi)訪問速度慢的原因其實有很多,但最主要的原因就是 GitHub 的分發(fā)加速網(wǎng)絡域名遭到 DNS 的污染。為了解決這個問題,網(wǎng)上有很多文章提供了一個解決方案,就是通過修改 Hosts 文件,繞過國內(nèi)的 DNS 解析,直接訪問 GitHub 的 CDN 節(jié)點,從而達到加速的目的。 但是我看大多數(shù)關于此方法的介紹,只提供 3 個 github 的相關域名,而且需要在 ipaddress.com 一個個去查,根據(jù)查到的 ip,再去自己 ping,肉眼選取最快的 ip,自行編輯成 IP+域名格式,貼到 hosts 文件里。 其實 GitHub 用到相關域名有很多,我整理了下,一共有十幾個 github.global.ssl.fastly.net github.com assets-cdn.github.com documentcloud.github.com gist.github.com help.github.com nodeload.github.com codeload.github.com raw.github.com status.github.com training.github.com avatars0.githubusercontent.com avatars1.githubusercontent.com avatars2.githubusercontent.com avatars3.githubusercontent.com 這要是一個個去查,一個個去選取,也是挺麻煩的。 為此我寫了一個工具,能自動的根據(jù)你當前 ip,去尋找這十幾個域名所對應最快的 CDN 節(jié)點,如果一個 ip 對應多個 CDN 節(jié)點,工具會自動幫你去 ping 10 次,取到平均值最小的 CDN 的 IP 地址。 你需要做的,只是把最終生成的結果貼到你的 hosts 文件中即可。 這個小工具,關注「元人部落」輸入 github 即可獲取到。 用法很簡單,只需要執(zhí)行以下命令即可運行 java -jar githubhost.jar 運行起來后,瀏覽器輸入 127.0.0.1:8880 即可自動進行根據(jù)你當前 Ip 進行分析: 分析大概需要十幾秒,進度條會自動刷新,等進度條滿了之后,即可看到生成內(nèi)容: 每個地區(qū)每個運營商可能運行出來的都不一樣,所以得出結果后,你就可以把這段內(nèi)容追加到你 hosts 文件中(如果不知道 hosts 存放位置,可以自行 baidu),然后根據(jù)提示讓 hosts 文件生效。 指定了 CDN 的訪問地址,可以讓你的 github 訪問至少無卡頓了。 碼云 GitHub 鏡像站 碼云提供了一個”碼云急速下載“站,每天從 github 上同步一些項目。 https://gitee.com/mirrors 個人感覺應該不是所有的 github 項目都會同步過來,看倉庫數(shù)量,有大概 15k 的項目 如果你想 clone 一些項目去研究,可以先在這里找找有沒有。碼云因為是國內(nèi)開源項目站點,git clone 速度自然不用擔心,但是很可惜的是 1.這個鏡像站點不是所有的 github 項目,不過大多數(shù)熱門項目都會有 2.issue 和 release 包也沒有,只有代碼 3.有一天的延遲。即你看到的是一天前的項目狀態(tài) 4.因為不是 github,所以你也沒法通過這個 push 到 github 上的項目 GitHub 鏡像站 這個鏡像站為: https://github.com.cnpmjs.org/ 進入之后,完全和 github 沒有任何區(qū)別,訪問也很快。 尤其是 clone 代碼,那是飛快啊。。。 比如,你原先要 clone,這樣寫 git clone https://github.com/kubernetes/kubernetes.git 現(xiàn)在改成: git clone https://github.com.cnpmjs.org/kubernetes/kubernetes.git 試一下: 這個速度,應該無欲無求了吧。。。 不過這個方法可惜的是: 1.這個鏡像站很不穩(wěn)定,你時常會看到: 2.你每次 clone 還需要自己去修改 url,有點不方便 3.你依舊沒法 push GitClone 站點 在尋找解決之道的途中,我又發(fā)現(xiàn)一個站點:gitclone https://gitclone.com/ 這是一個 GitHub 的緩存加速節(jié)點,也大約緩存了 15k 個項目,但是 gitclone 單獨做了一個站點,里面可以進行搜索項目,甚至于還可以創(chuàng)建倉庫。 gitclone 的 clone 提供了多種方式來 clone 但是搜索到的項目,最終查看還是跳轉到 GitHub 相應的頁面。 所以其實和 gitee 鏡像站都差不多。換湯不換藥,問題和之前幾個鏡像站點差不多,不過你只是要 clone,還是不錯的選擇。 總結 其實在不用 T 子的情況下,方式無非就兩種: 修改 hosts,直接訪問最快的 CDN 節(jié)點,這種方式優(yōu)勢在于原汁原味。 通過鏡像去訪問和 clone,這種方式優(yōu)勢在于 clone 的速度。 個人推薦如果主要瀏覽為主,還是用上文推薦的工具去生成 hosts 進行配置,畢竟原汁原味,clone 大項目的話,可以考慮以上鏡像站點去加速下載。 關注作者 最后把這個開源工具分享給大家,關注「元人部落」公眾號,并回復 github 即可獲取到這個工具 jar 包。啟動后訪問 127.0.0.1:8880 端口即可自動生成。 一個堅持做原創(chuàng)的技術科技分享號,希望你能關注我,我每周會出一篇實用的原創(chuàng)技術文章,陪著你一起走,不再害怕。
來源:V2EX
發(fā)布時間:2020-08-27 16:54:03
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> org.nutz.dao.DaoException: java.sql.SQLException: unsupported by SQLite: savepoints at org.nutz.dao.impl.sql.run.NutDaoRunner.run(NutDaoRunner.java:50) ~[nutz-1.b.52.jar:na] at org.nutz.dao.impl.DaoSupport._exec(DaoSupport.java:205) ~[nutz-1.b.52.jar:na] at org.nutz.dao.impl.EntityOperator.exec(EntityOperator.java:50) ~[nutz-1.b.52.jar:na] at org.nutz.dao.impl.NutDao.update(NutDao.java:237) ~[nutz-1.b.52.jar:na]
來源:開源中國
發(fā)布時間:2015-05-12 20:15:00
最近公司不知道為什么,突然要做一個什么邊緣計算,領導讓我們先自己找找資料,預演一下,頭疼
來源:V2EX
發(fā)布時間:2020-08-27 16:53:57
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> @Modules 注解 聲明應用的所有子模塊,是否可以將子模塊的聲明放到配置文件中?
來源:開源中國
發(fā)布時間:2015-04-27 11:13:00
用過不少 httpclient , 感覺大部分 client 細節(jié)非常多. 但其實對于后端來說,幾乎所有的都是非常簡單的 json 請求, 用起來頗有一種大炮打蚊子的感覺. 目前公司系統(tǒng)針對各自的請求對 apache httpclient 進行了非常簡單的封裝,但即便如此,也不具備通用性.想問下各位 V 友,你們是怎么選擇 httpclient 的 , 有沒有進行過二次封裝 1, java 9+ 自帶 httpclient(我比較喜歡這種鏈式調(diào)用的,但是 java8 沒有) 2, apache 原生 httpclient 3, 封裝過的 apache httpclient 4, OkHttp 5, Feign 6, RestTemplate 7, Retrofit
來源:V2EX
發(fā)布時間:2020-08-27 16:53:53
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 1、如何在不實際計算的情況下獲取返回值的類型?比如說我只是在Context里面設置個隨意的初始值。 2、是否有方法能返回表達式里面的變量名?
來源:開源中國
發(fā)布時間:2015-05-09 10:21:00
JVM Specification memory model Program Counter (PC) Register JVM Stacks Native Method Stacks Heap Method Area Run-time Constant Pool Java 8 HotSpot JVM memory model Java Heap Young Generation Eden Survivor Virtual Old Generation Metaspace Compressed Class Space CodeCache Native Memory
來源:V2EX
發(fā)布時間:2020-08-27 16:53:41
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> HTTP Status 500 - folder or file like '^(.+[.])(js|json)$' no found in dao.js typeException report messagefolder or file like '^(.+[.])(js|json)$' no found in dao.js descriptionThe server encountered an internal error that prevented it from fulfilling this request. exceptionjava.lang.RuntimeException: folder or file like '^(.+[.])(js|json)$' no found in dao.js sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) java.lang.reflect.Constructor.newInstance(Unknown Source) org.nutz.lang.born.ConstructorBorning.born(ConstructorBorning.java:17) org.nutz.lang.born.BornContext.doBorn(BornContext.java:60) org.nutz.lang.Mirror.born(Mirror.java:931) org.nutz.lang.Lang.makeThrow(Lang.java:116) org.nutz.resource.Scans.loadResource(Scans.java:86) org.nutz.ioc.loader.json.JsonLoader.(JsonLoader.java:41) ren.miaoxing.db.DBConecction.getDao(DBConecction.java:25) ren.miaoxing.app.SignInAction.execute(SignInAction.java:19) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452) com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254) com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263) org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 我已經(jīng)將dao.js 放到src目錄下了
來源:開源中國
發(fā)布時間:2015-04-15 09:01:00
看了 thenCompose 的源碼,感覺弄得挺復雜,到底該怎么理解它?。扛杏X都不知道怎么應用 thenCompose其實和 thenCombine 也差不多嘛,也是依賴于兩個輸入。
來源:V2EX
發(fā)布時間:2020-08-27 16:53:25
我本來以為要用 mq,后來發(fā)現(xiàn)數(shù)據(jù)庫修改一次,mongodb 中,修改好多次,好像不可取,但是又想不到其他的辦法,所以想問下各位 v 友們,大家是怎么解決這個問題的。
來源:V2EX
發(fā)布時間:2020-08-27 16:53:19
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 想問一下WIN7下能安裝 下面這些編輯器和函數(shù)庫嗎? 并行編譯環(huán)境:GNU C/C++編譯器;GUN Fortran77/90 編譯器; 高性能計算函數(shù)庫:LAPACK;BLAS;GOTO;Atlas;FFTW; GPU CUDA 函數(shù)庫:cuBlascuFFT;cuSparse;cuRand;npp;OpenCL
來源:開源中國
發(fā)布時間:2013-12-14 15:14:00
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 問題:WIN7 X64旗艦版系統(tǒng),安裝Virtualbox 4.1.8,無法添加Host-only network網(wǎng)絡。 在VBOX里面安裝虛機的時候,使用 NAT和Bridged Adapter模式都是正常的,但是使用Host-only Networks的時候,就無法選擇網(wǎng)卡。 重新在Virtualbox里面files--Preferences--networks-新加Host-only Networks的時候,就會報錯“Failed to create the Host-only Networks interface” 怎么辦???急
來源:開源中國
發(fā)布時間:2012-02-14 14:31:00
select a.id, c.name as status ,d.name as type from a left join b c on a.status =c.id left join b d on a.type =d.id select a.id, (selct name from b where a.status = b.id) as status, (selct name from b where a.type = b.id) as type from a a 表與 b 表關聯(lián),b 作為字典表,存著名稱等信息,a 只有 id 。 不討論這個表結構改變等等(以及用了很久,數(shù)據(jù)很多,而且不是我能決定的),僅從 SQL 角度 1.兩種寫法我都覺得很丑陋,有沒有更好的 2.如果沒有的話,哪一種稍微好一點
來源:V2EX
發(fā)布時間:2020-08-27 16:53:02
背景 之前一直以為 MySQL 的多表關聯(lián)查詢語句是首先對 FROM 語句的前兩張表執(zhí)行笛卡爾積,產(chǎn)生一張?zhí)摂M表,然后使用 ON 過濾和 OUTER JOIN 添加外部行,再使用過濾后的虛擬表跟第三張表進行笛卡爾乘積,重復執(zhí)行上述步驟。下面是從網(wǎng)上搜到一些比較熱門的 SQL 執(zhí)行順序的文章,大家應該很熟悉吧,尤其是下面那張魚骨圖。 摘自: 步步深入:MySQL 架構總覽->查詢執(zhí)行流程->SQL 解析順序 摘自: Mysql - JOIN 詳解 問題描述 最近由于工作需要,對 SQL 查詢性能要求比較高,閱讀了《 高性能 MySQL (第 3 版) 》查詢優(yōu)化的相關章節(jié),在“6.4.3 查詢優(yōu)化處理”章節(jié)有這樣一句話: MySQL 對任何關聯(lián)都執(zhí)行嵌套循環(huán)關聯(lián)操作 ,即 MySQL 先在一個表中循環(huán)讀取單條數(shù)據(jù),然后再嵌套循環(huán)到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止。然后根據(jù)各個表匹配的行,返回查詢中需要的各個列。MySQL 會嘗試在最后一個關聯(lián)表中找到所有匹配的行,如果最后一個關聯(lián)表無法找到更多的行以后,MySQL 返回到上一層次關聯(lián)表,看是否能夠找到更多的匹配記錄,依次類推迭代執(zhí)行。 于是對之前的認識產(chǎn)生懷疑,如果所有關聯(lián)都是嵌套循環(huán)關聯(lián)查詢的話,只有當沒有任何過濾條件時兩張表才會產(chǎn)生笛卡爾乘積,而且這個笛卡爾乘積是一個結果,并不是關聯(lián)查詢的步驟,而且如果兩張幾十萬、上百萬的表進行笛卡爾乘積,這數(shù)據(jù)量有點巨大了。。。在 MySQL 的官方手冊 中也印證了嵌套循環(huán)操作: 在博客園找到 神奇的 SQL 之 聯(lián)表細節(jié) → MySQL JOIN 的執(zhí)行過程(一) 這篇博客對上述笛卡爾乘積也有同樣的疑問,而且給出了實際的案例分析,個人比較認同該博主的觀點。里面有這樣一個案例: 從這個案例可以看出當查詢優(yōu)化器使用 Index Nested-Loop 即索引嵌套循環(huán),WHERE 條件首先通過索引過濾驅動表的數(shù)據(jù)然后再關聯(lián)被驅動表,更加印證了 WHERE 不是在兩表生成笛卡爾乘積后才進行過濾的。如果從“嵌套循環(huán)關聯(lián)”的角度看,之前的關聯(lián)表先生成笛卡爾乘積再進行過濾的理論是站不住腳的。 那么問題就是 這種“笛卡爾乘積過濾”的理論有什么歷史原因嗎,為什么網(wǎng)上的文章大部分都是這種,還是我對“嵌套循環(huán)查詢”有誤解? 我相信有不少小伙伴跟我一樣的疑惑吧,還望 V 站大佬給指點迷津。
來源:V2EX
發(fā)布時間:2020-08-27 16:52:55