錯誤信息:
Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
原因與解決:
1.因為Hibernate Tools(或者Eclipse本身的Database Explorer)生成*.hbn.xml工具中包含有catalog="***"(*表示數據庫名稱)這樣的屬性,將該屬性刪除就可以了
2.估計是你的列名里面有關鍵字的原因吧,命名列的時候不要單獨使用date,ID...這種關鍵字
Hibernate查詢時候的問題。
莫名其妙地報如下的錯誤,
org.hibernate.exception.GenericJDBCException: could not execute query
最后把mysql的驅動程序 從 mysql-connector-java-3.2.0-alpha改成mysql-connector-java-5.0.4就可以了。
posted @
2008-12-03 22:02 caihaibo 閱讀(626) |
評論 (0) |
編輯 收藏
Hibernate入門 - 基礎配置
作者:robbin (MSN:robbin_fan AT hotmail DOT com)
版權聲明:本文嚴禁轉載,如有轉載請求,請和作者聯系
Hibernate配置文件可以有兩種格式,一種是 hibernate.properties ,另一種是 hibernate.cfg.xml
后者稍微方便一些,當增加hbm映射文件的時候,可以直接在 hibernate.cfg.xml 里面增加,不必像 hibernate.properties 必須在初始化代碼中加入。
但不管怎么說,兩種的配置項都是一樣的,下面詳細介紹:
在Hibernate的src目錄下有一個 hibernate.properties 模板,我們不必自己從頭寫,修改模板就可以了:)
hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
這個配置意思是當你在Hibernate里面輸入true的時候,Hibernate會轉化為1插入數據庫,當你在Hibernate里面輸入false的時候,Hibernate會轉化為0插入數據庫,后面的Y,N同理。
對于某些數據庫,例如Oracle來說,沒有boolean數據類型,就是采用1代表true,0代表false,因此使用這個配置在Hibernate里面直接用true/false會非常直觀。
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///test
hibernate.connection.username root
hibernate.connection.password
這是一個連接MySQL數據庫的例子,很直觀,不必解釋,不同的數據庫的連接參數模板中全部給出了。
對于某些數據庫,例如Oracle來說,沒有boolean數據類型,就是采用1代表true,0代表false,因此使用這個配置在Hibernate里面直接用true/false會非常直觀。
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///test
hibernate.connection.username root
hibernate.connection.password
這是一個連接MySQL數據庫的例子,很直觀,不必解釋,不同的數據庫的連接參數模板中全部給出了。
如果你不是在App Server環境中使用Hibernate,例如遠程客戶端程序,但是你又想用App Server的數據庫連接池,那么你還需要配置JNDI的參數,例如Hibernate連接遠程Weblogic上的數據庫連接池:
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.datasource mypool
hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider
hibernate.jndi.class weblogic.jndi.WLInitialContextFactory
hibernate.jndi.url t3://servername:7001/
最后,如果你需要在EJB或者JTA中使用Hibernate,需要取消下行的注釋:
hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
雜項配置:
hibernate.show_sql false
是否將Hibernate發送給數據庫的sql顯示出來,這是一個非常非常有用處的功能。當你在調試Hibernate的時候,讓Hibernate打印sql語句,可以幫助你迅速解決問題。
#hibernate.connection.isolation 4
指定數據庫的隔離級別,往往不同的數據庫有自己定義的隔離級別,未必是Hibernate的設置所能更改的,所以也不必去管它了。
hibernate.jdbc.fetch_size 50
hibernate.jdbc.batch_size 25
這兩個選項非常非常非常重要!!!將嚴重影響Hibernate的CRUD性能!
C = create, R = read, U = update, D = delete
Fetch Size 是設定JDBC的Statement讀取數據的時候每次從數據庫中取出的記錄條數。
例如一次查詢1萬條記錄,對于Oracle的JDBC驅動來說,是不會1次性把1萬條取出來的,而只會取出Fetch Size條數,當紀錄集遍歷完了這些記錄以后,再去數據庫取Fetch Size條數據。
因此大大節省了無謂的內存消耗。當然Fetch Size設的越大,讀數據庫的次數越少,速度越快;Fetch Size越小,讀數據庫的次數越多,速度越慢。
這有點像平時我們寫程序寫硬盤文件一樣,設立一個Buffer,每次寫入Buffer,等Buffer滿了以后,一次寫入硬盤,道理相同。
Oracle 數據庫的JDBC驅動默認的Fetch Size=10,是一個非常保守的設定,根據我的測試,當Fetch Size=50的時候,性能會提升1倍之多,當Fetch Size=100,性能還能繼續提升20%,Fetch Size繼續增大,性能提升的就不顯著了。
因此我建議使用Oracle的一定要將Fetch Size設到50。
不過并不是所有的數據庫都支持Fetch Size特性,例如MySQL就不支持。
MySQL就像我上面說的那種最壞的情況,他總是一下就把1萬條記錄完全取出來,內存消耗會非常非常驚人!這個情況就沒有什么好辦法了 :(
Batch Size是設定對數據庫進行批量刪除,批量更新和批量插入的時候的批次大小,有點相當于設置Buffer緩沖區大小的意思。
Batch Size越大,批量操作的向數據庫發送sql的次數越少,速度就越快。我做的一個測試結果是當Batch Size=0的時候,使用Hibernate對Oracle數據庫刪除1萬條記錄需要25秒,Batch Size = 50的時候,刪除僅僅需要5秒!!!
可見有多么大的性能提升!很多人做Hibernate和JDBC的插入性能測試會奇怪的發現Hibernate速度至少是JDBC的兩倍,就是因為Hibernate使用了Batch Insert,而他們寫的JDBC沒有使用Batch的緣故。
以我的經驗來看,Oracle數據庫 Batch Size = 30 的時候比較合適,50也不錯,性能會繼續提升,50以上,性能提升的非常微弱,反而消耗內存更加多,就沒有必要了。
#hibernate.jdbc.use_scrollable_resultset true
設定是否可以使用JDBC2.0規范的可滾動結果集,這對Hibernate的分頁顯示有一定的作用,默認就好了。
#hibernate.cglib.use_reflection_optimizer false
默認打開,啟用cglib反射優化。cglib是用來在Hibernate中動態生成PO字節碼的,打開優化可以加快字節碼構造的速度。
不過,當你在調試程序過程中,特別是和proxy,lazy loading相關的應用中,代碼出錯,但是出錯提示信息有語焉不詳,那么你可以把cglib優化關掉,這樣Hibernate會輸出比較詳細的調試信息,幫助你debug。
Hibernate一共包括了23個jar包,令人眼花繚亂。本文將詳細講解Hibernate每個jar包的作用,便于你在應用中根據自己的需要進行取舍。
下載Hibernate,例如2.0.3穩定版本,解壓縮,可以看到一個hibernate2.jar和lib目錄下有22個jar包:
hibernate2.jar:
Hibernate的庫,沒有什么可說的,必須使用的jar包
cglib-asm.jar:
CGLIB庫,Hibernate用它來實現PO字節碼的動態生成,非常核心的庫,必須使用的jar包
dom4j.jar:
dom4j 是一個Java的XML API,類似于jdom,用來讀寫XML文件的。dom4j是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,對主流的Java XML API進行的性能、功能和易用性的評測,dom4j無論在那個方面都是非常出色的。我早在將近兩年之前就開始使用dom4j,直到現在。如今你可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar 包,Hibernate用它來讀寫配置文件。
odmg.jar:
ODMG是一個ORM的規范,Hibernate實現了ODMG規范,這是一個核心的庫,必須使用的jar包。
commons-collections.jar:
Apache Commons包中的一個,包含了一些Apache開發的集合類,功能比java.util.*強大。必須使用的jar包。
commons-beanutils.jar:
Apache Commons包中的一個,包含了一些Bean工具類類。必須使用的jar包。
commons-lang.jar:
Apache Commons包中的一個,包含了一些數據類型工具類,是java.lang.*的擴展。必須使用的jar包。
commons-logging.jar:
Apache Commons包中的一個,包含了日志功能,必須使用的jar包。這個包本身包含了一個Simple Logger,但是功能很弱。在運行的時候它會先在CLASSPATH找log4j,如果有,就使用log4j,如果沒有,就找JDK1.4帶的 java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出現是一個歷史的的遺留的遺憾,當初Apache極力游說Sun把log4j加入JDK1.4,然而JDK1.4項目小組已經接近發布JDK1.4產品的時間了,因此拒絕了Apache的要求,使用自己的java.util.logging,這個包的功能比log4j差的很遠,性能也一般。后來Apache就開發出來了commons-logging.jar用來兼容兩個logger。因此用 commons-logging.jar寫的log程序,底層的Logger是可以切換的,你可以選擇log4j,java.util.logging或者它自帶的Simple Logger。不過我仍然強烈建議使用log4j,因為log4j性能很高,log輸出信息時間幾乎等于System.out,而處理一條log平均只需要5us。你可以在Hibernate的src目錄下找到Hibernate已經為你準備好了的log4j的配置文件,你只需要到Apache 網站去下載log4j就可以了。commons-logging.jar也是必須的jar包。
使用Hibernate必須的jar包就是以上的這幾個,剩下的都是可選的。
ant.jar:
Ant編譯工具的jar包,用來編譯Hibernate源代碼的。如果你不準備修改和編譯Hibernate源代碼,那么就沒有什么用,可選的jar包
optional.jar:
Ant的一個輔助包。
c3p0.jar:
C3PO是一個數據庫連接池,Hibernate可以配置為使用C3PO連接池。如果你準備用這個連接池,就需要這個jar包。
proxool.jar:
也是一個連接池,同上。
commons-pool.jar, commons-dbcp.jar:
DBCP數據庫連接池,Apache的Jakarta組織開發的,Tomcat4的連接池也是DBCP。
實際上Hibernate自己也實現了一個非常非常簡單的數據庫連接池,加上上面3個,你實際上可以在Hibernate上選擇4種不同的數據庫連接池,選擇哪一個看個人的偏好,不過DBCP可能更通用一些。另外強調一點,如果在EJB中使用Hibernate,一定要用App Server的連接池,不要用以上4種連接池,否則容器管理事務不起作用。
connector.jar:
JCA 規范,如果你在App Server上把Hibernate配置為Connector的話,就需要這個jar。不過實際上一般App Server肯定會帶上這個包,所以實際上是多余的包。
jaas.jar:
JAAS是用來進行權限驗證的,已經包含在JDK1.4里面了。所以實際上是多余的包。
jcs.jar:
如果你準備在Hibernate中使用JCS的話,那么必須包括它,否則就不用。
jdbc2_0-stdext.jar:
JDBC2.0的擴展包,一般來說數據庫連接池會用上它。不過App Server都會帶上,所以也是多余的。
jta.jar:
JTA規范,當Hibernate使用JTA的時候需要,不過App Server都會帶上,所以也是多余的。
junit.jar:
Junit包,當你運行Hibernate自帶的測試代碼的時候需要,否則就不用。
xalan.jar, xerces.jar, xml-apis.jar:
Xerces 是XML解析器,Xalan是格式化器,xml-apis實際上是JAXP。一般App Server都會帶上,JDK1.4也包含了解析器,不過不是Xerces,是Crimson,效率比較差,不過Hibernate用XML只不過是讀取配置文件,性能沒什么緊要的,所以也是多余的。
Hibernate 是對JDBC的輕量級對象封裝,Hibernate本身是不具備Transaction處理功能的,Hibernate的Transaction實際上是底層的JDBC Transaction的封裝,或者是JTA Transaction的封裝,下面我們詳細的分析:
Hibernate可以配置為JDBCTransaction或者是JTATransaction,這取決于你在hibernate.properties中的配置:
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory
如果你什么都不配置,默認情況下使用JDBCTransaction,如果你配置為:
hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
將使用JTATransaction
不管你準備讓Hibernate使用JDBCTransaction,還是JTATransaction,我的忠告就是什么都不配,將讓它保持默認狀態,如下:
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory
在下面的分析中我會給出原因。
一、JDBC Transaction
看看使用JDBC Transaction的時候我們的代碼例子:
Session session = sf.openSession();
Transaction tx = session.beginTransactioin();
...
session.flush();
tx.commit();
session.close();
這是默認的情況,當你在代碼中使用Hibernate的Transaction的時候實際上就是JDBCTransaction。那么JDBCTransaction究竟是什么東西呢?來看看源代碼就清楚了:
Hibernate2.0.3源代碼中的類
net.sf.hibernate.transaction.JDBCTransaction:
public void begin() throws HibernateException {
...
if (toggleAutoCommit) session.connection().setAutoCommit(false);
...
}
這是啟動Transaction的方法,看到 connection().setAutoCommit(false) 了嗎?是不是很熟悉?
再來看
public void commit() throws HibernateException {
...
try {
if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();
try {
session.connection().commit();
committed = true;
}
...
toggleAutoCommit();
}
這是提交方法,看到connection().commit() 了嗎?下面就不用我多說了,這個類代碼非常簡單易懂,通過閱讀使我們明白Hibernate的Transaction都在干了些什么?我現在把用 Hibernate寫的例子翻譯成JDBC,大家就一目了然了:
Connection conn = ...; <--- session = sf.openSession();
conn.setAutoCommit(false); <--- tx = session.beginTransactioin();
... <--- ...
conn.commit(); <--- tx.commit(); (對應左邊的兩句)
conn.setAutoCommit(true);
conn.close(); <--- session.close();
看明白了吧,Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫無神秘可言,只不過在Hibernate 中,Session打開的時候,就會自動conn.setAutoCommit(false),不像一般的JDBC,默認都是true,所以你最后不寫 commit也沒有關系,由于Hibernate已經把AutoCommit給關掉了,所以用Hibernate的時候,你在程序中不寫 Transaction的話,數據庫根本就沒有反應。
JTATransaction
如果你在EJB中使用Hibernate,或者準備用JTA來管理跨Session的長事務,那么就需要使用JTATransaction,先看一個例子:
javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");
Session s1 = sf.openSession();
...
s1.flush();
s1.close();
...
Session s2 = sf.openSession();
...
s2.flush();
s2.close();
tx.commit();
這是標準的使用JTA的代碼片斷,Transaction是跨Session的,它的生命周期比Session要長。如果你在EJB中使用 Hibernate,那么是最簡單不過的了,你什么Transaction代碼統統都不要寫了,直接在EJB的部署描述符上配置某某方法是否使用事務就可以了。
現在我們來分析一下JTATransaction的源代碼, net.sf.hibernate.transaction.JTATransaction:
public void begin(InitialContext context, ...
...
ut = (UserTransaction) context.lookup(utName);
...
看清楚了嗎? 和我上面寫的代碼 tx = new (Initial Context)().lookup("javax.transaction.UserTransaction"); 是不是完全一樣?
public void commit() ...
...
if (newTransaction) ut.commit();
...
JTATransaction的控制稍微復雜,不過仍然可以很清楚的看出來Hibernate是如何封裝JTA的Transaction代碼的。
但是你現在是否看到了什么問題? 仔細想一下,Hibernate Transaction是從Session中獲得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,這完全符合JDBC的 Transaction的操作順序,但是這個順序是和JTA的Transactioin操作順序徹底矛盾的!!! JTA是先啟動Transaction,然后啟動Session,關閉Session,最后提交Transaction,因此當你使用JTA的 Transaction的時候,那么就千萬不要使用Hibernate的Transaction,而是應該像我上面的JTA的代碼片斷那樣使用才行。
總結:
1、在JDBC上使用Hibernate
必須寫上Hibernate Transaction代碼,否則數據庫沒有反應。此時Hibernate的Transaction就是Connection.commit而已
2、在JTA上使用Hibernate
寫JTA的Transaction代碼,不要寫Hibernate的Transaction代碼,否則程序會報錯
3、在EJB上使用Hibernate
什么Transactioin代碼都不要寫,在EJB的部署描述符里面配置
|---CMT(Container Managed Transaction)
|
|---BMT(Bean Managed Transaction)
|
|----JDBC Transaction
|
|----JTA Transaction
posted @
2008-12-03 18:11 caihaibo 閱讀(262) |
評論 (0) |
編輯 收藏
原文出處:
http://www.aygfsteel.com/Andyluo/archive/2006/10/06/73584.html
在MySQL里創建外鍵時(Alter table xxx add constraint fk_xxx foreign key),提示錯誤,但只提示很簡單的信息:ERROR 1005 (HY000): Can't create table '.\env_mon\#sql-698_6.frm' (errno: 150)。根本起不到解決問題的作用。
要看錯誤的詳細提示,可以使用命令:(在MySQL Manual里搜索“errno 150”時找到)
SHOW ENGINE INNODB STATUS; //針對用INNODB存儲方式的數據庫
在信息中有一組【LATEST FOREIGN KEY ERROR】會有最近錯誤的詳細描述和解決辦法。
如:
Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.
(譯:不能在“被reference的表”里找到包含“被reference字段”的索引,或者是兩個關聯字段類型不匹配)
(我犯的錯誤是沒有在主表中設置主鍵-_-!,即第一種原因)

呵呵,今天建數據庫等時出的錯誤是由第二種原因引起,即兩個關聯字段類型不匹配,萬能的互聯網啊。。。。。。
posted @
2008-12-02 21:25 caihaibo 閱讀(159) |
評論 (0) |
編輯 收藏
HSQLDB是一個開放源代碼的JAVA數據庫,具有標準的SQL語法和JAVA接口。HSQLDB可以自由使用和分發,具有內存數據庫,獨立數據庫和客戶-服務器三種數據庫模式。本文介紹客戶-服務器模式的配置。
從HSQLDB主頁上下載HSQLDB:
http://hsqldb.org/
把下載的壓縮文件解開,然后在系統環境變量中加入hsqldb.jar,如:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;D:\hsqldb\lib\hsqldb.jar |
在硬盤中任意位置建一個目錄作為HSQLDB數據庫的主目錄,然后打開命令行,進入該目錄。在里面建一個server.properties文件,這是HSQLDB服務器模式的配置文件。可以在里面設置數據庫服務的監聽端口、服務名稱、數據文件的相對和絕對路徑:
#begin of 'server.properties' file
#數據庫服務的監聽端口
server.port=9001
#定義服務名稱,也即數據庫名稱。數據庫鏈接的URL即為
#jdbc:hsqldb:hsql://localhost:9001/bitan。
server.dbname.0=bitan
# 該服務在硬盤上的相對或絕對路徑。file:后面可以跟相#對或絕對路徑,如file:bitan表示數據文件為當前目錄下的bitan.*文件。服務名和路徑之間通過小數點后的數字關聯。比如database.0與#dbname.0關聯,database.1與dbname.1關聯,……, database.n與dbname.n關聯。
server.database.0=file:d:/bitan
#mounts a 'file_in_jar' database with alias 'restest'
#database connection url would be 'jdbc:hsqldb:hsql://host:1234/restest'
#server.database.1=res:/mypackage/test
#server.dbname.1=restest
#mounts a 100% in-memory (transient) database with alias 'memtest'
#database connection url would be 'jdbc:hsqldb:hsql://host:1234/memtest'
#server.database.2=mem:test
#server.dbname.2=memtest
#...
#server.database.n=...
#server.dbname.n=...
server.silent=true
#end of 'server.properties' file
|
進入上面設置的主目錄,啟動HSQLDB服務器:HSQLDB會在當前目錄下尋找server.properties文件,如果沒有發現該文件就使用默認設置。
D:\work\eclipse\hibe\data>java org.hsqldb.Server
[Server@1034bb5]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@1034bb5]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@1034bb5]: Startup sequence initiated from main() method
[Server@1034bb5]: Loaded properties from [D:\work\eclipse\hibe\data\server.prope
rties]
[Server@1034bb5]: Initiating startup sequence...
[Server@1034bb5]: Server socket opened successfully in 78 ms.
[Server@1034bb5]: Database [index=0, id=0, db=file:bitan, alias=bitan] opened su
cessfully in 1000 ms.
[Server@1034bb5]: Startup sequence completed in 1093 ms.
[Server@1034bb5]: 2005-11-03 11:30:47.046 HSQLDB server 1.8.0 is online
[Server@1034bb5]: To close normally, connect and execute SHUTDOWN SQL
[Server@1034bb5]: From command line, use [Ctrl]+[C] to abort abruptly
|
另外開一個命令行窗口,啟動HSQLDB的管理工具,這是GUI外觀的程序:
D:\work\eclipse\hibe\data>java org.hsqldb.util.DatabaseManager |
首先出現的是登錄窗口:

在“setting name”中填入“bitan”,下次啟動管理工具時,該字串就會出現在“recent”下拉框中。點擊“clr”按鈕可以清除該字串。在“type”中選擇HSQL Database Engine Server,然后在“URL”中輸入上面server.properties中的設置。
點“OK” 登錄以后,會出現下面的窗口,左邊是目錄窗口,右邊是SQL查詢窗口。我們可以在SQL查詢窗口中鍵入任意SQL語句(包括DDL,DML等等),然后點擊“Execute”執行該語句。HSQLDB安裝文件的doc目錄里附帶了PDF和HTML格式的文檔,介紹了HSQLDB的SQL語法、支持的數據類型、內置函數等等。

可以在SQL窗口里創建新表:
create table events
(event_id integer identity not null,
event_date date,
title varchar(500))
|
(ID的自動插入方式上,HSQLDB支持identity,如sql server;也支持序列+觸發器,如Oracle。)
可以插入記錄:
insert into events (event_id, event_date, title)
values (null, curdate(), 'bitan')
|
(curdate()是HSQLDB內置函數,返回當前日期)
啟動了HSQLDB服務器,我們就可以在java程序中以JDBC方式訪問數據庫了。hsqldb.jar中內置了JDBC驅動程序。
如下例,這是hibernate中的配置文件Hibernate.cfg.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql://jim:9001/bitan</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="show_sql">true</property>
<!-- property name="hbm2ddl.auto">update</property-->
<mapping resource="hbm/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration> |
posted @
2008-12-02 18:23 caihaibo 閱讀(961) |
評論 (0) |
編輯 收藏
HSQLDB是一個開源的DBMS數據庫,以其體積小巧、功能實用、使用方便而越來越受到開發人員的歡迎,特別是在平時的開發、單元測試中。如果你不想安裝龐大的ORACLE、SQL Server數據庫,同時又想盡快擁有一個可用的數據庫,那么HSQLDB絕對是你的首選。
Ant是一個人皆知之的打包發布工具,其簡單的語法,豐富的功能,讓我們不但可以方便地進行像資源管理、編譯、運行、測試的功能,同時也能夠快速地管理數據庫。
下面就以這兩者為例,來介紹一下他們的結合運用。
一、下載Ant和HSQLDB:
Ant的下載地址:http://ant.apache.org/bindownload.cgi
HSQLDB的下載地址:http://sourceforge.net/project/showfiles.php?group_id=23316
二、安裝Ant和HSQLDB:
Ant的安裝我就不多說了,可以參考其網站的文檔。HSQLDB的安裝更簡單,直接把hsqldb.jar包拷貝到你工程的lib目錄下就可以了。
三、配置HSQLDB:
在你的工程目錄下創建一個名為data的目錄,這是HSQLDB用來存放數據文件的地方。夠簡單吧,^_^。
四、編寫Ant腳本:
我們的Ant腳本很簡單,主要的功能有:啟動數據庫、關閉數據庫、顯示Swing界面的HSQLDB管理工具。請看下面的XML文件
<?xml version="1.0" encoding="UTF-8"?>

<project name="hibernate-hsql" default="startDb">

<!-- Set default database properties -->
<property name="hjar" value="lib/hsqldb.jar" />
<property name="hclass" value="org.hsqldb.Server" />
<property name="hfile" value="-database.0 data/test" />
<property name="halias" value="test" />
<property name="hport" value="9005" />

<!-- Start up HSQLDB instance, use default properties as arguments: database file,database name,port -->
<target name="startDb">
<java fork="true" classname="${hclass}"
classpath="${hjar}"
args="${hfile} -dbname.0 ${halias} -port ${hport}" />
</target>

<!-- Start up HSQLDB swing manager UI -->
<target name="hsqldm">
<java fork="true" classname="org.hsqldb.util.DatabaseManagerSwing"
classpath="${hjar}" />
</target>
<!-- Shut down HSQLDB -->
<target name="shutdownDb">
<sql classpath="${hjar}"
driver="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:hsql://localhost:${hport}/${halias}"
userid="sa" password=""
print="yes">
SHUTDOWN
</sql>
</target>
</project>
首先我們定義了幾個屬性:
·hjar:HSQLDB的JAR包位置
·hclass:org.hsqldb.Server,代表了HSQLDB。
·hfile:相當于URL,其中database.0代表了第一個數據庫,data是存放數據的地方,test是數據庫名
·halias:別名
·hport:端口號,默認為9905
接著我們我們看startDb這個Target,它相當于我們在DOS下轉到data目錄下,執行java -classpath /lib/hsqldb.jar org.hsqldb.Server。啟動HSQLDB數據庫。執行該Target后我們可以看到如下輸出:
startDb:
[java] The args attribute is deprecated. Please use nested arg elements.
[java] [Server@a62fc3]: [Thread[main,5,main]]: checkRunning(false) entered
[java] [Server@a62fc3]: [Thread[main,5,main]]: checkRunning(false) exited
[java] [Server@a62fc3]: Startup sequence initiated from main() method
[java] [Server@a62fc3]: Loaded properties from [D:\peng\Java\Pro\framework\hibernate\server.properties]
[java] [Server@a62fc3]: Initiating startup sequence...
[java] [Server@a62fc3]: Server socket opened successfully in 32 ms.
[java] [Server@a62fc3]: Database [index=0, id=0, db=file:data/test, alias=test] opened sucessfully in 968 ms.
[java] [Server@a62fc3]: Startup sequence completed in 1000 ms.
[java] [Server@a62fc3]: 2008-02-24 22:56:39.468 HSQLDB server 1.8.0 is online
[java] [Server@a62fc3]: To close normally, connect and execute SHUTDOWN SQL
[java] [Server@a62fc3]: From command line, use [Ctrl]+[C] to abort abruptly
hsqldbm這個Target是一個Swing界面的HSQLDB管理工具,可以在上面執行一系列的簡單的SQL操作,對于不想看日志的人來說比較方便,但功能不多。值得注意的是:執行這個Target并需要先啟動HSQLDB。
啟動后我們可以看到如下界面:

最后是HSQLB的關閉了。在Ant中我們可以采用<sql></sql>這個命令來執行SQL操作,首先當然是指定數據庫的一系列配置信息,然后在<sql></sql>之間書寫SQL語句。這里SHUTDOWN是HSQLDB提供的一個用來關閉數據庫的命令。執行該命令后,我們可以看到如下輸出:
[java] [Server@a62fc3]: Initiating shutdown sequence...
[java] [Server@a62fc3]: Shutdown sequence completed in 16 ms.
[java] [Server@a62fc3]: 2008-02-24 22:57:27.375 SHUTDOWN : System.exit() is called next
OK,這個簡單的腳本就完成了,現在我們可以直接在DOS、Eclipse下啟動、關閉、瀏覽HSQLDB了。
posted @
2008-12-02 17:43 caihaibo 閱讀(157) |
評論 (0) |
編輯 收藏
其實只要下載完後設定環境變數就可以了。
下載後解壓縮到C槽,更名資料夾為ant
接著設定以下環境變數,
ANT_HOME=c:\ant
JAVA_HOME=c:\jdk-1.5.0.05
PATH=%PATH%;%ANT_HOME%\bin
開始 -> 控制臺 -> 系統 -> 進階 -> 環境變數 ->
1. 新增 -> 變數名稱: ANT_HOME 變數值:
c:\ant -> 確定
2. 找到變數Path -> 編輯 -> 在變數值最後面加上
;%ANT_HOME%\bin (注意分號)
確定離開後重新啟動電腦。
重新啟動後,
開始 -> 執行 -> cmd -> 在命令提示字元下輸入 ant
若出現
Buildfile: build.xml does not exist!
Build failed
表示路徑已完成設定。
posted @
2008-11-29 23:24 caihaibo|
編輯 收藏
美國《心身醫學》雜志刊登一項最新研究顯示,夫妻爭執時保持緘默的女性面對死亡的幾率是在爭執中能自由表達意見女性的4倍,抑郁癥和腸胃病在前者人群中較為常見。
“我常常跟女士說,如果跟你先生吵架了,什么時候把你氣哭了再走,別氣半截。”北京崔月犁傳統醫學研究中心研究員樊正倫說。
“有人為了實驗老鼠生氣,就掐它尾巴讓它生氣,制造一個生氣的模型,但那與人生氣不可能一樣,人就是人,是很難模擬的。”樊正倫指出,中醫說喜、怒、憂、思、悲、恐、驚是作為一個正常人必須有的情緒,而這些情緒跟你的五臟密切相關。所以情緒的好壞、變化直接影響著你的生命活動。
怒與肝相關。生氣的時候肝氣特別旺,一哭,肺氣上來了,肺屬金,肝屬木,金克木,肺氣一通肝氣就調達了,如果氣一半,肝氣沒下來,回頭還得接著吵架不說,還容易得病。“所以,吵架時不能氣半截,要吵透。”樊正倫說。
五臟相互制約,如果可以很好地調整情緒,就可以少生很多病。樊正倫說,臨床中發現,女人三四十歲時,甲狀腺、卵巢、乳腺都容易出現一系列病變。其原因是35歲到42歲這個階段,陽明脈衰,自身運化的能力弱了。而且這個年齡,上有老,下有小,在家里和單位都是頂梁柱,郁悶得不到疏散,這類疾病的發病率就非常高。
他建議,這個年齡段的女性要自覺地調整自己的狀態,調整自己的情緒,在特別抑郁的時候大哭一場,或者大罵一頓,能自如地嬉笑怒罵,疾病就會少很多。
男性以陽氣為主,表現得不像女人那么劇烈,不愛哭,什么事都憋著扛著,認為這樣才是男子漢。這也是不對的,男人與女人一樣,都需要宣泄,以免肝氣郁結。
posted @
2008-11-26 22:43 caihaibo 閱讀(222) |
評論 (0) |
編輯 收藏
我認為生氣就是當一個人認為某種事物或現象違背了他內心的準則或信念時產生的一種情緒體驗。
我們每個人都有自己的信念系統和價值系統。比如說我認為怎么樣才是對的,別人應該怎么樣才是對的,我應該怎么樣才是對的等等,一旦別人或自己的一些行為違背了這些標準,我們就會不高興和生氣。
這么看來生氣是必然的了,確實如此。只不過生氣也有輕重之分,也有難易之分。
一個人如果他的標準越寬容他就越難生氣,所謂你的胸懷的大小決定于你生氣事情的大小。動不動就生氣的人,是因為他的信念系統和價值系統認同的范圍太窄,所以別人或他自己的一些行為很容易觸犯他的準則,使他不高興,于是生氣。其實別人可能根本就沒有做錯什么。當然別人做沒做錯也正是根據他的信念系統來評估的,所以別人的對錯也沒有客觀標準,完全在于接受方的評價。
其實還有一點,就是不容易生氣的人除了擁有比較寬容的信念系統以外,他還有一條直接避免生氣的信念,那就是同理心,即將心比心。雖然他不贊同別人的意見或行為。但他能理解,如果能做到這一點,生氣的次數大概要減少80%。
還有一條信念就是,可以將生氣壓到最低限度。那就是當別人的行為你不能贊同,也不能表示理解,可以說你認定他完全錯誤,這時候告誡自己,生氣就是拿別人的錯誤來懲罰自己。有了這一條,你想生氣都難了。
所以還是那句行話:生氣是一種態度,是一種選擇,全在乎你愿不愿意,不關別人的事。千萬別說是誰惹了你,是誰令你生氣,生氣完全是你自己要的,自己選的。
建議:每天堅持做長跑也是鍛練自控能力的好方法,每天2000米,這樣你每天堅持,你的自控能力必然能改善,三天打魚兩天曬網就不可能改善的哦.
我送你12個字:緩一緩 再生氣 想一想 再行動!
有句話送給你,不要拿別人的錯誤來懲罰自己。很多事情,也沒必要事事完美,與其改變別人做的更好,不如先改變自己接受一些缺點。或者說把一些你看不慣的東西看成是芝麻綠豆大。
有個故事不知你有沒聽過,鴨子看東西時,眼睛是放大鏡,它看到的人都很大,所以它看到人的時候,總是以為人要來打它,所以它會去咬人,牛看東西的時候,所以的東西在它的眼里都是螞蟻一樣這么小,所以它不會襲擊人類。
要生氣的時候先問問自己:
我為什么生氣?
生氣有什么用?
生完氣會給別人造成什么傷害?有什么后果?
回答完這幾個問題,再從一數到十。
告訴他:怒主肝,生氣直接傷肝,肝臟出了問題會影響其他器官,繼而身體病就來了。相信他知道了利害關系,會盡快控制自己的情緒。
每次生氣都記個數,看看自己每天會生多少次。
然后學習控制自己,慢慢減少次數!!
posted @
2008-11-26 21:53 caihaibo 閱讀(1804) |
評論 (0) |
編輯 收藏
MyEclipse Update Progress Error現象:
頻繁彈出Update Progress(Time of error:……)窗口。
.log文件里
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalArgumentException: Argument cannot be null)
at org.eclipse.swt.SWT.error(SWT.java:3563)
at org.eclipse.swt.SWT.error(SWT.java:3481)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:126)
中略
Caused by: java.lang.IllegalArgumentException: Argument cannot be null
at org.eclipse.swt.SWT.error(SWT.java:3547)
at org.eclipse.swt.SWT.error(SWT.java:3481)
at org.eclipse.swt.SWT.error(SWT.java:3452)
略
解決方案
在某英文網站上找到一下答案,試了,沒好用。你們可以試下OK不?
a) leave myeclipse
b) point explorer to the .metadata folder
c) right mouse button select "search" giving criteria 'org.eclipse.update*' (without quotes)
d) deleting all the files/folders found
e) restart myeclipse
通過上面的聯想到其它UpdateStamp的文件,到MyEclipse的安裝目錄,之下的“eclipseconfigurationorg.eclipse.update”目錄,
發現有一個,last.config.stamp。
a) leave myeclipse
b) delete last.config.stamp
c) restart myeclipse
之后就沒有同樣的窗口彈出來。
但是,如果在某項目上右鍵打開項目的屬性窗口,點擊“Myeclipse”的Update按鈕,又會彈出同樣的窗口。
這樣的話,只要再重復一下上述操作就OK。
posted @
2008-11-21 14:57 caihaibo 閱讀(10596) |
評論 (4) |
編輯 收藏
本文所用環境:Eclipse 3.2 + MyEclipse 5.0GA + WebLogic 9.2
選擇 WebLogic 9.2 的原因
①WebLogic 8 支持的是 J2EE 1.3,也就是 Servlet 2.3 規范。若在 MyEclipse 中建立 Web Project 時選擇了 J2EE 1.4[default],在部署的時候就會出現異常,提示部署描述符 web.xml 是畸形的,也就是未通過 DTD 檢驗。因為 J2EE 1.4 使用的是 Servlet 2.4 規范,這直接體現在 web.xml 部署描述符的頭部引用中。這就是有些朋友遇到的,部署在 Tomcat 和 JBoss 中能夠運行的 JSP 程序,部署到 WebLogic 8 就無法運行的原因之一。解決這個問題,需要將 WebLogic 升級到 9.2 版本;或者使用 J2EE 1.3。
Servlet 2.3 規范生成的 web.xml 頭部:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
...
</web-app>
Servlet 2.4 規范生成的 web.xml 頭部:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
...
</web-app>
②若在上一個問題選擇了 J2EE 1.3 進行開發后,在部署時會出現另外的異常,提示“Unsupported major.minor version 49.0”—— 又是版本問題,這次是由于 JDK 版本不支持造成的。WebLogic 8 不支持 JDK 1.5,由 JDK 1.5 編譯的程序無法部署到只支持 JDK 1.4 的服務器上運行。解決的辦法也有兩個:用 JDK 1.4 重新編譯;或者換用支持 JDK 1.5 的服務器,也就是升級到 WebLogic 9.2。
配置 WebLogic 9.2
安裝 WebLogic 比較容易,在這里就不再累述了,大家可以參閱相關文檔。現在著重講一下 WebLogic 的配置,因為后面在配置 MyEclipse 時將用到這里的配置信息。
①運行開始 -> 程序 -> BEA Products -> Tools -> Configuration Wizard。
②選擇 Create a new WebLogic domain,Next。
③在 Select Domain Source 界面保持默認,Next。
④在 User name 處輸入 user,兩個 password 都輸入 12345678(密碼要求 8 位),Next。
⑤ 在 Configure Server Start Mode and JDK 界面中保持默認,即 JDK 選擇的是“Sun SDK 1.5.0_04 @ C:BEAjdk150_04”,注意這里若選擇“Other JDK”配置比 SDK 1.5.0_04 更高的版本,服務器啟動時將會出現異常,所以最好保持默認,然后 Next。
⑥在 Customize Environment and Services Settings 界面中默認為 No,Next。
⑦在 Domain name 處輸入 mydomain,點擊 Create。
⑧完成后點擊 Done 關閉 Configuration Wizard 對話框。
⑨ 運行開始 -> 程序 -> BEA Products -> User Projects -> mydomain -> Start Admin Server for Weblogic Server Domain,檢查服務器是否啟動成功。
配置 MyEclipse 的 WebLogic 9 服務器
啟動 Eclipse,選擇“Window -> Preferences”菜單,打開首選項對話框。展開 MyEclipse 下的 Application Servers 節點,點擊 WebLogic 9,選中右邊的 Enable 單選按鈕,啟用 WebLogic 服務器。配置如下:
①BEA home directory:C:BEA(假定 WebLogic 安裝在 C:BEA 目錄中)
②WebLogic installation directory:C:BEAWebLogic92
③Admin username:user(來自 WebLogic 中的配置)
④Admin password:12345678(來自 WebLogic 中的配置)
⑤Execution domain root:C:BEAuser_projectsdomainsmydomain
⑥Execution server name:AdminServer
⑦Security policy file:C:BEAWebLogic92serverlibweblogic.policy
⑧JAAS login configuration file:(Null)
接著展開 WebLogic 9 節點,點擊 JDK,在右邊的 WLS JDK name 處選擇 WebLogic 9 的默認 JDK。這里組合框中缺省為單獨安裝的 JRE。單擊 Add 按鈕,彈出 WebLogic -> Add JVM 對話框,在 JRE 主目錄處選擇 WebLogic 安裝文件夾中的 JDK 文件夾,我的版本為 C:BEAjdk150_04,程序會自動填充其他選項。單擊確定按鈕關閉對話框。這時候就可以在 WLS JDK name 組合框中選擇 jdk150_04 了。
至此,MyEclipse 中 WebLogic 9 的配置工作就算完成了。下面可以看看在 Eclipse 中能否啟動 WebLogic 服務器了?安裝了 MyEclipse 之后,Eclipse 工具欄中就會有一個“Run/Stop/Restart MyEclipse Application Servers”下拉按鈕。點擊該按鈕的下拉部分,選擇“WebLogic 9 -> Start”菜單,即開始啟動 WebLogic 了。通過查看控制臺的消息,就可以檢查啟動是否成功,或發生什么異常。
posted @
2008-11-19 17:31 caihaibo 閱讀(234) |
評論 (0) |
編輯 收藏