1. cross join 就是笛卡爾積
那看起來好象和 inner join 是一樣的,在 SQL 標準中定義的是 cross join 就是沒有條件的 inner join。在 mysql 中,不區分,這兩個等價。
2. natural (left) join 是把兩個表名字一樣的列,做相等條件處理,比如:
t1
id1 name
t2
id2 name
那么 select t1.id1, t2.id1, t1.name from t1 natural join t2 就等價
select t1.id1, t2.id1, t1.name from t1 join t2 on (t1.name = t2.name)
自動把一樣名稱的列(name)做了個相待條件處理,多列也會同時處理。
所以,這兩種 join 沒人用是有原因的。
cross join 沒意義,一般用逗號就可以了。
natural 降低了可讀性,不建議使用。
posted @
2011-10-13 18:06 哈哈的日子 閱讀(633) |
評論 (0) |
編輯 收藏
一個好軟件,會讓人覺得賞心悅目
會讓人心曠神怡
會開心
會……
H2DB 就是這樣的一個好軟件,就一個感覺----舒服!
比如:group by sort 的實現
private void queryGroupSorted(int columnCount, ResultTarget result) {
int rowNumber = 0;
setCurrentRowNumber(0);
Value[] previousKeyValues = null;
while (topTableFilter.next()) {
setCurrentRowNumber(rowNumber + 1);
if (condition == null || Boolean.TRUE.equals(condition.getBooleanValue(session))) {
rowNumber++;
Value[] keyValues = new Value[groupIndex.length];
// update group
for (int i = 0; i < groupIndex.length; i++) {
int idx = groupIndex[i];
Expression expr = expressions.get(idx);
keyValues[i] = expr.getValue(session);
}
if (previousKeyValues == null) {
previousKeyValues = keyValues;
currentGroup = New.hashMap();
} else if (!Arrays.equals(previousKeyValues, keyValues)) {
addGroupSortedRow(previousKeyValues, columnCount, result);
previousKeyValues = keyValues;
currentGroup = New.hashMap();
}
currentGroupRowId++;
for (int i = 0; i < columnCount; i++) {
if (groupByExpression == null || !groupByExpression[i]) {
Expression expr = expressions.get(i);
expr.updateAggregate(session);
}
}
}
}
if (previousKeyValues != null) {
addGroupSortedRow(previousKeyValues, columnCount, result);
}
}
看著太舒服了。
posted @
2011-10-12 13:52 哈哈的日子 閱讀(263) |
評論 (0) |
編輯 收藏
http://ivansmirnov.wordpress.com/2011/03/19/java-util-concurrent-locks-thread-dump/
The Sun JVM setting “-XX:+PrintConcurrentLocks” adds the lock owner information to the thread dump.
posted @
2011-08-16 16:18 哈哈的日子 閱讀(195) |
評論 (0) |
編輯 收藏
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
http://en.wikipedia.org/wiki/Category:Unix_signals
1.SIGHUP信號
UNIX中進程組織結構為 session (會話)包含一個前臺進程組及一個或多個后臺進程組,一個進程組包含多個進程。一個session可能會有一個session首進程,而一個session首進程可能會有一個控制終端。一個進程組可能會有一個進程組首進程。進程組首進程的進程ID與該進程組ID相等。這兒是可能會有,在一定情況之下是沒有的。與終端交互的進程是前臺進程,否則便是后臺進程。
SIGHUP會在以下3種情況下被發送給相應的進程:
1、終端關閉時,該信號被發送到session首進程以及作為job提交的進程(即用 & 符號提交的進程)
2、session首進程退出時,該信號被發送到該session中的前臺進程組中的每一個進程
3、若父進程退出導致進程組成為孤兒進程組,且該進程組中有進程處于停止狀態(收到SIGSTOP或SIGTSTP信號),該信號會被發送到該進程組中的每一個進程。
系統對SIGHUP信號的默認處理是終止收到該信號的進程。所以若程序中沒有捕捉該信號,當收到該信號時,進程就會退出。
下面觀察幾種因終端關閉導致進程退出的情況,在這兒進程退出是因為收到了SIGHUP信號。login shell是session首進程。
首先寫一個測試程序,代碼如下:
#include <stdio.h>
#include <signal.h>
char **args;
void exithandle(int sig)
{
printf("%s : sighup received ",args[1]);
}
int main(int argc,char **argv)
{
args = argv;
signal(SIGHUP,exithandle);
pause();
return 0;
}
程序中捕捉SIGHUP信號后打印一條信息,pause()使程序暫停。
編譯后的執行文件為sigtest。
1、命 令:sigtest front > tt.txt
操 作:關閉終端
結 果:tt.txt文件的內容為front : sighup received
原 因: sigtest是前臺進程,終端關閉后,根據上面提到的第1種情況,login shell作為session首進程,會收到SIGHUP信號然后退出。根據第2種情況,sigtest作為前臺進程,會收到login shell發出的SIGHUP信號。
2、命 令:sigtest back > tt.txt &
操 作:關閉終端
結 果:tt.txt文件的內容為 back : sighup received
原 因: sigtest是提交的job,根據上面提到的第1種情況,sigtest會收到SIGHUP信號。
3、命 令:寫一個shell,內容為[sigtest &],然后執行該shell
操 作:關閉終端
結 果:ps -ef | grep sigtest 會看到該進程還在,tt文件為空
原 因: 執行該shell時,sigtest作為job提交,然后該shell退出,致使sigtest變成了孤兒進程,不再是當前session的job了,因此sigtest即不是session首進程也不是job,不會收到SIGHUP。同時孤兒進程屬于后臺進程,因此login shell退出后不會發送SIGHUP給sigtest,因為它只將該信號發送給前臺進程。第3條說過若進程組變成孤兒進程組的時候,若有進程處于停止狀態,也會收到SIGHUP信號,但sigtest沒有處于停止狀態,所以不會收到SIGHUP信號。
4、命 令:nohup sigtest > tt
操 作:關閉終端
結 果:tt文件為空
原 因: nohup可以防止進程收到SIGHUP信號
至此,我們就清楚了何種情況下終端關閉后進程會退出,何種情況下不會退出。
要想終端關閉后進程不退出有以下幾種方法,均為通過shell的方式:
1、編寫shell,內容如下
trap "" SIGHUP #該句的作用是屏蔽SIGHUP信號,trap可以屏蔽很多信號
sigtest
2、nohup sigtest 可以直接在命令行執行,
若想做完該操作后繼續別的操作,可以 nohup sigtest &
3、編寫shell,內容如下
sigtest &
其實任何將進程變為孤兒進程的方式都可以,包括fork后父進程馬上退出。
2.SIGCHLD信號
子進程死后,會發送SIGCHLD信號給父進程。
一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數據結構(系統調用exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀)。在Linux進程的狀態中,僵尸進程 是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,僵尸進程不再占有任何內存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態,如果這時父進程結束了,那么init進程自動會接手這個子進程,為它收尸,它還是能被清除的。但是如果如果父進程是一個循環,不會結束,那么子進程就會一直保持僵尸狀態,這就是為什么系統中有時會有很多的僵尸進程。
2.SIGTERM信號
kill() 可以發 SIGTERM 過去;kill 命令默認也使用 SIGTERM 信號。
SIGTERM 信號的處理函數,常見的是用來清理、退出;或者程序可以忽略這個信號,以防誤殺。
SIGTERM is the default signal sent to a process by the kill or killall commands. It causes the termination of a process, but unlike the SIGKILLsignal, it can be caught and interpreted (or ignored) by the process. Therefore, SIGTERM is more akin to asking a process to terminate nicely, allowing cleanup and closure of files. For this reason, on many Unix systems during shutdown, init issues SIGTERM to all processes that are not essential to powering off, waits a few seconds, and then issues SIGKILL to forcibly terminate other processes to allow the computer to halt.
|
linux kill信號列表
2009-04-13 17:00
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
列表中,編號為1 ~ 31的信號為傳統UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是后來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區別在于前者不支持排隊,可能會造成信號丟失,而后者不會。
下面我們對編號小于SIGRTMIN的信號進行討論。
1) SIGHUP
本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。
登錄Linux時,系統會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進程組和后臺進程組,一般都屬于這個 Session。當用戶退出Linux登錄時,前臺進程組和后臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前臺進 程組和后臺有終端輸出的進程就會中止。不過可以捕獲這個信號,比如wget能捕獲SIGHUP信號,并忽略它,這樣就算退出了Linux登錄,wget也 能繼續下載。
此外,對于與終端脫離關系的守護進程,這個信號用于通知它重新讀取配置文件。
2) SIGINT
程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出,用于通知前臺進程組終止進程。
3) SIGQUIT
和SIGINT類似, 但由QUIT字符(通常是Ctrl-\)來控制. 進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上類似于一個程序錯誤信號。
4) SIGILL
執行了非法指令. 通常是因為可執行文件本身出現錯誤, 或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號。
5) SIGTRAP
由斷點指令或其它trap指令產生. 由debugger使用。
6) SIGABRT
調用abort函數生成的信號。
7) SIGBUS
非法地址, 包括內存地址對齊(alignment)出錯。比如訪問一個四個字長的整數, 但其地址不是4的倍數。它與SIGSEGV的區別在于后者是由于對合法存儲地址的非法訪問觸發的(如訪問不屬于自己存儲空間或只讀存儲空間)。
8) SIGFPE
在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢出及除數為0等其它所有的算術的錯誤。
9) SIGKILL
用來立即結束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。
10) SIGUSR1
留給用戶使用
11) SIGSEGV
試圖訪問未分配給自己的內存, 或試圖往沒有寫權限的內存地址寫數據.
12) SIGUSR2
留給用戶使用
13) SIGPIPE
管道破裂。這個信號通常在進程間通信產生,比如采用FIFO(管道)通信的兩個進程,讀管道沒打開或者意外終止就往管道寫,寫進程會收到SIGPIPE信號。此外用Socket通信的兩個進程,寫進程在寫Socket的時候,讀進程已經終止。
14) SIGALRM
時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數使用該信號.
15) SIGTERM
程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。
17) SIGCHLD
子進程結束時, 父進程會收到這個信號。
如果父進程沒有處理這個信號,也沒有等待(wait)子進程,子進程雖然終止,但是還會在內核進程表中占有表項,這時的子進程稱為僵尸進程。這種情 況我們應該避免(父進程或者忽略SIGCHILD信號,或者捕捉它,或者wait它派生的子進程,或者父進程先終止,這時子進程的終止自動由init進程來接管)。
18) SIGCONT
讓一個停止(stopped)的進程繼續執行. 本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態變為繼續執行時完成特定的工作. 例如, 重新顯示提示符...
19) SIGSTOP
停止(stopped)進程的執行. 注意它和terminate以及interrupt的區別:該進程還未結束, 只是暫停執行. 本信號不能被阻塞, 處理或忽略.
20) SIGTSTP
停止進程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字符時(通常是Ctrl-Z)發出這個信號
21) SIGTTIN
當后臺作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號. 缺省時這些進程會停止執行.
22) SIGTTOU
類似于SIGTTIN, 但在寫終端(或修改終端模式)時收到.
23) SIGURG
有"緊急"數據或out-of-band數據到達socket時產生.
24) SIGXCPU
超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變。
25) SIGXFSZ
當進程企圖擴大文件以至于超過文件大小資源限制。
26) SIGVTALRM
虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進程占用的CPU時間.
27) SIGPROF
類似于SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間.
28) SIGWINCH
窗口大小改變時發出.
29) SIGIO
文件描述符準備就緒, 可以開始進行輸入/輸出操作.
30) SIGPWR
Power failure
31) SIGSYS
非法的系統調用。
在以上列出的信號中,程序不可捕獲、阻塞或忽略的信號有:SIGKILL,SIGSTOP
不能恢復至默認動作的信號有:SIGILL,SIGTRAP
默認會導致進程流產的信號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默認會導致進程退出的信號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默認會導致進程停止的信號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默認進程忽略的信號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH
此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在進程掛起時是繼續,否則是忽略,不能被阻塞。
|
posted @
2011-08-16 11:55 哈哈的日子 閱讀(796) |
評論 (0) |
編輯 收藏
會報錯
sudo: sorry, you must have a tty to run sudo
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
只要用 ssh -t 就可以了。
或者修改 /etc/suoders
將 requirestty 注釋掉
posted @
2011-08-15 12:05 哈哈的日子 閱讀(1477) |
評論 (0) |
編輯 收藏
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
1. 使用默認隔離級別 repeatable read
2. 開始,使用 select @@tx_isolation 確認當前 session 的隔離級別,并且創建個表 create table tt (id int, name varchar(300)) engine=innodb
3. 啟動 transaction 1(t1),使用 start transaction
4. 啟動 transaction 2(t2), 再開個 mysql,使用 start transaction
5. 在 t2 執行 select * from tt
6. 在 t1 執行 insert into tt values(1, 'haha')
7. 在 t2 再次執行 select * from tt,是看不到數據的。
8. 在 t2 執行 update tt set name='hehe' where id=1
9. 在 t2 再再次執行 select * from tt,居然看到 id=1 那條 hehe 了!
10. 我們幻讀了......
參考自:
http://blog.bitfly.cn/post/mysql-innodb-phantom-read/
原作者寫得非常好
posted @
2011-08-02 17:59 哈哈的日子 閱讀(1487) |
評論 (4) |
編輯 收藏
摘要: 轉自:http://blog.csdn.net/wang382758656/article/details/5771332
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteed...
閱讀全文
posted @
2011-07-28 12:03 哈哈的日子 閱讀(1339) |
評論 (2) |
編輯 收藏
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
因為連接數的問題,我不得不在一臺機器上多啟 mysql instance
1. 建立兩個 mysql 數據庫實例
mysql_install_db --datadir=xxx
2. 配置 /etc/my.cnf
[client]
#password = your_password
#port = 3306
#socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = mysql
password = mysql
[mysqld1]
datadir = /home/intple/mysql/data1
max_connections = 800
long_query_time = 0.1
#log-queries-not-using-indexes
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
port = 3306
socket = /home/intple/mysql/data1/mysql.sock
skip-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 32
query_cache_size = 512M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 32
log-bin=mysql-bin
server-id = 1
binlog_format=mixed
innodb_buffer_pool_size = 20G
innodb_additional_mem_pool_size = 32M
innodb_thread_concurrency = 32
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 256M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 1
innodb_autoextend_increment = 64M
innodb_lock_wait_timeout = 200
[mysqld2]
datadir = /home/intple/mysql/data2
max_connections = 800
long_query_time = 0.1
#log-queries-not-using-indexes
slow_query_log = 1
slow_query_log_file = /var/log/mysql2-slow.log
port = 3307
socket = /home/intple/mysql/data2/mysql2.sock
skip-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 32
query_cache_size = 512M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 32
log-bin=mysql-bin
server-id = 1
binlog_format=mixed
innodb_buffer_pool_size = 20G
innodb_additional_mem_pool_size = 32M
innodb_thread_concurrency = 32
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 256M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 1
innodb_autoextend_increment = 64M
innodb_lock_wait_timeout = 200
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
3. 啟動
mysqld_multi start 1 &
mysqld_multi start 2 &
posted @
2011-07-12 15:59 哈哈的日子 閱讀(568) |
評論 (0) |
編輯 收藏
應該是因為 ipv6 的原因,我 lsof -i -P | grep xxx , xxx 是那個 udp multicast 的 ip,是可以看到這個端口被使用了的,但還是一直報錯。 Can't assign requested address
后來查了一下,在啟動 java 參數上加上 -Djava.net.preferIPv4Stack=true 就解決了。
posted @
2011-07-01 10:23 哈哈的日子 閱讀(340) |
評論 (0) |
編輯 收藏
轉自:http://xok.la/2010/01/mysqlslap_test.html
mysqlslap是官方提供的壓力測試工具之一,官方介紹如下:
mysqlslap is a diagnostic program designed to emulate client load for a MySQL server and to report
the timing of each stage. It works as if multiple clients are accessing the server. mysqlslap is
available as of MySQL 5.1.4.
下面介紹一些常見參數:
--auto-generate-sql-write-number
每個線程中產生多少個insert
--auto-generate-sql-guid-primary
自動產生guid格式的主鍵
--number-of-queries=50000
每個連接客戶端總共發起的查詢次數
--concurrency=10,50,100
并發連接線程數,分別是10、50、100個并發
-i, --iterations
重復執行測試的次數
--number-char-cols=10
創建測試表的 char 型字段數量
--number-int-cols=10
創建測試表的 int 型字段數量
下面是一個完整的例子:
mysqlslap -hlocalhost -uroot --engine=innodb --auto-generate-sql-write-number=100000 \
--auto-generate-sql-guid-primary --concurrency=10,50,100 --number-of-queries=50000 \
--iterations=2 --number-char-cols=10 --number-int-cols=10 --auto-generate-sql \
--create-schema=sbtest --auto-generate-sql-load-type=mixed
具體的慢慢看手冊吧,mysqlslap在mysql的目錄的bin目錄內。
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2011-06-28 16:58 哈哈的日子 閱讀(194) |
評論 (0) |
編輯 收藏