導航:首頁 > 編程語言 > java怎麼解決數據持久

java怎麼解決數據持久

發布時間:2023-03-11 15:45:31

A. 用java代碼如何設置activemq消息持久化到資料庫

ActiveMQ持久化消息的二種方式;
1、持久化為文件
這個裝ActiveMQ時默認就是這種,只要設置消息為持久化就可以了。涉及到的配置和代碼有:
<persistenceAdapter>
<kahaDB directory="${activemq.base}/data/kahadb"/>
</persistenceAdapter>
procer.Send(request, MsgDeliveryMode.Persistent, level, TimeSpan.MinValue);

2、持久化為MySql
首先需要把MySql的驅動放到ActiveMQ的Lib目錄下,我用的文件名字是:mysql-connector-java-5.0.4-bin.jar
接下來修改配置文件
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#derby-ds"/>
</persistenceAdapter>
在配置文件中的broker節點外增加
<bean id="derby-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
從配置中可以看出資料庫的名稱是activemq,需要手動在MySql中增加這個庫。
然後重新啟動消息隊列,會發現多了3張表
1:activemq_acks
2:activemq_lock
3:activemq_msgs

B. java數據持久化的工具有哪些

User類實現serizable介面,然後在main函數里new一個ObjectDataOutStream,用writeObject方法將user的實例穿進去。就寫入文件了。讀出來專就屬new一個輸入流賭出來就行。

C. java異常處理,報異常的話怎麼處理對象值,並持久化到資料庫中

