java 日期及别的小技巧
網絡日志
8月3日
db2數據庫在win2003上的安裝
1。創建數據庫??? 例如:db2 create database [數據庫名稱]using codeset? GBK territory zh_CN
2。數據庫參數
??? db2 update database cfg for db_name using applheapsz 256? 指定每一單個代理程序可用的應用程序堆的大小(以頁為單位)。
??? UPDATE DATABASE CONFIGURATION FOR DBNAME USING APP_CTL_HEAP_SZ 256;確定應用程序堆的最大大小(以 4 KB 頁為單位)。為在代表 MPP 或 SMP 系統中節點上相同應用程序的運行的代理程序間共享信息時需要使用堆。如果應用程序復雜將運行或者 MPP 配置有大量節點,則應增加此堆的大小。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING APPGROUP_MEM_SZ??????? 11595;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING CATALOGCACHE_SZ 260;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING CHNGPGS_THRESH? 60;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING DBHEAP????????? 600;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOCKLIST??????? 50;指定分配給鎖列表的存儲器空間數量。鎖列表包括并行連接到數據庫的所有應用程序保留的鎖
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGBUFSZ??????? 98;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGFILSIZ?????? 2500;指定分配給用于數據恢復的日志文件的磁盤存儲空間的數量(以頁為單位)。該參數定義每一主日志文件和輔助日志文件的大小。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGPRIMARY????? 3;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGSECOND?????? 4;指定可用于數據庫恢復的輔助日志文件的數量。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING MAXAPPLS??????? 250;指定可在同一時間連接到數據庫的應用程序(本地和遠程)的最大數量。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING MAXLOCKS??????? 57;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING MINCOMMIT?????? 1;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING NUM_IOCLEANERS? 1;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING NUM_IOSERVERS?? 2;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING PCKCACHESZ????? 915;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING SOFTMAX???????? 120;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING SORTHEAP??????? 214;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING STMTHEAP??????? 2048;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING DFT_DEGREE????? 1;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING DFT_PREFETCH_SZ 32;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING UTIL_HEAP_SZ??? 78735;
UPDATE DATABASE MANAGER CONFIGURATION USING SHEAPTHRES???????? 25797;
UPDATE DATABASE MANAGER CONFIGURATION USING INTRA_PARALLEL???? OFF;
UPDATE DATABASE MANAGER CONFIGURATION USING MAX_QUERYDEGREE??? 1;
UPDATE DATABASE MANAGER CONFIGURATION USING MAXAGENTS????????? 400;
UPDATE DATABASE MANAGER CONFIGURATION USING NUM_POOLAGENTS???? 400;
UPDATE DATABASE MANAGER CONFIGURATION USING NUM_INITAGENTS???? 0;
UPDATE DATABASE MANAGER CONFIGURATION USING FCM_NUM_BUFFERS??? 4096;
UPDATE DATABASE MANAGER CONFIGURATION USING PRIV_MEM_THRESH??????? 32767;
3.可以使用db2set -all 察看系統中設置的所有配置文件注冊表變量。
4。db2 -tvf? *.sql? -z? view.txt?? 可以執行腳本文件,即輸出到view.txt察看。
5. db2 管理方面的命令
??? list db directory?? 列出系統數據庫目錄
二。數據庫操作的常用技巧
?
?1. 查看本地節點目錄
命令窗口中輸入:db2 list node directory
2. 編目一個TCP/IP節點
命令窗口:db2 catalog tcpip node <node_name> remote <hostname|ip_address> server <svcname|port_number> ostype <OS2|AIX|WIN95|NT|HPUX|SUN|MVS|OS400|VM|VSE|SCO|SGI|LINUX|DYNIX>
3. 取消節點編目
db2 uncatalog node <node_name>
4. 查看系統數據庫目錄
db2 list database directory
5. 查看本地數據庫目錄
db2 list database directory on <盤符>
在本地數據庫目錄中有而系統數據庫目錄中沒有的數據庫不能訪問,可以在控制中心中選中<數據庫>右鍵單擊選擇添加,然后輸入需要添加的數據庫名稱或者點擊刷新按鈕選擇數據庫,加入數據庫后即可以訪問。
6. 編目數據庫
db2 catalog database <db_name> as <db_alias> at node <node_name>
7. 取消數據庫編目
db2 uncatalog database <db_name>
8. 測試遠程數據庫的連接
db2 connect to <db_alias> user <user_id> using <password>
9. 任何用戶均可通過設置Current Schema專用寄存器為特定的數據庫連接設置默認模式,初始默認值為當前會話用戶的權限ID。
set schema = <schema name>
可以由用戶交互式的使用,也可在應用程序中使用,如果用Dynamicrules Bind選項綁定包,這個語句就沒有作用。此語句不在事務控制之下。
10. 代碼頁的設置
在創建數據庫時設置字符集
create database <db_name> using codeset <codeset> territory <territiry>
例:
create database dbtest using codeset IBM-437 territory US
也可以設置整個數據庫的代碼頁,在win2000/NT/xp中,在我的電腦-->屬性-->高級-->環境變量中添加變量DB2CODEPAGE = <codepage>,例:DB2CODEPAGE = 437 或 DB2CODEPAGE = 1386。或者在IBM DB2命令窗口輸入 db2set DB2CODEPAGE=1386,設置后需要重新啟動DB2生效。
11. DB2低版本數據到高版本的遷移
先將低版本數據備份使用恢復功能導入高版本數據庫,然后在命令窗口輸入 db2 migrate database <db_name>。
12. 表名或模式中含有引號時訪問表
命令窗口:db2 select * from "tabschema"."tabname"
命令行處理器:db2=> select * from "tabschema"."tabname"
13. 導出數據庫的表結構生成DDL文件
命令窗口:db2look -d <db_name> -e -c -o <file_name>
14. 執行腳本文件
命令窗口:db2 -tvf <file_name>
15. 代碼頁的轉換
16. 獲取當前DB2的版本
select * from sysibm.sysversions
17. DB2表的字段的修改限制?
只能修改VARCHAR2類型的并且只能增加不能減少
alter table <tb_name> alter column <col_name> set data type varchar(SIZE)
18. 如何查看表的結構?
describe table <tb_name>
or
describe select * from <schema>.<tb_name>
19. 如何快速清除一個大表?
ALTER TABLE TABLE_NAME ACTIVE NOT LOGGED INITALLY WITH EMPTY TABLE
20. 如何查看數據庫的存儲過程?
SELECT * FROM SYSCAT.PROCEDURES
21. 如何查看表的約束?
SELECT * FROM SYSCAT.CHECKS WHERE TABNAME = <tb_name>
22. 如何查看表的引用完整約束?
SELECT * FROM SYSCAT.REFERENCES WHERE TABNAME = <tb_name>
23. 如何知道BUFFERPOOLS狀況?
select * from SYSCAT.BUFFERPOOLS
24. 如何在命令行下查看修改實例和數據庫配置參數?
查看實例配置參數: db2 get dbm cfg
修改實例配置參數: db2 update dbm cfg using 參數名 新值
查看數據庫配置參數: db2 get db cfg for <db_name>
修改數據庫配置參數: db2 update db cfg for <db_name> using 參數名 新值
25. 如何修改緩沖區?
增加緩沖區: create bufferpool <buf_name> size <number of pages> [pagesize 4096] {[not] EXTENDED STORAGE}
修改緩沖區: alter bufferpool <buf_name> size <number of pages> {[not] EXTENDED STORAGE}
刪除緩沖區: drop bufferpool <buf_name>
如果緩沖區大小設置為 -1 表示緩沖池的頁面數目由數據庫配置參數buffpage決定。
注意: 數據庫配置參數buffpage僅對緩沖區大小設置為 -1 的緩沖池起作用。
26. 多個字段時如何不通過使用select子句使用in/not in
select * from tabschema.tabname where (colA, colB, colC) [not] in (values (valueA1, valueB1, valueC1), (valueA2, valueB2, valueC2), ...(valueAn, valueBn, valueCn))
27. 查看當前連接到數據庫的應用
db2 list application [show detail]
28. 如何確認DB2數據庫的一致性
db2dart <db_name> /DB
/DB表示檢查整個數據庫的一致性
29. 測試SQL語句的性能
db2batch -d <db_name> -f <file_name> [-a userid/passwd] [-r <outfile_name>]
-r 選項表示將查詢結果輸出到一個文件中。
30. 導出某個表的數據
export to <Derectry><filme>
如:導出用戶表
export to c:user.ixf of ixf select * from user
31. 導入數據
import from
如:導入用戶表。導入時可以直接建立新表。如果有該表存在也可以用INSERT 插入,或者用UPDATE更新
import from c:user.ixf of ixf [Create/Insert into / update] tablename
。。。。。。。。。。。。。。未完待續
13:44 添加評論 固定鏈接 引用通告 (0) 記錄它 計算機與 Internet
固定鏈接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!152.entry
添加評論正在做oracle向db2數據庫移植總結一些經驗
1、創建PROCEDURE的參數的區別
??????? 1)參數類型和參數名稱的位置不同
??????????? db2:??? CREATE PROCEDURE PRO1 (IN OrgID int)
??????????? oracle:CREATE PROCEDURE PRO1 (OrgID IN int)
??????? 2)同時作為輸入輸出參數的寫法不同
??????????? db2:??? CREATE PROCEDURE PRO1 (INOUT OrgID int)??? INOUT連著寫
??????????? oracle:CREATE PROCEDURE PRO1 (OrgID IN OUT int)??? IN OUT中間空格隔開,而且必須IN在OUT之前
??????? 3)沒有輸入或輸出參數時
??????????? db2:??? CREATE PROCEDURE PRO1 ()????
??????????? oracle:CREATE PROCEDURE PRO1 不能有空的括號
?????? 4)賦值語句寫法不一樣
?????????? db2:??? set var =..
????????? oracle:? var := ..
????? 5)異常處理不一樣
????????? db2: 異常處理器類型(handler-type)有以下幾種:
CONTINUE 在處理器操作完成之后,會繼續執行產生這個異常語句之后的下一條語句。
EXIT 在處理器操作完成之后,存儲過程會終止,并將控制返回給調用者。
UNDO 在處理器操作執行之前,DB2會回滾存儲過程中執行的SQL操作。在處理器操作完成之后,存儲過程會終止,并將控制返回給調用者。
異常處理器可以處理基于特定SQLSTATE值的定制異常,或者處理預定義異常的類。預定義的3種異常如下所示:
NOT FOUND 標識導致SQLCODE值為+100或者SQLSATE值為02000的異常。這個異常通常在SELECT沒有返回行的時候出現。
SQLEXCEPTIOIN 標識導致SQLCODE值為負的異常。
SQLWARNING 標識導致警告異常或者導致+100以外的SQLCODE正值的異常。
如果產生了NOT FOUND 或者SQLWARNING異常,并且沒有為這個異常定義異常處理器,那么就會忽略這個異常,并且將控制流轉向下一個語句。如果產生了SQLEXCEPTION異常,并且沒有為這個異常定義異常處理器,那么存儲過程就會失敗,并且會將控制流返回調用者。
以下示例聲明了兩個異常處理器。 EXIT處理器會在出現SQLEXCEPTION 或者SQLWARNING異常的時候被調用。EXIT處理器會在終止SQL程序之前,將名為stmt的變量設為"ABORTED",并且將控制流返回給調用者。UNDO處理器會將控制流返回給調用者之前,回滾存儲過程體中已經完成的SQL操作。
oracle: EXCEPTION
? ----錯誤處理
? WHEN DUP_VAL_ON_INDEX THEN
??? ----主鍵沖突
??? ROLLBACK;
? WHEN VALUE_ERROR THEN
??? ----長度截斷錯誤
??? ROLLBACK;
? WHEN PROGRAM_ERROR THEN
??? ----PL/SQL內部錯誤
??? ROLLBACK;
? WHEN TIMEOUT_ON_RESOURCE THEN
??? ----系統等待超時
????? ROLLBACK;
? WHEN OTHERS THEN
??? ----其他異常錯誤
??? ROLLBACK;
2 自定義函數例子
類似oracle 的 to_date() 日期函數
CREATE FUNCTION DB2ADMIN.TO_DATE_EX
?(INPUTDATE VARCHAR(20),
? FORMAT VARCHAR(20)
?)
? RETURNS TIMESTAMP
? SPECIFIC DB2ADMIN.SQL060801174720700
? LANGUAGE SQL
? NOT DETERMINISTIC
? READS SQL DATA
? STATIC DISPATCH
? CALLED ON NULL INPUT
? EXTERNAL ACTION
? INHERIT SPECIAL REGISTERS
? RETURN
with tmp (outdate) as (
? select
????? case length(rtrim(INPUTDATE))
??????? when 10
????????? then timestamp(inputdate || ' 00:00:00')
??????? when 19
????????? then timestamp(inputdate)
????? end
??? from sysibm.sysdummy1 )
? select outdate
??? from tmp;
12:27 添加評論 固定鏈接 引用通告 (0) 記錄它 愛好
固定鏈接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!151.entry
添加評論6月21日
jsp中的日期問題及其它:D :D :D
jsp中的日期問題及其它:D :D :D
/**
* @author imagebear
*/
日期問題
1、獲取服務器端當前日期:
?
<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
%>
2、獲取當前年、月、日:
?
<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
int thisYear = myDate.getYear() + 1900;//thisYear = 2003
int thisMonth = myDate.getMonth() + 1;//thisMonth = 5
int thisDate = myDate.getDate();//thisDate = 30
%>
3、按本地時區輸出當前日期
?
<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
out.println(myDate.toLocaleString());
%>
輸出結果為:
2003-5-30
4、獲取數據庫中字段名為”publish_time“、類型為Datetime的值
?
<%@ page import="java.util.Date"%>
<%
...連接數據庫...
ResultSet rs = ...
Date sDate = rs.getDate("publish_time");
%>
[code]
5、按照指定格式打印日期
[code]
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
Date dNow = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is " + formatter.format(dNow));
%>
輸出的結果為:
It is 星期五 2003.05.30 at 11:30:46 上午 CST
(更為詳盡的格式符號請參看SimpleDateFormat類)
6、將字符串轉換為日期
?
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "1222-11-11";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date t = null;
try{
t = formatter.parse(input);
out.println(t);
}catch(ParseException e){
out.println("unparseable using " + formatter);
}
%>
輸出結果為:
Fri Nov 11 00:00:00 CST 1222
7、計算日期之間的間隔
?
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "2003-05-01";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = null;
try{
d1 = formatter.parse(input);
}catch(ParseException e){
out.println("unparseable using " + formatter);
}
Date d2 = new Date();
long diff = d2.getTime() - d1.getTime();
out.println("Difference is " + (diff/(1000*60*60*24)) + " days.");
%>
輸出結果為:
Difference is 29 days.
8、日期的加減運算
方法:用Calendar類的add()方法
?
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
Calendar now = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is now " + formatter.format(now.getTime()));
now.add(Calendar.DAY_OF_YEAR,-(365*2));
out.println("<br>");
out.println("Two years ago was " + formatter.format(now.getTime()));
%>
輸出結果為:
It is now 星期五 2003.05.30 at 01:45:32 下午 CST
Two years ago was 星期三 2001.05.30 at 01:45:32 下午 CST
9、比較日期
方法:用equals()、before()、after()方法
?
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
DateFormat df = new SimpleDateFormat("yyy-MM-dd");
Date d1 = df.parse("2000-01-01");
Date d2 = df.parse("1999-12-31");
String relation = null;
if(d1.equals(d2))
relation = "the same date as";
else if(d1.before(d2))
relation = "before";
else
relation = "after";
out.println(d1 +" is " + relation + ' ' + d2);
%>
輸出結果為:
Sat Jan 01 00:00:00 CST 2000 is after Fri Dec 31 00:00:00 CST 1999
10、記錄一件事所花費的時間
方法:調用兩次System.getTimeMillis()方法,求差值
?
<%@ page import="java.text.*"%>
<%
long t0,t1;
t0 = System.currentTimeMillis();
out.println("Cyc starts at " + t0);
int k = 0;
for(int i =0;i<100000;i++){
k += i;
}
t1 = System.currentTimeMillis();
out.println("<br>");
out.println("Cyc ends at " + t1);
out.println("<br>");
out.println("This run took " + (t1-t0) + "ms.");
%>
輸出結果為:
Cyc starts at 1054275312432
Cyc ends at 1054275312442
This run took 10ms.
其它:如何格式化小數
?
<%@ page import="java.text.*"%>
<%
DecimalFormat df = new DecimalFormat(",###.00");
double aNumber = 33665448856.6568975;
String result = df.format(aNumber);
out.println(result);
%>
輸出結果為:
33,665,448,856.66
10:33 添加評論 固定鏈接 引用通告 (0) 記錄它 計算機與 Internet
固定鏈接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!138.entry
添加評論5月27日
設計模式之父談如何使用設計模式
在接受Artima.com的采訪時,《設計模式》的作者Erich Gamma介紹了如何正確地使用設計模式。
設計模式(design pattern)一直是一個開發者中間流行的話題,借助于它開發者可以更好地思考設計問題。但怎樣才是思考設計模式的正確方式?在接受Artima.com的采訪時,經典著作《設計模式》一書的作者之一Erich Gamma介紹了自己的經驗。
全文請看:http://www.artima.com/lejava/articles/gammadp.html
15:56 添加評論 閱讀評論 (1) 固定鏈接 引用通告 (0) 記錄它 愛好
固定鏈接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!137.entry
添加評論5月24日
如何把數據寫到excel文件中
jxl的一些總結
要往xls文件里面寫入數據的時候需要注意的是第一要新建一個xls文件
OutputStream os=new FileOutputStream("c:\\excel2.xls");
再建完這個文件的時候再建立工作文件
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(os));
如果這個文件已經存在,那么我們可以在這個文件里面加入一個sheet為了和以前的數據進行分開;
jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
在createSheet方法里前面的參數是sheet名,后面是要操作的sheet號
接下來就可以往這個文件里面寫入數據了
寫入數據的時候注意的格式
(1)添加的字體樣式
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableFont()方法里參數說明:
這個方法算是一個容器,可以放進去好多屬性
第一個: TIMES是字體大小,他寫的是18
第二個: BOLD是判斷是否為斜體,選擇true時為斜體
第三個: ARIAL
第四個: UnderlineStyle.NO_UNDERLINE 下劃線
第五個: jxl.format.Colour.RED 字體顏色是紅色的
jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell",wcfF);
ws.addCell(labelC);
在Label()方法里面有三個參數
第一個是代表列數,
第二是代表行數,
第三個代表要寫入的內容
第四個是可選項,是輸入這個label里面的樣式
然后通過寫sheet的方法addCell()把內容寫進sheet里面。
(2)添加帶有formatting的Number對象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
(3)添加Number對象
(3.1)顯示number對象數據的格式
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
Number()方法參數說明:
前兩上表示輸入的位置
第三個表示輸入的內容
(4)添加Boolean對象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
(5)添加DateTime對象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
DateTime()方法的參數說明
前兩個表示輸入的位置
第三個表示輸入的當前時間
(6)添加帶有formatting的DateFormat對象
這個顯示當前時間的所有信息,包括年月日小時分秒
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);
(7)添加帶有字體顏色Formatting的對象
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
import="jxl.format.*
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.GREEN);
(8)設置單元格樣式
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
wcfFC.setBackGround(jxl.format.Colour.RED);//設置單元格的顏色為紅色
wcfFC = new jxl.write.Label(6,0,"i love china",wcfFC);
15:44 添加評論 固定鏈接 引用通告 (0) 記錄它 計算機與 Internet
固定鏈接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!136.entry
添加評論5月23日
cvs應用指南
CVS 是 Concurrent Version System(并行版本系統)談 羽斌 整理? (參與分:938,專家分:105)?? 發表:2005-05-23 12:00?? 版本:1.0?? 閱讀:7次
CVS 是 Concurrent Version System(并行版本系統)的縮寫,用于版本管理。在多人團隊開發中的作用更加明顯。CVS 的基本工作思路是這樣的:在一臺服務器上建立一個倉庫,倉庫里可以存放許多不同項目的源程序。由倉庫管理員統一管理這些源程序。這樣,就好象只有一個人在修改文件一樣。避免了沖突。每個用戶在使用倉庫之前,首先要把倉庫里的項目文件下載到本地。用戶做的任何修改首先都是在本地進行,然后用 cvs 命令進行提交,由 cvs 倉庫管理員統一 修改。這樣就可以做到跟蹤文件變化,沖突控制等等。
由于CVS是建立在在原先 Unix 體系里很成熟的 SCCS 和 RCS 的基礎上,所以CVS多是Linux(UNIX)系統中所使用,本文中服務器端設置也是以Linux為例。
一、CVS服務器的安裝
首先確認系統中是否安裝CVS服務:
[root@localhost /]# rpm -qa|grep cvs
cvs-1.11.2-cvshome.7x.1
如果命令輸出類似于上面的輸出則說明系統已經安裝有cvs,否則就需要從安裝光盤中安裝cvs的rpm包,或者到http://www.cvshome.org下載。
1、建立 CVSROOT
目錄,因為這里涉及到用戶對CVSROOT里的文件讀寫的權限問題,所以比較簡單的方法是建立一個組,然后再建立一個屬于該組的帳戶,而且以后有讀寫權限的用戶都要屬于該組。假設我們建一個組叫cvs,用戶名是cvsroot。建組和用戶的命令如下
#groupadd cvs
#adduser cvsroot
生成的用戶宿主目錄在/home/cvsroot(根據自己的系統調整)
2、用cvsroot 用戶登陸,修改 /home/cvsroot (CVSROOT)的權限,賦與同組人有讀寫的權限:
$chmod 771 . (或者770應該也可以)
注意:這一部分工作是按照文檔說明做的,是否一定需要這樣沒有試驗,我會在做試驗后在以后版本的教程說得仔細一點。如果您有這方面的經驗請提供給我,謝謝。
3、建立CVS倉庫,(仍然是 cvsroot 用戶),用下面命令:
$cvs -d /home/cvsroot init
4、以root身份登陸,修改 /etc/inetd.conf(使用 xinetd 的系統沒有此文件)和 /etc/services
如果用的是 inetd 的系統,在 /etc/inetd.conf 里加入:
cvsserver stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/home/cvsroot pserver
說明:上面的行是單獨一整行,/usr/bin/cvs 應該是你的cvs版本的命令路徑,請根據自己的系統調整./home/cvsroot是你建立的CVSROOT的路徑,也請根據上面建立目錄的部分的內容做調整。
如果是使用 xinetd 的系統,需要在 /etc/xinetd.d/ 目錄下創建文件 cvspserver(此名字可以自己定義),內容如下:
# default: on
# description: The cvs server sessions;
service cvsserver
{
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/cvsroot pserver
log_on_failure += USERID
only_from = 192.168.0.0/24
}
其中only_from是用來限制訪問的,可以根據實際情況不要或者修改。修改該文件權限:
# chmod 644 cvspserver
在/etc/services里加入:
cvsserver 2401/tcp
說明:cvsserver 是任意的名稱,但是不能和已有的服務重名,也要和上面修改 /etc/inetd.conf 那行的第一項一致。
5、添加可以使用 CVS 服務的用戶到 cvs 組:
以 root 身份修改 /etc/group,把需要使用 CVS 的用戶名加到 cvs 組里,比如我想讓用戶 laser 和gumpwu 能夠使用 CVS 服務,那么修改以后的 /etc/group 應該有下面這樣一行:
cvs:x:105:laser,gumpwu
在你的系統上GID可能不是105,沒有關系。主要是要把laser和gumpwu用逗號分隔開寫在最后一個冒號后面。當然,象RedHat等分發版有類似linuxconf這樣的工具的話,用工具做這件事會更簡單些。
6、重起inetd使修改生效:
#killall -HUP inetd
如果使用的是 xinetd 的系統:
# /etc/rc.d/init.d/xined restart
然后察看cvs服務器是否已經運行:
[root@localhost /]# netstat -lnp|grep 2401
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 1041/xinetd
則說明cvs服務器已經運行。
二、管理CVS服務器
服務器可以用了,現在大家最關心的就是如何管理服務器,比如,我想讓一些人有讀和/或寫 CVS 倉庫的權限,但是不想給它系統權限怎么辦呢?
不難,在 cvs 管理員用戶(在我這里是 cvsroot 用戶)的家目錄里有一個 CVSROOT 目錄,這個目錄里有三個配置文件,passwd, readers, writers,我們可以通過設置這三個文件來配置 CVS 服務器,下面分別介紹這幾個文件的作用:
passwd:cvs 用戶的用戶列表文件,它的格式很象 shadow 文件:
{cvs 用戶名}:[加密的口令]:[等效系統用戶名]
如果你希望一個用戶只是 cvs 用戶,而不是系統用戶,那么你就要設置這個文件,剛剛安裝完之后這個文件可能不存在,你需要以 cvs 管理員用戶手工創建,當然要按照上面格式,第二個字段是該用戶的加密口令,就是用 crypt (3)加密的,你可以自己寫一個程序來做加密,也可以用我介紹的偷懶的方法:先創建一個系統用戶,名字和 cvs 用戶一樣,口令就是準備給它的 cvs 用戶口令,創建完之后從 /etc/shadow 把該用戶第二個字段拷貝過來,然后再把這個用戶刪除。這個方法對付數量少的用戶比較方便,人一多就不合適了,而且還有沖突條件(race condition)的安全隱患,還要 root 權限,實在不怎么樣。不過權益之計而已。寫一個小程序并不難,可以到 linuxforum 的編程版搜索一下,有個朋友已經寫了一個貼在上面了。
第三個字段就是等效系統用戶名,實際上就是賦與一個 cvs 用戶一個等效的系統用戶的權限,看下面的例子你就明白它的功能了。
readers:有 cvs 讀權限的用戶列表文件。就是一個一維列表。在這個文件中的用戶對 cvs只有讀權限。
writers:有 cvs 寫權限的用戶的列表文件。和 readers 一樣,是一個一維列表。在這個文件中的用戶對 cvs 有寫權限。
上面三個文件在缺省安裝的時候可能都不存在,需要我們自己創建,好吧,現在還是讓我們用一個例子來教學吧。假設我們有下面幾個用戶需要使用 cvs:
laser, gumpwu, henry, betty, anonymous。
其中 laser 和 gumpwu 是系統用戶,而 henry, betty, anonymous 我們都不想給系統用戶權限,并且 betty 和 anonymous 都是只讀用戶,而且 anonymous 更是連口令都沒有。那么好,我們先做一些準備工作,先創建一個 cvspub 用戶,這個用戶的責任是代表所有非系統用戶的 cvs 用戶讀寫 cvs 倉庫。
#adduser
...
然后編輯 /etc/group,令 cvspub 用戶在 cvs 組里,同時把其它有系統用戶權限的用戶加到 cvs 組里。(見上文)
然后編輯 cvs 管理員家目錄里 CVSROOT/passwd 文件,加入下面幾行:
laser:$xxefajfka;faffa33:cvspub
gumpwu:$ajfaal;323r0ofeeanv:cvspub
henry:$fajkdpaieje:cvspub
betty:fjkal;ffjieinfn/:cvspub
anonymous::cvspub
注意:上面的第二個字段(分隔符為 :)是密文口令,你要用程序或者用我的土辦法生成。
編輯 readers 文件,加入下面幾行:
anonymous
betty
編輯 writers 文件,加入下面幾行:
laser
gumpwu
henry
注意:writers中的用戶不能在readers中,要不然不能上傳更新文件。
對于使用CVS的用戶要修改它的環境變量,例如laser用戶的環境變量,打開/home/laser(laser的宿主目錄)下的.bash_profile文件,加入
CVSROOT=/home/cvsroot
export CVSROOT
用laser登陸就可以建立CVS項目,如果要root使用,可以修改/etc/profile文件。
現在我們各項都設置好了,那么怎么用呢,我在這里寫一個最簡單的(估計也是最常用的)命令介紹:
首先,建立一個新的CVS項目,一般我們都已經有一些項目文件了,這樣我們可以用下面步驟生成一個新的CVS項目:
進入到你的已有項目的目錄,比如叫 cvstest:
$cd cvstest
運行命令:
$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start
說明:import 是cvs的命令之一,表示向cvs倉庫輸入項目文件。 -m參數后面的字串是描述文本,隨便寫些有意義的東西,如果不加 -m 參
數,那么cvs會自動運行一個編輯器(一般是vi,但是可以通過修改環境變量EDITOR來改成你喜歡用的編輯器。)讓你輸入信息,cvstest 是項目名稱(實際上是倉庫名,在CVS服務器上會存儲在以這個名字命名的倉庫里。)
v_0_0_1是這個分支的總標記。沒啥用(或曰不常用。)
start 是每次 import 標識文件的輸入層次的標記,沒啥用。
這樣我們就建立了一個CVS倉庫了。
建立CVS倉庫的文件夾應該是“干凈”的文件夾,即只包括源碼文件和描述的文件加,而不應該包括編譯過的文件代碼等!
三、使用CVS
winCVS是一個很好的CVS客戶端軟件,在http://cnpack.cosoft.org.cn/down/wincvsdailyguide.pdf可以下載到這個軟件的使用手冊。這里不在贅述了。
四、用CVS管理項目
本人正在一加公司從事該公司ERP項目的開發,在沒有使用CVS的時候,多次出現了由于不同的開發人員修改同一程序,而導致程序錯誤,解決版本控制問題迫在眉睫。
由于這個項目采用Linux平臺下JAVA開發,使用的開發工具Jbulider是支持CVS進行項目管理的,作為主程序員,我決定采用CVS進行版本控制,首先參照上文在Linux服務器上建立了CVS服務,然后我把我本地的工程文件傳至服務器。
例如:我的工程文件在F:\ERP下,我把ERP下的erp.jpx文件、defaultroot文件夾和src文件夾上傳至服務器/usr/local/erp下,然后登陸Linux服務器,登陸的用戶是CVS的用戶,其環境變量要正確(我的用戶名為admin)
#cd /usr/local/erp
#cvs import -m "this is a ERP project" erp v_0_0_1 start
這樣名為erp的CVS倉庫就建立了。
之后開發小組的成員可以用winCVS把該項目下載到本地:
打開winCVS
點擊工具欄Create -> Create a new repository... 彈出窗口
在Grenral中
Enter the CVSROOT填寫admin@192.168.1.9:/home/cvsroot 其中admin是cvs的用戶,在本例中admin也是linux的系統用戶,192.168.1.9是服務器的地址,/home/cvsroot是CVS的主目錄,參考上文。
Authentication中選擇"passwd file on the cvs server"
Use version中選擇cvs 1.10 (Standard)
其它項默認即可。
確認后,點工具欄Admin --> Login... 會提示輸入密碼,輸入密碼后,看看winCvs的狀態欄。如果提示
*****CVS exited normally with code 0*****
表示登錄正常。
點擊工具欄Create --> Checkout module...彈出對話框,其中的Checkout settings項中
Enter the module name and path on the server 填寫erp,即我們建立的名為erp的CVS倉庫
Local folder to checkout to 選擇要下載到本地的目錄,我選了F:\myerp
其它項目可以默認,確定后就可以下載到本地了,在F:\myerp\下會有一個erp文件夾,其文件結構和F:\erp下的文件結構是一樣的。
用Jbulider打開F:\myerp\erp\下的erp.jpx文件,這個工程文件就可以使用了。
在Jbuilder的工具欄Team --> Select Project VCS 彈出對話框,選擇CVS
對于你要進行修改的文件,在Project View中點中該文件,然后點右鍵,探出快捷菜單,選擇CVS --> CVS Edit "xxxx.java(文件名)"
第一次使用可能會提示CVS服務器的密碼。
在修改之前還要選擇CVS --> Update "xxxx.java(文件名)"
修改之后選擇CVS --> Commit "xxxx.java(文件名)"
這樣,修改的文件就保存到CVS服務器了,Update的目的是下載、比較文件。每次在修改之前都Update,保持最新版本。
CVS在項目管理使用中確實起到了良好的效果,仔細研究CVS的命令,可以更好的發揮CVS在版本控制上的能力。
13:45 添加評論 固定鏈接 引用通告 (0) 記錄它 計算機與 Internet
固定鏈接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!133.entry
添加評論5月20日
JAVA開發者應該去的20個英文網站-轉貼
[http://www.javaalmanac.com] - Java開發者年鑒一書的在線版本. 要想快速查到某種Java技巧的用法及示例代碼, 這是一個不錯的去處.
[http://www.onjava.com] - O'Reilly的Java網站. 每周都有新文章.
[http://java.sun.com] - ;官方的Java開發者網站 - 每周都有新文章發表.
[http://www.developer.com/java] - ;由Gamelan.com 維護的Java技術文章網站.
[http://www.java.net] - Sun公司維護的一個Java社區網站.
[http://www.builder.com] - Cnet的Builder.com網站 - 所有的技術文章, 以Java為主.
[http://www.ibm.com/developerworks/java] - IBM的Developerworks技術網站; 這是其中的Java技術主頁.
[http://www.javaworld.com] - ;最早的一個Java站點. 每周更新Java技術文章.
[http://www.devx.com/java] - DevX維護的一個Java技術文章網站.
[http://www.fawcette.com/javapro] - JavaPro在線雜志網站.
[http://www.sys-con.com/java] - Java Developers Journal的在線雜志網站.
[http://www.javadesktop.org] - ;位于Java.net的一個Java桌面技術社區網站.
[http://www.theserverside.com] - ;這是一個討論所有Java服務器端技術的網站.
[http://www.jars.com] - ;提供Java評論服務. 包括各種framework和應用程序.
[http://www.jguru.com] - ;一個非常棒的采用Q&A形式的Java技術資源社區.
[http://www.javaranch.com] - ;一個論壇,得到Java問題答案的地方,初學者的好去處。
[http://www.ibiblio.org/javafaq/javafaq.html] - comp.lang.java的FAQ站點 - 收集了來自comp.lang.java新聞組的問題和答案的分類目錄.
http://java.sun.com/docs/books/tutorial/] - ;來自SUN公司的官方Java指南 - 對于了解幾乎所有的java技術特性非常有幫助.
http://www.javablogs.com] - ;互聯網上最活躍的一個Java Blog網站.
http://java.about.com/] - ;來自About.com的Java新聞和技術文章網站.
?
轉載于:https://www.cnblogs.com/subiaoji/archive/2006/08/22/483495.html
總結
以上是生活随笔為你收集整理的java 日期及别的小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微軟平台的管理專家 - Microsof
- 下一篇: 生活象一碗白菜汤