????以前上學的時候數(shù)據(jù)庫學的是皮毛中的皮毛,唯一的課程設計也只是跑幾個簡單得很得SQL語句而已。無論是數(shù)據(jù)庫設計,還是SQL語句的各種經(jīng)典寫法和強大功能都沒有怎么好好地研究過。
??????? 功能上的學習都不全面,就更不要提性能、安全和大數(shù)據(jù)量等等在實際應用中會遇到的問題勒。參與的一個項目中,就涉及到比較大量的數(shù)據(jù)量的處理和存儲(當然處理大數(shù)據(jù)量就是另外一個問題勒)。加之分配給數(shù)據(jù)庫所在的磁盤空間相當有限,造成了非常捉襟見肘的局面。
??????? 幻想著有朝一日可以不為這些事情煩惱,像google,sina一樣,用幾十上百臺配置一般的機器連起來也能作為一個強壯的server。
從網(wǎng)上看到一些關于存儲海量數(shù)據(jù)的討論:
1、分表、分數(shù)據(jù)庫
根據(jù)一定的規(guī)則把不同的數(shù)據(jù)庫表分開
缺點:有一定風險,因為一旦分開存放的兩個數(shù)據(jù)庫表有朝一日需要“聯(lián)表”操作,那么就郁悶了,而且最好是把幾個數(shù)據(jù)量大的表分開,單獨拎出來幾個小表意義很不大,而且業(yè)務邏輯層的代碼需要知道自己要處理的數(shù)據(jù)存在哪個服務器里,有一點兒奇怪。
例如:(來自ball_lei)
??????? 我現(xiàn)在采用的架構采用數(shù)據(jù)庫群的方式,每個客戶的數(shù)據(jù)單獨存在一臺數(shù)據(jù)庫服務器上,所有的客戶根據(jù)一定的規(guī)則安排存放的數(shù)據(jù)庫服務器,在主數(shù)據(jù)庫服務器上有一張-索引表保存客戶與數(shù)據(jù)庫服務器的對應關系,每臺數(shù)據(jù)庫服務器中用于存放這些數(shù)據(jù)的表按照月份分成12張,每張存放當月的全部客戶的數(shù)據(jù),目前計算出單臺服務器-單表需要容納9億條數(shù)據(jù),并且每臺服務器在這種方式下可以容納10000個客戶的數(shù)據(jù),以后客戶數(shù)量增加時只需要增加數(shù)據(jù)庫服務器即可。
??????? 程序邏輯,我采用業(yè)務邏輯層的概念,對外提供應用服務器接口,全部的客戶端通過應用服務器接口進行業(yè)務運算,應用服務器我也采用服務器群的概念,有一個主的應用服務器,有幾個副應用服務器,全部客戶端只知道該主應用服務器的地址,上線時登陸主應用服務器,然后主應用服務器根據(jù)各臺應用服務器的負載情況返回給客戶端真正的登陸地址(副應用服務器的地址),然后客戶端再登陸到上面進行業(yè)務處理,每臺應用服務器都能夠訪問各臺數(shù)據(jù)服務器進行數(shù)據(jù)提取。
問題:需要每臺應用服務器都配備一個公網(wǎng)ip么,還是有其他的方式可以只需要一個公網(wǎng)ip可以給全部的服務器公用?Nat能夠實現(xiàn)么?或者能否進行更好的負載均衡,就是客戶端的各種業(yè)務都可以在不同的服務器上運算
改進:
用戶規(guī)則配置應該不大,所以也可以做成配置一次Load到內(nèi)存中。
如此大數(shù)據(jù)量的項目竟不用Oracle,實在讓人費解。我現(xiàn)在的月數(shù)據(jù)量大概2.5億,用了3臺HP
SUPERDEMO,9個CUSTERMOR DB。其中一個CATALOG數(shù)據(jù)庫,相當于你的客戶索引。
你的插入操作很多,所以建議少建幾個索引,其實一些業(yè)務完全可以在數(shù)據(jù)庫中完成,通過觸發(fā)器,約束和存儲過程,這樣性能會有大的提高。大數(shù)據(jù)的表,分區(qū)的確是必須的,當然,還需要更完善的維護計劃,否則很容易,你的業(yè)務可能就會因為性能問題掛起了。
1、通過(數(shù)據(jù)庫+文件)方式進行數(shù)據(jù)存儲
2、集群方案
還有當初選修的“分布式數(shù)據(jù)庫”,不知道這個概念是不是能夠活生生的用到項目中來。。。
DAO層: JUnit test,需要用dbunit恢復現(xiàn)場;
service層:JUnit test,需要用dbunit恢復現(xiàn)場,邏輯更重要些,分支覆蓋更重要些;
action:不做測試;
selenium:做集成測試。
????盡管有人認為struts action不需要做測試,不過無意中看到strutsTestCase這個東東,還沒有試,用途是測試struts的action.覺得比較有用.
????尤其是,如果web頁面交由第三方來做的話,那么單獨對action進行測試就是十分有必要的.
????但是,如果整個web系統(tǒng)從前臺到后臺都是一個team來做,那么個人認為還不如跟頁面一起集成測,畢竟這是真實情況,而且從頁面上可視性更強,更容易發(fā)現(xiàn)問題.與此同時,使用腳本錄制回放測試工具(還沒有試過)提高效率.
“jMock利用mock objects思想來對Java code進行測試。jMock具有以下特點:容易擴展,讓你快速簡單地定義mock objects,因此不必打破程序間的關聯(lián),你定義靈活的超越對象之間交互作用而帶來測試局限,減少你測試地脆弱性。”
??? 跟JMock功能類似的還有EasyMock。
??? 簡單試驗后的感覺沒有試驗DBUnit后的感覺強烈,試了DBUnit的感覺是這東西以后一定要用.
??? 但個人認為mock object這種東西能不用就不用,模擬來模擬去,最后還是要和真東西聯(lián)調,所以mock的階段應該是盡可能的短才是.
使用模仿對象進行測試的常用編碼樣式是:
· 創(chuàng)建模仿對象的實例
· 設置模仿對象中的狀態(tài)和期望值
· 將模仿對象作為參數(shù)來調用域代碼
· 驗證模仿對象中的一致性
代碼中的大概過程:
???? Mock mock = new Mock(**.class);//構造一個那個類的mock對象,把這個類傳入Mock
???? 使用mock.expects方法,來設置想要執(zhí)行的操作:執(zhí)行幾次、執(zhí)行哪個方法、傳什么參、返回什么值
?????獲得那個mock對象:** x = (**)mock.proxy();//proxy方法返回代理類實例,即虛擬對象實例
???? 然后run **.class的那個方法(call methods on the mock object, expectation on it will deliver the result set up by yourself)
???? 寫mock-object 測試,需要有獨立的接口作為mock的對象(從而促進了針對接口編程的習慣),還有個好的副作用:他迫使你來重寫一些代碼。實際上,代碼常常寫的不好。你讓類和環(huán)境之間產(chǎn)生了不必要的耦合。
DBUnit擴展自JUnit.在使用DBUnit之前,為了驗證自己編寫的涉及數(shù)據(jù)庫操作方法的正確性,每次都要執(zhí)行一個簡單的sql腳本,灌些數(shù)據(jù),然后人眼觀察著數(shù)據(jù)表中的數(shù)據(jù).然后,代碼執(zhí)行完畢后,再次觀察數(shù)據(jù)變化情況.久而久之,表里面的數(shù)據(jù)就變得雜亂,一般會全部刪除,重新來過.
??? DBUnit的目標正是保證數(shù)據(jù)庫數(shù)據(jù)環(huán)境的穩(wěn)定性,具備將數(shù)據(jù)庫中數(shù)據(jù)與xml文件之間雙向轉換的能力.
試驗了一下,
首先,下載dbunit的jar包,加入工程即可.
1.從xml中將數(shù)據(jù)導入數(shù)據(jù)庫表
tc不再繼承自TestCase,而是繼承DatabaseTestCase
覆蓋幾個方法,包括獲得xml文件內(nèi)容,獲得DB連接,以及在setup方法和teardown方法中調用提供的dbunit操作類型,構建數(shù)據(jù)庫內(nèi)數(shù)據(jù)環(huán)境.
這時,我以為如果只有幾個簡單的數(shù)據(jù),寫xml固然簡單,但想測試大數(shù)據(jù)量時(雖然UT主要是測試功能而非性能,但是大數(shù)據(jù)量也方便驗證)就有點問題,好在是雙向的,可以先把數(shù)據(jù)用function灌入數(shù)據(jù)庫,再導進xml里面:
2.從數(shù)據(jù)庫表數(shù)據(jù)導入xml文件
??? 用ant+DBUnit來完成這個任務非常方便!
<
target?
name
="export"
>
????????
<
taskdef?
name
="dbunit"
?classname
="org.dbunit.ant.DbUnitTask"
?classpathref
="compile.path"
?
/>
????????
<
dbunit?
driver
="com.mysql.jdbc.Driver"
?url
="jdbc:mysql://127.0.0.1:3306/mydb"
?userid
="root"
?password
="root"
?supportBatchStatement
="true"
>
????????????
<
export?
dest
="${test.srcpath}/export.xml"
>
????????????????
????????????????
<
query?
name
="test_table"
?sql
="SELECT?*?FROM?test_table"
?
/>
????????
????????????????
<
table?
name
="user_table"
?
/>
????????????
</
export
>
????????
</
dbunit
>
????
</
target
>
??? 疑問,看到有人說DBUnit在清除數(shù)據(jù)時,有時不能徹底,原因是分析不出來外鍵等表之間的約束.因為在試驗中采用的數(shù)據(jù)庫里沒啥表之間的約束,所以還沒有體會到.
??? DatabaseTestCase類提供了兩個方法來控制測試前和測試后的數(shù)據(jù)庫狀態(tài):getSetUpOperation() 和 getTearDownOperation().???????
??? 一種高效的實施方案就是讓getSetUpOperation()方法執(zhí)行REFRESH操作,通過這個操作,我們可以用種子文件中的數(shù)據(jù)去更新目標數(shù)據(jù)庫里的數(shù)據(jù)。
??? 接下來,就是getTearDownOperation(),讓他去執(zhí)行一個NONE操作,也就是什么也不執(zhí)行
??? 常用操作:
??? DatabaseOperation.CLEAN_INSERT;?先刪除表中所有,再插入準備的數(shù)據(jù)
??? DatabaseOperation.REFRESH;?使用準備數(shù)據(jù)更新表,存在則update,不存在則insert
??? DatabaseOperation.DELETE;??只刪除準備的數(shù)據(jù)
??? DatabaseOperation.NONE;??啥都不做
前提:testlink已經(jīng)跟mantis安裝在同一個環(huán)境下
步驟:
參照http://crystaliris.bokee.com/5588155.html,testlink網(wǎng)站也給出了比較清楚的文檔說明。
1.修改testlink關于interface的配置為"MANTIS",如果用別的BTS(Bug Trace System),有其他的對應值。
2.修改testlink目錄下cfg/mantis.cfg.php(如果用別的BTS,修改其他對應目錄下的配置),配置一些關于mantis的數(shù)據(jù)庫和url屬性。
3.修改mantis的配置文件,打開匿名登錄,由于匿名登錄的用戶名需要是一個已經(jīng)存在的真實用戶,而我又沒在mantis上創(chuàng)建新的用戶,所以就填寫成administrator了。
測試RMI接口實現(xiàn)修改后,jar包用不用重新打
可以的,接口實現(xiàn)修改了,只要接口定義不變,RMIClient調用后,都會按照Server端最新的實現(xiàn)來得到結果.
在class文件的根目錄下(例如bin目錄)執(zhí)行rmic命令,寫完整接口實現(xiàn)的包名。
環(huán)境:windows
下載scarab-1.0-b20.zip,直接解壓即可.
需要JDK,Ant(或者maven,scarab推薦maven),DB(推薦MySQL)
在解壓后的\scarab-1.0-b20目錄中,創(chuàng)建build.properties,以指定數(shù)據(jù)庫連接的參數(shù).
例如:
scarab.database.type=mysql
scarab.database.name=scarab
scarab.database.jdbc.driver=org.gjt.mm.mysql.Driver
scarab.database.host=localhost
scarab.database.port=3306
scarab.database.username=root
scarab.database.password=root
scarab.database.admin.username=${scarab.database.username}
scarab.database.admin.password=${scarab.database.password}
#發(fā)送郵件的郵件服務器也可以寫在這里
system.mail.host=smtp.126.com
數(shù)據(jù)庫方面,本來想使用postgreSQL,結果發(fā)現(xiàn)對于scarab來說配置比較特殊,于是就裝了MySQL[見MySQL的那篇文吧].
數(shù)據(jù)庫配置寫好以后,進入\scarab-1.0-b20\build\目錄,運行ant,就對scarab進行構建啦,能夠看到BUILD SUCCESSFULLY就成功啦!!
感覺scarab可以配置的地方很多很多,不過配置修改后還是需要重新build的.之前遇到過的錯誤就是在寫好數(shù)據(jù)庫配置后沒有重新build造成的.
構建成功后,就可以使用啦: 進入\scarab-1.0-b20\tomcat\bin目錄,運行startup.bat,tomcat就啟動起來了,訪問http://localhost:8080/scarab/就可以啦。
因為很多功能都需要發(fā)郵件來協(xié)助,所以要使用SMTP服務器,比方說smtp.126.com,user=realuser,password=realuserpassword
總得來說,覺得scarab界面不是很友好,也不是很美觀。
由于一開始郵件服務器不能用,所以直接到數(shù)據(jù)庫中update用戶的狀態(tài)為CONFIRMED。這樣子成功登錄后,點擊“申請新角色”時,竟然拋出錯誤了,不知道是什么原因,無法繼續(xù)了,挺郁悶的。
C-JDBC(Java 數(shù)據(jù)庫連接群集)作為開發(fā)源碼的數(shù)據(jù)庫群集中間件,可以讓任何應用程序通過JDBC能夠透明的訪問數(shù)據(jù)庫群集。數(shù)據(jù)庫可以分布在多個節(jié)點并可以進行數(shù)據(jù)復制,C-JDBC能夠均衡在這些節(jié)點之間的查詢負載。 C-JDBC通過軟件來實現(xiàn)RAIDb(廉價數(shù)據(jù)庫冗余陣列)。C-JDBC是GNU LGPL許可證下的ObjectWeb項目。
http://c-jdbc.objectweb.org/網(wǎng)站上的C-JDBC-Brochure-EN.pdf寫的內(nèi)容挺好。(C-JDBC)tutorial.pdf內(nèi)容也挺翔實。
大型應用隨著用戶量訪問越來越大,增加數(shù)據(jù)庫存儲和做好數(shù)據(jù)庫冗余可以增加系統(tǒng)的可靠性和性能。
無需修改客戶端應用程序,無需變更應用服務器或數(shù)據(jù)庫服務器軟件。C-JDBC的JDBC driver把SQL請求轉給C-JDBC controller(負責在databases之間做負載均衡)
The database is distributed and replicated among several nodes and C-JDBC load balances the queries between these nodes.
就這一句話就太誘人了!
上周的某一個上午,搞定C-JDBC的安裝配置啦~
主要根據(jù)官方的user guide和這篇好文: http://huaronghu.spaces.live.com/blog/cns!B9A68E1C1CA857AD!288.entry
準備工作:
環(huán)境:windows,postgreSQL,JDK
建立數(shù)據(jù)庫“們”,安裝若干db在若干server上,所以如果使用商業(yè)數(shù)據(jù)庫的話,就會需要好幾套的錢哪。
安裝C-JDBC:
下載了binary版的c-jdbc-2.0.2-bin.zip,解壓到作為C-JDBC server的機器上(e.g. C:\software\c-jdbc-2.0.2-bin),
設置環(huán)境變量,新增系統(tǒng)變量:CJDBC_HOME =C:\software\c-jdbc-2.0.2-bin
把實際使用的數(shù)據(jù)庫的JDBC driver(例如mysql-connector-java-3.1.12-bin.jar ,postgresql-8.0.309.jdbc2.jar)拷貝到c-jdbc/drivers 中
配置文件:
在c-jdbc-2.0.2-bin/config/virtualdatabase目錄中創(chuàng)建虛擬數(shù)據(jù)庫配置文件。
里面DatabaseBackend 標簽中定義的就是被集群的數(shù)據(jù)庫。
試驗時,創(chuàng)建了文件:postgresql-raidb1-distribution.xml,使用了2個postgreSQL數(shù)據(jù)庫,采用了全復制的方法。
注意,如果采用全復制,所以在2個數(shù)據(jù)庫上建庫、建表的全部腳本都要完全相同,否則將會報出mismatch的錯誤。
目前感覺配置里面最有用的配置就是<AuthenticationManager>,<DatabaseBackend>和<LoadBalancer>(還沒有仔細看)。
配置時可以參考已經(jīng)提供的例子,c-jdbc-2.0.2-bin/config/RAIDb-1-full-example.xml,里面對每一個屬性都有比較詳細的注釋,DatabaseBackend中還有各個開源數(shù)據(jù)庫連接的例子,挺貼心的。
<?
xml?version="1.0"?encoding="UTF8"
?>
<!
DOCTYPE?C-JDBC?PUBLIC?"-//ObjectWeb//DTD?C-JDBC?2.0.2//EN"?"http://c-jdbc.objectweb.org/dtds/c-jdbc-2.0.2.dtd"
>
<
C-JDBC
>
??
??
<
VirtualDatabase?
name
="myDB"
?maxNbOfConnections
="20"
?minNbOfThreads
="1"
?maxNbOfThreads
="20"
?blobEncodingMethod
="hexa"
>
????
<
AuthenticationManager
>
??????
<
Admin
>
???????
<
User?
username
="admin"
?password
="c-jdbc"
/>
??????
</
Admin
>
?
??????
<
VirtualUsers
>
????????
<
VirtualLogin?
vLogin
="boss"
?vPassword
="boss"
/>
??????
</
VirtualUsers
>
????
</
AuthenticationManager
>
???
<
DatabaseBackend?
name
="postgreSQLNode114"
?driver
="org.postgresql.Driver"
?url
="jdbc:postgresql://10.10.0.114:5432/clusterdb"
?connectionTestStatement
="select?now()"
>
?
<
DatabaseSchema?
dynamicPrecision
="column"
/>
??????
<
ConnectionManager?
vLogin
="boss"
?rLogin
="postgres9"
?rPassword
="12345"
>
?
<
RandomWaitPoolConnectionManager?
poolSize
="20"
/>
??????
</
ConnectionManager
>
????
</
DatabaseBackend
>
????
<
DatabaseBackend?
name
="postgreSQLNode155"
?driver
="org.postgresql.Driver"
?url
="jdbc:postgresql://10.10.0.155:5432/clusterdb"
?connectionTestStatement
="select?now()"
>
?
<
DatabaseSchema?
dynamicPrecision
="column"
/>
??????
<
ConnectionManager?
vLogin
="boss"
?rLogin
="postgres"
?rPassword
="abcde"
>
?
<
RandomWaitPoolConnectionManager?
poolSize
="20"
/>
??????
</
ConnectionManager
>
????
</
DatabaseBackend
>
????
<
RequestManager
>
??????
<
RequestScheduler
>
?????????
<
RAIDb-1Scheduler?
level
="passThrough"
/>
???
??????
</
RequestScheduler
>
??????
<
RequestCache
>
?????????
<
MetadataCache?
maxNbOfMetadata
="10000"
?maxNbOfField
="0"
/>
?????????
<
ParsingCache?
backgroundParsing
="false"
?maxNbOfEntries
="5000"
/>
???
?????????
<
ResultCache?
granularity
="table"
?maxNbOfEntries
="100000"
?pendingTimeout
="0"
>
???????
<
ResultCacheRule?
queryPattern
="default"
?timestampResolution
="1000"
>
?????????????
<
EagerCaching
/>
?????????
</
ResultCacheRule
>
?????????
</
ResultCache
>
??????
</
RequestCache
>
??????
<
LoadBalancer
>
?????????
<
RAIDb-1
>
?????????
<
RAIDb-1-LeastPendingRequestsFirst
/>
??
?????????
</
RAIDb-1
>
??????
</
LoadBalancer
>
????????
????
</
RequestManager
>
??
</
VirtualDatabase
>
</
C-JDBC
>
?
在c-jdbc-2.0.2-bin/config/controller目錄中創(chuàng)建一個c-jdbc controller的配置文件。
試驗時,創(chuàng)建的配置文件為:uud-controller-distributed.xml
<?
xml?version="1.0"?encoding="UTF8"?
?>
<!
DOCTYPE?C-JDBC-CONTROLLER?PUBLIC?"-//ObjectWeb//DTD?C-JDBC-CONTROLLER?2.0.2//EN"??"http://c-jdbc.objectweb.org/dtds/c-jdbc-controller-2.0.2.dtd"
>
<
C-JDBC-CONTROLLER
>
??
<
Controller?
port
="25322"
>
????
<
Report
/>
????
<
JmxSettings
>
??????
<
RmiJmxAdaptor?
port
="1091"
/>
????
</
JmxSettings
>
????
<
VirtualDatabase?
configFile
="postgresql-raidb1-distribution.xml"
?virtualDatabaseName
="myDB"
?autoEnableBackends
="true"
?checkpointName
="Initial_empty_recovery_log"
/>
??
</
Controller
>
</
C-JDBC-CONTROLLER
>
?
注意:Controller和VirtualMachine的配置文件不能采用相同的文件名
啟動:
在c-jdbc-2.0.2-bin\bin目錄下,運行controller.bat -f ../config/controller/uud-controller-distributed.xml
unix用戶使用controller.sh來啟動controller
截圖:(下回補)
湊合看一下吧,控制臺的正常輸出:
C:\software\c-jdbc-2.0.2-bin\bin>controller.bat -f ../config/controller/uud-cont
roller-distributed.xml
2007-03-07 15:16:44,017 INFO? controller.core.Controller C-JDBC controller (2.0.
2)
2007-03-07 15:16:44,439 INFO? controller.core.Controller Loading configuration f
ile: ../config/controller/uud-controller-distributed.xml
2007-03-07 15:16:44,752 INFO? controller.core.Controller JMX is enabled
2007-03-07 15:16:44,830 INFO? controller.core.Controller Starting JMX server on
host: 10.10.0.155
2007-03-07 15:16:46,376 INFO? backend.DatabaseBackend.postgreSQLNode114 Adding c
onnection manager for virtual user "boss"
2007-03-07 15:16:46,501 INFO? backend.DatabaseBackend.postgreSQLNode155 Adding c
onnection manager for virtual user "boss"
2007-03-07 15:16:46,642 INFO? controller.RequestManager.myDB Request manager wil
l parse requests with the following granularity: TABLE
2007-03-07 15:16:46,657 WARN? controller.virtualdatabase.myDB No recovery log ha
s been configured, enabling backend without checkpoint.
2007-03-07 15:16:48,641 INFO? backend.DatabaseBackend.postgreSQLNode114 Detected
?backend as: PostgreSQL
2007-03-07 15:16:49,063 WARN? backend.DatabaseBackend.postgreSQLNode114 Statemen
t.getGeneratedKeys not supported.
2007-03-07 15:16:49,579 INFO? backend.DatabaseBackend.postgreSQLNode114 Gatherin
g database schema
2007-03-07 15:16:49,782 INFO? controller.RequestManager.myDB Setting new virtual
?database schema.
2007-03-07 15:16:49,782 INFO? cjdbc.controller.cache Setting new database schema
.
2007-03-07 15:16:49,782 INFO? controller.loadbalancer.RAIDb1 Adding blocking tas
k worker thread for backend postgreSQLNode114
2007-03-07 15:16:49,797 INFO? controller.loadbalancer.RAIDb1 Adding non blocking
?task worker thread for backend postgreSQLNode114
2007-03-07 15:16:49,797 INFO? controller.RequestManager.myDB Database backend po
stgreSQLNode114 is now enabled
2007-03-07 15:16:50,922 INFO? backend.DatabaseBackend.postgreSQLNode155 Detected
?backend as: PostgreSQL
2007-03-07 15:16:51,328 WARN? backend.DatabaseBackend.postgreSQLNode155 Statemen
t.getGeneratedKeys not supported.
2007-03-07 15:16:52,172 INFO? backend.DatabaseBackend.postgreSQLNode155 Gatherin
g database schema
2007-03-07 15:16:52,390 INFO? controller.RequestManager.myDB Virtual database sc
hema merged with new schema.
2007-03-07 15:16:52,390 INFO? cjdbc.controller.cache Merging new database schema
2007-03-07 15:16:52,390 INFO? controller.loadbalancer.RAIDb1 Adding blocking tas
k worker thread for backend postgreSQLNode155
2007-03-07 15:16:52,390 INFO? controller.loadbalancer.RAIDb1 Adding non blocking
?task worker thread for backend postgreSQLNode155
2007-03-07 15:16:52,406 INFO? controller.RequestManager.myDB Database backend po
stgreSQLNode155 is now enabled
2007-03-07 15:16:52,422 WARN? VirtualDatabaseWorkerThread.myDB.metadata Metadata
?key [getMaxColumnsInIndex] is not compatible. (Backends are: [jdbc:postgresql:/
/10.10.0.114:5432/clusterdb] and [jdbc:postgresql://10.10.0.155:5432/clu
sterdb] ; Values are:[32] and [0])
2007-03-07 15:16:52,422 INFO? controller.core.Controller Adding VirtualDatabase
myDB
2007-03-07 15:16:52,437 INFO? controller.core.Controller Waiting for connections
?on 0.0.0.0:25322
2007-03-07 15:16:52,469 INFO? controller.core.Controller Controller started on 2
007.03.07 10 at 03:16:52 下午 GMT+08:00
2007-03-07 15:16:52,484 INFO? controller.core.Controller Controller 10.10.0.
155:25322 ready, listening to requests ...
遇到過的問題:
1、
剛啟動沒一會兒,就看到config文件讀取錯誤,控制臺信息也就此結束。
解決方法:controller.bat -f filename中filename的相對路徑和文件名竟然都寫錯了,汗。。。。
2、
啟動時,控制臺拋出ERROR以及exception,大意是connection failed, IP沒有配置到pg_hba.conf中
解決方法:雖然是連本機的一個數(shù)據(jù)庫,但是由于數(shù)據(jù)庫連接的url里面寫的是IP地址,所以仍然要把本機的IP地址配置到pg_hba.conf以允許其訪問。
3、
還是啟動時拋錯了,Connection test failed(org.postgresql.util.PSQLException:Backend start-up failed:FATAL:role "boss_user" does not exist.)
解決方法:原來是在自己寫的.xml配置文件中,DatabaseBackend標簽里面寫的用戶名和密碼需要是真實數(shù)據(jù)庫的真實用戶名和密碼。
最后都整好了,但是遇到一個warn的log:
backend.DatabaseBackend.postgreSQLNode155 Statement.getGeneratedKeys not supported
至今不知道是什么問題,有什么影響.
代碼部分:
只需要修改應用程序用到的jdbc driver的配置,把c-jdbc/drivers/目錄下的c-jdbc-driver.jar拷貝到應用程序的工程里,并加入到class-path中。
之前是使用 Class.forName("com.somevendor.jdbcDriver.Driver") 去連接某特定的數(shù)據(jù)庫
現(xiàn)在是使用 Class.forName("org.objectweb.cjdbc.driver.Driver") 統(tǒng)一處理。
連接字符串:DriverManager.getConnection("jdbc:cjdbc://localhost:25322/mycjdbc") 取得數(shù)據(jù)庫連接。
c-jdbc server稱為c-jdbc controller,聆聽請求們
其他所有通過c-jdbc來訪問的DB們稱為db backends.
jdbc:cjdbc://host1:port1,host2:port2/database
host是指跑著c-jdbc controller的機器IP,port是指controller監(jiān)聽客戶端鏈接的端口,默認端口號:25322
注意,不僅真正的DB安裝多個在多個機器上,c-jdbc controller也可以安在不同的機器上,這樣可以防止一個c-jdbc 壞掉帶來的風險。
例如:
Class.forName(
"
org.objectweb.cjdbc.driver.Driver
"
);?
DriverManager.getConnection(
"
jdbc:cjdbc://c1.objectweb.org,c2.objectweb.org/tpcw
"
);?
//
不驗證用戶名密碼
DriverManager.getConnection(
"
jdbc:cjdbc://host/db?user=me&password=secret
"
)
//
驗證用戶名密碼的寫法1
DriverManager.getConnection(
"
jdbc:cjdbc://host/db;user=me;password=secret
"
)
//
驗證用戶名密碼的寫法2
然后可以在代碼中insert/update幾個記錄,再單獨到各個數(shù)據(jù)庫中去查一下,應該都受到影響就對了。
問題:
1、管理C-JDBC,不知道C-JDBC需要啥管理,不過好像是已經(jīng)有一個簡單的 Desktop Application 可以控制相關的 administration 介面, 最重要的是, 他結合了 JMX , 可以讓整個監(jiān)控的環(huán)境更完整.. (等待嘗試)
2、不知道通過C-JDBC來操作速度如何
3、RAIdb的3種類型,采取哪個更好?把表分開在不同server上對聯(lián)表查應該不會有影響吧?
其他:
1、Configuring C-JDBC with Jakarta Tomcat
Copy the c-jdbc-driver.jar file to the lib directory of your web application (for example: $TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib).
There are many ways to obtain connections from a Tomcat application. Just ensure that you are using org.objectweb.cjdbc.driver.Driver as the driver class name and that the JDBC URL is a C-JDBC URL
2、Configuring C-JDBC with Hibernate
C-JDBC just has to be defined as any JDBC driver in Hibernate, leaving the syntax set to the proper database. Here is a configuration example to use Hibernate with a C-JDBC cluster made of Sybase backends:
## C-JDBC
hibernate.dialect???????????????? net.sf.hibernate.dialect.SybaseDialect
hibernate.connection.driver_class org.objectweb.cjdbc.driver.Driver
hibernate.connection.username???? user
hibernate.connection.password???? pass
hibernate.connection.url????????? jdbc:cjdbc://localhost:25322/test???????
第一次做J2EE的網(wǎng)站時也遇到了這個“常見問題”。
轉自
http://huaronghu.spaces.live.com/default.aspx?_c02_owner=1經(jīng)常出現(xiàn)的Connection reset by peer: 原因可能是多方面的,不過更常見的原因是:
1:服務器的并發(fā)連接數(shù)超過了其承載量,服務器會將其中一些連接Down掉;
2:客戶關掉了瀏覽器,而服務器還在給客戶端發(fā)送數(shù)據(jù);
3:瀏覽器端按了Stop;
4:服務器給客戶端響應結果給防火墻攔截了。
一些遇到過的小錯誤,記錄下來,不要絆倒第二次:
trim
????trim(),4個字母的方法,一定要記得使用啊,已經(jīng)碰到過很多次由于沒有trim字符串而導致查詢匹配失敗的事情了。
copy?
????Ctrl+C,Ctrl+V,引入低級bug的魁首之一吧,當然低級bug表現(xiàn)出來就有可能是匪夷所思的錯誤情況了。
對齊<>們
????有時候讀取spring的applicationContext.xml會拋出錯誤,“well-formed data”什么什么的,一般是.xml文件的內(nèi)容不符合要求,亂掉了,注意,此時不僅應該檢查applicationContext.xml,它里面用到的sql-map-config.xml,以及所以表的sqlMap.xml都應該檢查。
????對于內(nèi)容本身包含<>符號的,需要用 <![CDATA[ …… ]]>括起來