@title [筆記]事務處理
#1 Transaction Propagation Behavior
Required:Excute within a current tx, create a new one if none exists.
Supports: Excute within a current tx, execute without a tx if none exsits.
Mandatory: Excute within a current tx, throw an exception if none exists.
Requires New: Create a new tx and excute within the tx, suspend the current tx if one exists.
Not Supported: Excute without a tx, suspend the current tx if none exsits.
Never: Excute without a tx, throw an exception if a tx exsits.
#2 Transaction Isolation Level[1]
#2.1 Concurrent Problem
Dirty Reads: 臟讀(臟數據指已更新,還沒提交的數據)。事務T1讀取到事務T2中的臟數據。
Unrepeatable Reads: 不可重復讀。事務T1檢索到某行后,事務T2更新并提交了該行,若事務T2再次檢索該行,則會看到不一樣的結果。
Phantom Reads: 虛讀。事務T1檢索到符合某條件的行集后,事務T2插入并提交了滿足該條件的新行,若事務T2再次按該條件檢索,則會看到以前不存在的行“Phantom”。
#2.2 Isolation Level
+---------------+-------+------------------+-----------+
|Isolation Level|Phantom|Unrepeatable Reads|Dirty Reads|
+---------------+-------+------------------+-----------+
|Read Uncommited| Y | Y | Y |
+---------------+-------+------------------+-----------+
|Read Commited | Y | Y | N |
+---------------+-------+------------------+-----------+
|Repeatable Read| Y | N | N |
+---------------+-------+------------------+-----------+
|Serializable | N | N | N |
+---------------+-------+------------------+-----------+
#3 Timeout
#4 ReadOnly Transaction
只讀事務保證了多條查詢SQL的在事務級別的讀一致性。JDBC和數據庫會對只讀事務做一些優化。
[1] C.J.Date, An Introduction to Database Systems 7th.
iteration::two Cairngorm 0.99 開發指南
@author sakis
@version 0.1
#0
MXML優點:使用方便,XML代碼簡潔易懂
缺點:事件、函數、界面描混在一起。程序規模大了難于開發維護。
#1
Cairngorm框架是iterationtwo推出的號稱基于JEE Best Practice的Flex程序開發的light-weight framework。(恩,light-weight這個詞還真是流行呢)。目前最新版本為0.99。
Cairngorm的結構如下:
org
└─nevis
└─cairngorm
├─application
│ CairngormApplication.as
│
├─business
│ Responder.as
│ ServiceLocator.as
│
├─commands
│ Command.as
│ SequenceCommand.as
│
├─control
│ Event.as
│ EventBroadcaster.as
│ FrontController.as
│
├─model
│ ModelLocator.as
│
├─view
│ ViewHelper.as
│ ViewLocator.as
│
└─vo
ValueObject.as
#2
下面給大家簡單介紹Cairngorm的實現思路。
#2.1
Command/FrontController將Event與Viwe分離。
FrontController實現Singleton模式(以下簡寫為SP)。所有自定義的Command在要在FrontController構造函數中實例化并以關聯數組的方式注冊FrontController#addCommand(eventType:String, commandInstance:Command)。EventBroadcaster實現SP。Event類的結構為{type:eventType, data:eventData}。我們通過EventBroadcaster#broadcastEvent(eventType:String, eventData:Object)發布Event。Event發布后,與eventType對應的command instance執行Command#execute(event:Event)。
BTW:在Cairngorm的源碼中,eventType、commandName、eventName混用,我統一用eventType。
#2.2
ServiceLocator將Remote Service聲明與View分離。
ServiceLocator實現SP。在Cairngorm的demo中,又通過Delegate對象解除Command/Responder和ServiceLocator之間的依賴。這個Delegate做的事情其實意義不大,就是調用ServiceLocator中的Method,設置莫個Responder為相應遠程方法的handler。個人覺得無謂地增加了代碼量,而且Delegate對象也沒實現SP,也就是說我們每次調用一次Remote Service中的Method,都要new一個Delegate對象,實在浪費。
#2.3
ViewLocator/ViewHelper將View(MXML)中夾雜的function與View分離。
ViewHelper有點意思,當一個ViewHelper在某個MXML頁面中聲明時,如<view:LoginViewHelper id="loginViewHelper" />
#2.4
ModelLocator是一個marker interface,程序中Model可以放在某個ModelLocator方便調用。
#2.5
ValueObject也是一個marker interface, 基本不需要。
#3
Cairngorm.99給我們開發Flex程序提供了很不錯的架構模式,M/V/C/Remote之間可以做到完全解構。但在實際開發時沒有必要死扣,代碼結構清晰有活力就好。
Hibernate一對一關聯實用介紹
#0
書和文檔上寫的都不是特清楚的。自己記下來。
#1 Using a PK association
#1.1 POJO with XDolclet annotation
public class Customer {
/**
* @return Returns the shoppingCart.
* @hibernate.many-to-one cascade="delete" column="shopping_cart_id"
* unique="true" foreign-key="FK_SHOPPING_CART__CUSTOMER"
*/
public ShoppingCart getShoppingCart() {
return shoppingCart;
}
}
public class ShoppingCart {
/**
* @return Returns the customer.
* @hibernate.one-to-one property-ref="shoppingCart"
*/
public Customer getCustomer() {
return customer;
}
}
property-ref="shoppingCart" 告訴Hibernate ShoppingCart#customer和Customer#shoppingCart是反向的關系。所以Hibernate知道如何從ShoppingCart#getCustomer中檢索到相應的customer對象。取出某個Customer對象時,Hibernate會生成DEBUG SQL:324 - 3中的SQL語句。
#1.2 HBM
Customer.hbm.xml
<many-to-one
name="shoppingCart"
class="ShoppingCart"
cascade="delete"
outer-join="auto"
foreign-key="FK_SHOPPING_CART__CUSTOMER"
column="shopping_cart_id"
/>
ShoppingCart.hbm.xml
<one-to-one
name="customer"
class="Customer"
cascade="none"
outer-join="auto"
constrained="false"
property-ref="shoppingCart"
/>
#1.3 SCHEMA SQL
create table CUSTOMER (
ID bigint generated by default as identity (start with 1),
SHOPPING_CART_ID bigint,
primary key (ID)
)
create table SHOPPING_CART (
ID bigint generated by default as identity (start with 1)
primary key (ID)
)
alter table CUSTOMER
add constraint FK_SHOPPING_CART__CUSTOMER
foreign key (SHOPPING_CART_ID)
references SHOPPING_CART
#1.4 Query SQL
DEBUG SQL:324 - 1
select customer0_.ID as ID, customer0_.SHOPPING_CART_ID as SHOPPING2_3_, customer0_.USERNAME as USERNAME3_, customer0_.PWD as PWD3_
from CUSTOMER customer0_
where customer0_.USERNAME=? and customer0_.PWD=?
DEBUG SQL:324 - 2
select shoppingca0_.ID as ID0_, shoppingca0_.TOTAL as TOTAL8_0_
from SHOPPING_CART shoppingca0_
where shoppingca0_.ID=?
DEBUG SQL:324 - 3
select customer0_.ID as ID1_, customer0_.SHOPPING_CART_ID as SHOPPING2_3_1_, customer0_.USERNAME as USERNAME3_1_, customer0_.PWD as PWD3_1_, shoppingca1_.ID as ID0_, shoppingca1_.TOTAL as TOTAL8_0_
from
CUSTOMER customer0_
left outer join
SHOPPING_CART shoppingca1_
on customer0_.SHOPPING_CART_ID=shoppingca1_.ID
where customer0_.SHOPPING_CART_ID=?
#2 Using a FK association
#2.1 POJO with XDolclet annotation
public class Customer {
/**
* @return Returns the shoppingCart.
* @hibernate.one-to-one cascade="delete"
*/
public ShoppingCart getShoppingCart() {
return shoppingCart;
}
}
public class ShoppingCart {
/**
* @return Returns the id.
* @hibernate.id generator-class="foreign"
* @hibernate.generator-param name="property" value="customer"
*/
public Long getId() {
return id();
}
/**
* @return Returns the customer.
* @hibernate.one-to-one constrained="true" foreign-key="FK_CUSTOMER__SHOPPING_CART"
*/
public Customer getCustomer() {
return customer;
}
}
constrained="true" 告訴Hibernate ShoppingCart的PK還應該是一個FK,這個FK引用Customer的PK。還需要多做一點工作,聲明ShoppingCart的PK生成策略是foreign,對應ShoppingCart#customer。這和上面一句話不是一個意思嘛,FT~~
#2.2 HBM
Customer.hbm.xml
<one-to-one
name="shoppingCart"
class="ShoppingCart"
cascade="delete"
outer-join="auto"
constrained="false"
/>
ShoppingCart.hbm.xml
<id
name="id"
column="id"
type="java.lang.Long"
>
<generator class="foreign">
<param name="property">customer</param>
</generator>
</id>
<one-to-one
name="customer"
class="Customer"
cascade="none"
outer-join="auto"
constrained="true"
/>
#2.3 SCHEMA SQL
create table CUSTOMER (
ID bigint generated by default as identity (start with 1),
primary key (ID)
)
create table SHOPPING_CART (
ID bigint not null,
TOTAL integer,
primary key (ID)
)
alter table SHOPPING_CART
add constraint FK_CUSTOMER__SHOPPING_CART
foreign key (ID)
references CUSTOMER
#2.4 Query SQL
DEBUG SQL:324 -
select customer0_.ID as ID, customer0_.USERNAME as USERNAME3_, customer0_.PWD as PWD3_
from CUSTOMER customer0_
where customer0_.USERNAME=? and customer0_.PWD=?
DEBUG SQL:324 -
select shoppingca0_.ID as ID0_, shoppingca0_.TOTAL as TOTAL8_0_
from SHOPPING_CART shoppingca0_
where shoppingca0_.ID=?
這個“真正”的one-to-one的好處是少條關聯SQL語句,看到了嗎?
在google里敲了“HelloWolrd”,再點“手氣不錯”,出來了這樣一個頁面:http://www2.latech.edu/~acm/HelloWorld.shtml
Hello World!
Welcome to the ACM "Hello World" project. Everyone has seen the Hello World program used as a first exposure to a new language or environment. We are attempting to collect examples for as many languages and related programming environments (shells etc.) as possible.
Aproximate number of examples:204 <----wow~~~
This page has been accessed 33274 times.
Last updated: January 20, 2005
看看C的,經典HelloWorld
#include <stdio.h>
main()
{
for(;;)
{
printf ("Hello World!\n");
}
}
這也是HelloWolrd?!
a 1986 entry from Bruce Holloway:
#include "stdio.h"
#define e 3
#define g (e/e)
#define h ((g+e)/2)
#define f (e-g-h)
#define j (e*e-g)
#define k (j-h)
#define l(x) tab2[x]/h
#define m(n,a) ((n&(a))==(a))
long tab1[]={ 989L,5L,26L,0L,88319L,123L,0L,9367L };
int tab2[]={ 4,6,10,14,22,26,34,38,46,58,62,74,82,86 };
main(m1,s) char *s; {
int a,b,c,d,o[k],n=(int)s;
if(m1==1){ char b[2*j+f-g]; main(l(h+e)+h+e,b); printf(b); }
else switch(m1-=h){
case f:
a=(b=(c=(d=g)<<g)<'<g)<<g;
return(m(n,a|c)|m(n,b)|m(n,a|d)|m(n,c|d));
case h:
for(a=f;a
return(o[b-g]%n+k-h);
default:
if(m1-=e) main(m1-g+e+h,s+g); else *(s+g)=f;
for(*s=a=f;a<e;) *s=(*s<<e)|main(h+a++,(char *)m1);
}
}
曾經最短的HelloWorld(Jari.Arkko@lmf.eua.ericsson.se)
jar.1.c
char*_="Hello world.\n";
ln -s /dev/tty jar.1.o
cc -c jar.1.c
現在最短的HelloWorld (Jyrki Holopainen)
";main(){puts("Hello World!");}char*C=".c
char*_=__FILE__;
抵達深圳
在中國改革開放的貞操牌坊,更加強烈感受了GCD領導下的中國特色的社會主義和諧社會。羅湖區1w的小套間,隨處可見benz和BMW。晚上去吃海鮮,一盤盤的叫不上名來,味道倒是鮮美:-)
實習第一天
XX信息公司研發部實習員工登記,領工卡,認識組員,了解項目情況,做了一天需求分析,easy。在公司里寫程序的感覺和學校不大一樣,一邊寫一邊就能聽到boss在隔壁辦公室訓斥某人。小小的不滿:液晶顯示器不多,自然輪不到我。小小小的不滿:QQ不能用就算了,msn好像都不能用。
性能比較:Java全面超越C++?
這樣的八卦炒作貼也能在java.csdn.net上置頂,真是無語了~我只想對csdn說:“你太差了!”
《程序員》每期都會買,是因為我沒的選擇。作為一本技術刊物,《程序員》不是保持中立,而是摻雜了太多的商業立場和利益。高水平的文章也有,但遠遠不夠。該雜志一主編感嘆沒有對手,說《DDJ China》“幾乎是一個合格的對手了”。說的極端和刻薄一點,《DDJ》是軟件開發的學術刊物,csdn、《程序員》只能算是程序員的娛樂新聞雜志。
這是一個署名“周星星”的同學對原文的評論。
周星星 發表于2005-06-16 5:01 PM
“很明顯,C++的編譯器不如java的JIT和HotSpot編譯器,因為JIT和HotSpot編譯器能針對CPU指令集進行人優化、能在運行時根據使用頻率對method進行內聯和優化。而C++的靜態編譯器永遠也做不到這些”
--- 無知了吧,現存于世的C++編譯器,無論是VC++,還是Intel C++,還是g++,都能針對特定CPU進行優化;而Java的所謂動態優化只是做了部分(不是全部)C++靜態優化的工作;事實上,真正的動態優化不是任何一個高級語言所能做到的,C++不能,C不能,Java更不能,必須內嵌匯編才能做到這一點。
“JDK1.0時,java的速度是C++的20到40分之一。而到了jdk1.4時,java的性能則是C++的三分之一到2倍(通常C++是java的1.2倍到1.5倍)。可惜這分報告沒有jdk1.4以后的數據,而后面的報告我們將看到在jdk1.4.2時,java性能全面超過C++。”
--- 有個10歲的小孩子對她30母親說:“9年前我的年齡是妳的1/21,我現在的年齡是妳的1/3,隨著這種趨勢的發展,在未來我的年齡就可以超過妳。”
Java的速度也許可以接近C++,但永遠不可能達到C++一樣快,更不可能超過C++,因為解釋程序必須要求原生程序來解釋執行,所以永遠達不到一樣的速度。
“Java寫的數據庫的性能是C++寫的數據庫性能的近600倍!”
--- 天方夜譚,如果真的這樣,MS SQL為什么不用Java來編寫,Oracle為什么不用Java來編寫,MySQL為什么不用Java來編寫?
“伯克利大學和Lawrence伯克利國家實驗室的一份報告證明:IBM的JDK比GCC更快”
--- 伯克利大學真的有這個報告嗎?真是玷污伯克利的威名,把JDK和GCC放在一起比,如同把“長度”和“重量”這兩種不同性質的東西放在一起比。
“用純java寫的JDK底層要比用C++寫JDK底層要快”
--- 暈,“純java寫的JDK”,教你Java的老師被你氣跳樓了。