//沒看到有人回答你,我還沒學到框架,不知道那個是不是可以很便捷操作你說的這樣過程
//我寫個基礎點的,就是一個序列化與反序列化的過程,你這個是要偵測到參數異常的時候
//才開始進行序列化操作的,其實我覺得原理應該都是一樣的吧!
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.io.Serializable;
importjava.util.ArrayList;
publicclassObjectTest{
Filepath=newFile("K:/IO測試/Bai");//路徑!
staticFilefile=null;
Stringname=null;
publicstaticvoidmain(String[]args){
ObjectTestobj=newObjectTest();
obj.createUser();//創建對象,傳入非法參數進行捕捉!

Useru=obj.des();//反序列化過程!
if(u!=null)
System.out.println(" 查看對象屬性: "+u);
}
//1.序列化過程!
publicStringcreateUser(){
ObjectOutputStreamoos=null;
ArrayList<User>userMapper=newArrayList<>();
Useruser=newUser();
try{
user.setName("小明");
name=user.getName()+".object";
user.setStatus(0);//將狀態設置為成功
userMapper.add(user);
}catch(Exceptione){
//報異常,將status設置為1存到庫中
System.out.println("偵測到參數異常,即將存入資料庫!");
user.setStatus(1);
Filetem=newFile(path,name);
if(!tem.exists()){//如果異常文件不存在,就創建!
file=newFile(path,name);
try{
oos=newObjectOutputStream(newFileOutputStream(file));
oos.writeObject(user);
System.out.println("正在寫入數據!");
}catch(FileNotFoundExceptione1){
e1.printStackTrace();
}catch(IOExceptione1){
e1.printStackTrace();
}
}else{
System.out.println("資料庫中已經有數據,寫入失敗,直接讀取! ");
}

}finally{
if(oos!=null){
try{
oos.close();
System.out.println("存入完成! ");
}catch(IOExceptione){
e.printStackTrace();
}
}
}
returnname;
}
//2.反序列化過程:也就是讀取序列化文件的過程!
privateUserdes(){
ObjectInputStreamois=null;
Filefiled=newFile(path,name);
if(!filed.exists()){
System.out.println("數據不存在,失敗!");
returnnull;
}
try{
System.out.println("數據存在,開始反序列化!");
ois=newObjectInputStream(newFileInputStream(newFile(path,name)));
return(User)ois.readObject();

}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();

}finally{
if(ois!=null){
try{
ois.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
returnnull;
}
}
//角色類
{
=1L;
privateStringname;
privateintstatus;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetStatus(){
returnstatus;
}
publicvoidsetStatus(intstatus){
if(status<=0){
thrownewRuntimeException("");
}
this.status=status;
}
publicStringtoString(){
return"姓名:"+name+"; 年齡:"+status;
}
}

D. java消息隊列是怎麼實現數據持久化的

java中的消息隊列消息隊列是線程間通訊的手段:import java.util.*public class MsgQueue{ private Vector queue = null; public MsgQueue(){ queue = new Vector(); } public synchronized void send(Object o) { queue.addElement(o); } public synchronized Object recv(){ if(queue.size()==0) return null; Object o = queue.firstElement(); queue.removeElementAt(0);//or queue[0] = null can also work return o;}}因為java中是locked by object的所以添加synchronized 就可以用於線程同步鎖定對象可以作為多線程處理多任務的存放task的隊列。他的client包括封裝好的task類以及thread類Java的多線程-線程間的通信2009-08-25 21:581. 線程的幾種狀態線程有四種狀態,任何一個線程肯定處於這四種狀態中的一種:1) 產生(New):線程對象已經產生,但尚未被啟動,所以無法執行。如通過new產生了一個線程對象後沒對它調用start()函數之前。2) 可執行(Runnable):每個支持多線程的系統都有一個排程器,排程器會從線程池中選擇一個線程並啟動它。當一個線程處於可執行狀態時,表示它可能正處於線程池中等待排排程器啟動它;也可能它已正在執行。如執行了一個線程對象的start()方法後,線程就處於可執行狀態,但顯而易見的是此時線程不一定正在執行中。3) 死亡(Dead):當一個線程正常結束,它便處於死亡狀態。如一個線程的run()函數執行完畢後線程就進入死亡狀態。4) 停滯(Blocked):當一個線程處於停滯狀態時,系統排程器就會忽略它,不對它進行排程。當處於停滯狀態的線程重新回到可執行狀態時,它有可能重新執行。如通過對一個線程調用wait()函數後,線程就進入停滯狀態,只有當兩次對該線程調用notify或notifyAll後它才能兩次回到可執行狀態。2. classThread下的常用函數函數2.1 suspend()、resume()1) 通過suspend()函數,可使線程進入停滯狀態。通過suspend()使線程進入停滯狀態後,除非收到resume()消息,否則該線程不會變回可執行狀態。2) 當調用suspend()函數後,線程不會釋放它的「鎖標志」。例11:class TestThreadMethod extends Thread{public static int shareVar = 0;public TestThreadMethod(String name){super(name);}public synchronized void run(){if(shareVar==0){for(int i=0; i<5; i ){shareVar ;if(shareVar==5){this.suspend();//(1)}}}else{System.out.print(Thread.currentThread()

E. 用Java編程來實現CPU和Memory監控器並將數據持久化,保存在文件中。急用

眾所周知,java在處理數據量比較大的時候,載入到內存必然會導致內存溢出,而在一些數據處理中我們不得不去處理海量數據,在做數據處理中,我們常見的手段是分解,壓縮,並行,臨時文件等方法;例如,我們要將資料庫(不論是什麼資料庫)的數據導出到一個文件,一般是Excel或文本格式的CSV;對於Excel來講,對於POI和JXL的介面,你很多時候沒有法去控制內存什麼時候向磁碟寫入,很惡心,而且這些API在內存構造的對象大小將比數據原有的大小要大很多倍數,所以你不得不去拆分Excel,還好,POI開始意識到這個問題,在3.8.4的版本後,開始提供cache的行數,提供了SXSSFWorkbook的介面,可以設置在內存中的行數,不過可惜的是,他當你超過這個行數,每添加一行,它就將相對行數前面的一行寫入磁碟(如你設置2000行的話,當你寫第20001行的時候,他會將第一行寫入磁碟),其實這個時候他些的臨時文件,以至於不消耗內存,不過這樣你會發現,刷磁碟的頻率會非常高,我們的確不想這樣,因為我們想讓他達到一個范圍一次性將數據刷如磁碟,比如一次刷1M之類的做法,可惜現在還沒有這種API,很痛苦,我自己做過測試,通過寫小的Excel比使用目前提供刷磁碟的API來寫大文件,效率要高一些,而且這樣如果訪問的人稍微多一些磁碟IO可能會扛不住,因為IO資源是非常有限的,所以還是拆文件才是上策;而當我們寫CSV,也就是文本類型的文件,我們很多時候是可以自己控制的,不過你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式寫入即可被CSV識別出來;如何寫入呢?下面來說說。。。在處理數據層面,如從資料庫中讀取數據,生成本地文件,寫代碼為了方便,我們未必要1M怎麼來處理,這個交給底層的驅動程序去拆分,對於我們的程序來講我們認為它是連續寫即可;我們比如想將一個1000W數據的資料庫表,導出到文件;此時,你要麼進行分頁,oracle當然用三層包裝即可,mysql用limit,不過分頁每次都會新的查詢,而且隨著翻頁,會越來越慢,其實我們想拿到一個句柄,然後向下游動,編譯一部分數據(如10000行)將寫文件一次(寫文件細節不多說了,這個是最基本的),需要注意的時候每次buffer的數據,在用outputstream寫入的時候,最好flush一下,將緩沖區清空下;接下來,執行一個沒有where條件的SQL,會不會將內存撐爆?是的,這個問題我們值得去思考下,通過API發現可以對SQL進行一些操作,例如,通過:PreparedStatementstatement=connection.prepareStatement(sql),這是默認得到的預編譯,還可以通過設置:PreparedStatementstatement=connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);來設置游標的方式,以至於游標不是將數據直接cache到本地內存,然後通過設置statement.setFetchSize(200);設置游標每次遍歷的大小;OK,這個其實我用過,oracle用了和沒用沒區別,因為oracle的jdbcAPI默認就是不會將數據cache到java的內存中的,而mysql里頭設置根本無效,我上面說了一堆廢話,呵呵,我只是想說,java提供的標准API也未必有效,很多時候要看廠商的實現機制,還有這個設置是很多網上說有效的,但是這純屬抄襲;對於oracle上面說了不用關心,他本身就不是cache到內存,所以java內存不會導致什麼問題,如果是mysql,首先必須使用5以上的版本,然後在連接參數上加上useCursorFetch=true這個參數,至於游標大小可以通過連接參數上加上:defaultFetchSize=1000來設置,例如:jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeconvertToNull&useCursorFetch=true&defaultFetchSize=1000上次被這個問題糾結了很久(mysql的數據老導致程序內存膨脹,並行2個直接系統就宕了),還去看了很多源碼才發現奇跡竟然在這里,最後經過mysql文檔的確認,然後進行測試,並行多個,而且數據量都是500W以上的,都不會導致內存膨脹,GC一切正常,這個問題終於完結了。我們再聊聊其他的,數據拆分和合並,當數據文件多的時候我們想合並,當文件太大想要拆分,合並和拆分的過程也會遇到類似的問題,還好,這個在我們可控制的范圍內,如果文件中的數據最終是可以組織的,那麼在拆分和合並的時候,此時就不要按照數據邏輯行數來做了,因為行數最終你需要解釋數據本身來判定,但是只是做拆分是沒有必要的,你需要的是做二進制處理,在這個二進制處理過程,你要注意了,和平時read文件不要使用一樣的方式,平時大多對一個文件讀取只是用一次read操作,如果對於大文件內存肯定直接掛掉了,不用多說,你此時因該每次讀取一個可控范圍的數據,read方法提供了重載的offset和length的范圍,這個在循環過程中自己可以計算出來,寫入大文件和上面一樣,不要讀取到一定程序就要通過寫入流flush到磁碟;其實對於小數據量的處理在現代的NIO技術的中也有用到,例如多個終端同時請求一個大文件下載,例如視頻下載吧,在常規的情況下,如果用java的容器來處理,一般會發生兩種情況:其一為內存溢出,因為每個請求都要載入一個文件大小的內存甚至於,因為java包裝的時候會產生很多其他的內存開銷,如果使用二進制會產生得少一些,而且在經過輸入輸出流的過程中還會經歷幾次內存拷貝,當然如果有你類似nginx之類的中間件,那麼你可以通過send_file模式發送出去,但是如果你要用程序來處理的時候,內存除非你足夠大,但是java內存再大也會有GC的時候,如果你內存真的很大,GC的時候死定了,當然這個地方也可以考慮自己通過直接內存的調用和釋放來實現,不過要求剩餘的物理內存也足夠大才行,那麼足夠大是多大呢?這個不好說,要看文件本身的大小和訪問的頻率;其二為假如內存足夠大,無限制大,那麼此時的限制就是線程,傳統的IO模型是線程是一個請求一個線程,這個線程從主線程從線程池中分配後,就開始工作,經過你的Context包裝、Filter、攔截器、業務代碼各個層次和業務邏輯、訪問資料庫、訪問文件、渲染結果等等,其實整個過程線程都是被掛住的,所以這部分資源非常有限,而且如果是大文件操作是屬於IO密集型的操作,大量的CPU時間是空餘的,方法最直接當然是增加線程數來控制,當然內存足夠大也有足夠的空間來申請線程池,不過一般來講一個進程的線程池一般會受到限制也不建議太多的,而在有限的系統資源下,要提高性能,我們開始有了newIO技術,也就是NIO技術,新版的裡面又有了AIO技術,NIO只能算是非同步IO,但是在中間讀寫過程仍然是阻塞的(也就是在真正的讀寫過程,但是不會去關心中途的響應),還未做到真正的非同步IO,在監聽connect的時候他是不需要很多線程參與的,有單獨的線程去處理,連接也又傳統的socket變成了selector,對於不需要進行數據處理的是無需分配線程處理的;而AIO通過了一種所謂的回調注冊來完成,當然還需要OS的支持,當會掉的時候會去分配線程,目前還不是很成熟,性能最多和NIO吃平,不過隨著技術發展,AIO必然會超越NIO,目前谷歌V8虛擬機引擎所驅動的node.js就是類似的模式,有關這種技術不是本文的說明重點;將上面兩者結合起來就是要解決大文件,還要並行度,最土的方法是將文件每次請求的大小降低到一定程度,如8K(這個大小是經過測試後網路傳輸較為適宜的大小,本地讀取文件並不需要這么小),如果再做深入一些,可以做一定程度的cache,將多個請求的一樣的文件,cache在內存或分布式緩存中,你不用將整個文件cache在內存中,將近期使用的cache幾秒左右即可,或你可以採用一些熱點的演算法來配合;類似迅雷下載的斷點傳送中(不過迅雷的網路協議不太一樣),它在處理下載數據的時候未必是連續的,只要最終能合並即可,在伺服器端可以反過來,誰正好需要這塊的數據,就給它就可以;才用NIO後,可以支持很大的連接和並發,本地通過NIO做socket連接測試,100個終端同時請求一個線程的伺服器,正常的WEB應用是第一個文件沒有發送完成,第二個請求要麼等待,要麼超時,要麼直接拒絕得不到連接,改成NIO後此時100個請求都能連接上伺服器端,服務端只需要1個線程來處理數據就可以,將很多數據傳遞給這些連接請求資源,每次讀取一部分數據傳遞出去,不過可以計算的是,在總體長連接傳輸過程中總體效率並不會提升,只是相對相應和所開銷的內存得到量化控制,這就是技術的魅力,也許不要太多的演算法,不過你得懂他。類似的數據處理還有很多,有些時候還會將就效率問題,比如在HBase的文件拆分和合並過程中,要不影響線上業務是比較難的事情,很多問題值得我們去研究場景,因為不同的場景有不同的方法去解決,但是大同小異,明白思想和方法,明白內存和體系架構,明白你所面臨的是沈陽的場景,只是細節上改變可以帶來驚人的效果。

閱讀全文

與java怎麼解決數據持久相關的資料

熱點內容
省內順豐郵文件多少錢 瀏覽:715
絕密級文件應保留多少年 瀏覽:701
發文件給同事怎麼說 瀏覽:468
蘋果80歲用什麼app 瀏覽:28
順豐寄快遞文件多少錢 瀏覽:164
消費邦app是怎麼反現的 瀏覽:112
java調用介面方法 瀏覽:742
微信一種以上綁定關系 瀏覽:183
word圖片編輯大小邊框 瀏覽:468
威迅java培訓 瀏覽:389
linux禪道無法訪問 瀏覽:819
怎麼爬取歷史疫情數據 瀏覽:596
linuxjira6破解 瀏覽:694
哪個網站可以看所有檢察雜志 瀏覽:144
java高並發資料庫請求怎麼辦 瀏覽:551
win8怎麼打開gho文件怎麼打開 瀏覽:732
如何網站內搜索 瀏覽:362
qq附近的人客服號碼 瀏覽:570
mac怎麼把word文件轉換為pdf 瀏覽:6
正式文件中的文檔行距多少 瀏覽:202

友情鏈接