⑴ 如何基於Hibernate在java類中實現,根據資料庫表生成持久化類代碼和映射文件hbm.xml
這個就要藉助hibernate tools跟xdoclet來完成了;
首先你要在你的java代碼里應用xdoclet標簽,例如
Java code
private String name;
/**
* @hibernate.property column = "name" length = "50"
*/
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
其中,寫到javadoc上的@hibernate.property column = "name" length = "50"
就是xdoclet標簽,它需要xdoclet程序來處理,這里就需要用到hibernate tools。
具體做的話一般情況是建一個ant腳本來完成,例如:
XML code
<target name="hibernate-xdoclet" depends="init, init-xdoclet_hibernate"
description="Generate mapping documents">
<echo>+---------------------------------------------------+</echo>
<echo>| |</echo>
<echo>| R U N N I N G H I B E R N A T E D O C L E T |</echo>
<echo>| |</echo>
<echo>+---------------------------------------------------+</echo>
<delete>
<fileset dir="${hibernate.cfg.xml.dir}" includes="hibernate.cfg.xml" />
</delete>
<echo message="hibernate.cfg.xml at ${hibernate.cfg.xml.dir}"></echo>
<sleep seconds="1"/>
<hibernatedoclet
destdir="${hibernate.cfg.xml.dir}"
excludedtags="@version,@author,@todo,@see"
addedtags="@xdoclet-generated at ${TODAY},@right The XDoclet Team,@author XDoclet,@version ${version}"
force="false"
verbose="true">
<fileset dir="${src.dir}">
<include name="com/**/model/**/*.java"/>
</fileset>
<hibernatecfg
version="3.0"
destDir="${hibernate.cfg.xml.dir}"
dialect="org.hibernate.dialect.Oracle9Dialect"
driver="oracle.jdbc.driver.OracleDriver"
jdbcUrl="jdbc:oracle:thin:@localhost:1521:RESDL"
userName="test"
password="123"
showSql="true"
schema="true"
validateXML="true"
/>
<hibernate version="3.0"/>
</hibernatedoclet>
</target>
上面的代碼是生成hbm跟cfg文件的,下面再介紹如何從java類到資料庫:
XML code
<target name="hibernate-schema" depends="init, init-hibernate-schema"
description="Generate DB schema from the O/R mapping files">
<echo>+---------------------------------------------------+</echo>
<echo>| |</echo>
<echo>| R U N N I N G D B S C H E M A |</echo>
<echo>| |</echo>
<echo>+---------------------------------------------------+</echo>
<echo message="mysql.sql at etc/hbm2doc"></echo>
<sleep seconds="1"/>
<hibernatetool destdir="etc/hbm2doc">
<configuration propertyFile="${src.dir}/hibernate.properties">
<fileset dir="${hibernate.cfg.xml.dir}">
<include name="com/**/model/**/*.hbm.xml"/>
</fileset>
</configuration>
<hbm2ddl drop="true"
outputfilename="mysql.sql"/>
<hbm2doc/>
</hibernatetool>
</target>
當然ant工程里的一些初始化需要自己定義,我這里只摘錄關鍵部分,具體的東西請查閱相關文檔,hibernate tutorail里就有個例子
⑵ linux裡面什麼是數據持久化
數據持久化顧名思義就是把程序中的數據以某種形式保存到某存貯介質中,以達到持久化的目的。當程序運行時,一些數據是臨時保存在內存中,一旦退出系統,這些數據就丟失了。那麼,使用某種手段將數據保存在硬碟上或者資料庫中,這樣即使退出系統後又重新啟動系統,那麼這些數據仍然可以重新找回來。
例如管理員向一個用戶管理系統中添加了一個用戶的資料,那麼這個系統需要將新添加的資料保存到資料庫中,否則系統退出或者電腦重啟後該用戶資料就會丟失。將數據從內存保存到資料庫中,這便是數據的持久化。當然,資料庫只是持久化方式中的一種,也可以保存在其他的永久存貯介質中。
圖為數據持久化的過程示意圖。
持久化(Persistence),即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁碟)。持久化的主要應用是將內存中的對象存儲在資料庫中,或者存儲在磁碟文件中、XML數據文件中等等。
持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。
DBC就是一種持久化機制。文件IO也是一種持久化機制。
日常持久化的方法
在一定周期內保持不變就是持久化,持久化是針對時間來說的。資料庫中的數據就是持久化了的數據,只要你不去刪除或修改。比如在瀏覽器中一次Session會話中Session對象變數也是不變的,是Session容器中持久化。對象持久化的方式有很多種,根據周期不同有,page,Session,Application。對象序列化機制對於需要將對象的狀態保存到文件中,而後能夠通過讀入對象狀態來重新構造對象,恢復程序狀態. 對象序列化的過程是對象持久化的方法之一,把對象保存到文件中。
簡單的理解持久化可以在二個層面:應用層和系統層、
應用層
如果關閉(shutdown)你的應用然後重新啟動則先前的數據依然存在。
系統層
如果關閉(shutdown)你的系統(電腦)然後重新啟動則先前的數據依然存在。
持久化是一種對象服務實現至少3個介面
,就是把內存中的對象保存到外存中,讓以後能夠取回。需要實現至少3個介面:
void Save(object o) 把一個對象保存到外存中
Object Load(object oid) 通過對象標識從外存中取回對象
boolExists(object oid) 檢查外存中是否存在某個對象.
類似概念序列化
我們先跳開一下,看看另一個類似的有用概念:序列化Serialize也是一種對象服務,就是把內存中的對象序列化成流、或者把流反序列化成對象。需要實現2個介面:
void Serialize(Stream stream,object o) 把對象序列化到流中
object Deserialize(Stream stream) 把流反序列化成對象
序列化和持久化很相似,有些人甚至混為一談,其實還是有區別的,序列化是為了解決對象的傳輸問題,傳輸可以在線程之間、進程之間、內存外存之間、主機之間進行。我之所以在這里提到序列化,是因為我們可以利用序列化來輔助持久化,可以說凡是可以持久化的對象都可以序列化,因為序列化相對容易一些(也不是很容易),所以主流的軟體基礎設施,比如.net和java,已經把序列化的框架完成了。
持久化方案可以分為關系資料庫方案、文件方案、對象資料庫方案、xml資料庫方案
現今主流的持久化方案是關系資料庫方案,
關系資料庫方案不僅解決了並發的問題,更重要的是,關系資料庫還提供了持久化服務之外的價值:統計分析功能。剛才我說到,凡是可以序列化的對象都可以持久化,極端的說,我們可以只建立一個表Object(OID,Bytes),但基本上沒有人這么做,因為一旦這樣,我們就失去了關系資料庫額外的統計分析功能。關系資料庫和面向對象之間有一條鴻溝,因為二者模式不匹配,所以就存在一個OR映射問題。
Redis支持兩種數據持久化方式:rdb方式和aof方式。前者會根據配置的規則定時將內存中的數據持久化到硬碟上,後者則是在每次執行寫命令之後將命令記錄下來。兩種持久化方式可以單獨使用,但是通常會將兩者結合使用。
1、RDB方式
RDB方式的持久化是通過快照的方式完成的。當符合某種規則時,會將內存中的數據全量生成一份副本存儲到硬碟上,這個過程稱作」快照」,redis默認開啟該持久化功能,具體配置如下:
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename mp.rdb
#文件名稱
dir ./
#rdb文件存放路徑
配置後系統會自動進行快照,save 60 10000表示60秒內有10000次寫入,那麼就會調用bgsave
除了系統自動進行快照外,我們也可以手動執行SAVE或BGSAVE命令主動進行快照操作:
執行SAVE或BGSAVE命令
執行FLUSHALL命令
2、AOF方式
在使用Redis存儲非臨時數據時,一般都需要打開AOF持久化來降低進程終止導致的數據丟失,AOF可以將Redis執行的每一條寫命令追加到硬碟文件中,這一過程會降低Redis的性能。
默認情況下,Redis沒有開啟AOF(append only file)持久化功能,可以通過在配置文件中作如下配置啟用:
appendonly no #是否開啟aof,開啟時將no改為yes
appendfilename "appendonly.aof" 持久化文件名稱
auto-aof-rewrite-percentage 100
#當前AOF文件大小是上次日誌重寫得到AOF文件大小的二倍時,自動啟動新的日誌重寫過程。
auto-aof-rewrite-min-size 64mb
#當前AOF文件啟動新的日誌重寫過程的最小值,避免剛剛啟動Reids時由於文件尺寸較小導致頻繁的重寫。
appendfsync :everysec (推薦配置)
#持久化策略
always (同步持久化,每次發生數據變更會被立即記錄到磁碟,性能差但數據完整性比較好)
everysec (非同步操作,每秒記錄,如果一秒鍾內宕機,有數據丟失)
no (將緩存回寫的策略交給系統,linux 默認是30秒將緩沖區的數據回寫硬碟的)
一般來說可以考慮同時使用兩種持久化方案.