當前位置:首頁 » 參考文獻 » java資料庫優化

java資料庫優化

發布時間: 2021-03-26 12:53:01

⑴ 使用jdbc從資料庫查詢數據,java程序需要考慮哪些優化方法

一、准備工作(一):MySQL安裝配置和基礎學習
使用JDBC操作資料庫之前,首先你需要有一個資料庫。這里提供了3個鏈接供讀者自學,如果曾有過SQL語言的使用經歷(包括在學校中的課堂學習),前兩個鏈接足以上手。
1.安裝和配置:mysql安裝圖解 mysql圖文安裝教程(詳細說明)

2.基本操作:21分鍾 MySQL 入門教程
3.簡易命令查詢 :一千行MySQL學習筆記

建議邊看入門教程,邊練習,在練習insert、update、select、delete等基本操作的同時,將後面要用的表建好。
下圖是我接下來用於演示的資料庫的表。


二、准備工作(二):下載資料庫對應的jar包並導入
使用JDBC需要在工程中導入對應的jar包。資料庫與JDBC包的對應關系可以參考各種資料庫對應的jar包、驅動類名和URL格式。在Eclipse下的導入方法:
在工程的圖標上右擊,選擇」Properties」,在」Java Bulid Path」中選擇」Add External JARs…」,選擇下載並解壓後獲得的jar包。

如果對MySQL進行操作,這時下面的import就不會報錯了:
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

除此以外,還需要JDBC的包,直接import即可。
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

三、JDBC基本操作
為了簡單起見,與資料庫相關的操作、命令、參數都被硬編碼了。有興趣的讀者可以對這些進行探索,降低數據與操作的耦合性。
先看具體代碼並實踐,本文第五部分對用到的API稍作了研究。
下面的所有方法和數據成員都在public class JDBCOperation內部。
(1)定義記錄的類(可選)
這樣做主要是為了便於操作和介面定義,是非必須的。

static class Student {
private String Id;
private String Name;
private String Sex;
private String Age;

Student(String Name, String Sex, String Age) {
this.Id = null; //default
this.Name = Name;
this.Sex = Sex;
this.Age = Age;
}

public String getId() {
return Id;
}

public void setId(String Id) {
this.Id = Id;
}

public String getName() {
return Name;
}

public void setName(String Name) {
this.Name = Name;
}

public String getSex() {
return Sex;
}

public void setSex(String Sex) {
this.Sex = Sex;
}

public String getAge() {
return Age;
}

public void setage(String Age) {
this.Age = Age;
}
}

(2)連接的獲取
在操作前必須先獲取與資料庫的連接。
driver、url的格式同樣可以參考各種資料庫對應的jar包、驅動類名和URL格式。

private static Connection getConn() {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/samp_db";
String username = "root";
String password = "";
Connection conn = null;
try {
Class.forName(driver); //classLoader,載入對應驅動
conn = (Connection) DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

(3)insert

private static int insert(Student student) {
Connection conn = getConn();
int i = 0;
String sql = "insert into students (Name,Sex,Age) values(?,?,?)";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, student.getName());
pstmt.setString(2, student.getSex());
pstmt.setString(3, student.getAge());
i = pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}

(4)update

private static int update(Student student) {
Connection conn = getConn();
int i = 0;
String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}

(5)select
以select * from XXX為例。

private static Integer getAll() {
Connection conn = getConn();
String sql = "select * from students";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement)conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
int col = rs.getMetaData().getColumnCount();
System.out.println("============================");
while (rs.next()) {
for (int i = 1; i <= col; i++) {
System.out.print(rs.getString(i) + "\t");
if ((i == 2) && (rs.getString(i).length() < 8)) {
System.out.print("\t");
}
}
System.out.println("");
}
System.out.println("============================");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}

(6)delete

private static int delete(String name) {
Connection conn = getConn();
int i = 0;
String sql = "delete from students where Name='" + name + "'";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}

⑵ java中大量數據如何提高性能

通過使用一些輔助性工具來找到程式中的瓶頸,然後就能對瓶頸部分的代碼進行優化。一般有兩種方案:即優化代碼或更改設計方法。我們一般會選擇後者,因為不去調用以下代碼要比調用一些優化的代碼更能提高程式的性能。而一個設計良好的程式能夠精簡代碼,從而提高性能。

????下面將提供一些在JAVA程式的設計和編碼中,為了能夠提高JAVA程式的性能,而經常採用的一些方法和技巧。

????1.對象的生成和大小的調整。

????JAVA程式設計中一個普遍的問題就是沒有好好的利用JAVA語言本身提供的函數,從而常常會生成大量的對象(或實例)。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程式的性能帶來非常大的影響。

????例1:關於String ,StringBuffer,+和append

????JAVA語言提供了對於String類型變數的操作。但如果使用不當,會給程式的性能帶來影響。如下面的語句:

????String name=new String("HuangWeiFeng");
????System.out.println(name+"is my name");

????看似已非常精簡了,其實並非如此。為了生成二進制的代碼,要進行如下的步驟和操作:

????(1) 生成新的字元串 new String(STR_1);
????(2) 復制該字元串;
????(3) 載入字元串常量"HuangWeiFeng"(STR_2);
????(4) 調用字元串的構架器(Constructor);
????(5) 保存該字元串到數組中(從位置0開始);
????(6) 從java.io.PrintStream類中得到靜態的out變數;
????(7) 生成新的字元串緩沖變數new StringBuffer(STR_BUF_1);
????(8) 復制該字元串緩沖變數;
????(9) 調用字元串緩沖的構架器(Constructor);
????(10) 保存該字元串緩沖到數組中(從位置1開始);
????(11) 以STR_1為參數,調用字元串緩沖(StringBuffer)類中的append方法;
????(12) 載入字元串常量"is my name"(STR_3);
????(13) 以STR_3為參數,調用字元串緩沖(StringBuffer)類中的append方法;
????(14) 對於STR_BUF_1執行toString命令;
????(15) 調用out變數中的println方法,輸出結果。

????由此能看出,這兩行簡單的代碼,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五個對象變數。這些生成的類的實例一般都存放在堆中。堆要對所有類的超類,類的實例進行初始化,同時還要調用類極其每個超類的構架器。而這些操作都是非常消耗系統資源的。因此,對對象的生成進行限制,是完全有必要的。

????經修改,上面的代碼能用如下的代碼來替換。

????StringBuffer name=new StringBuffer("HuangWeiFeng");
????System.out.println(name.append("is my name.").toString());

????系統將進行如下的操作:

????(1) 生成新的字元串緩沖變數new StringBuffer(STR_BUF_1);
????(2) 復制該字元串緩沖變數;
????(3) 載入字元串常量"HuangWeiFeng"(STR_1);
????(4) 調用字元串緩沖的構架器(Constructor);
????(5) 保存該字元串緩沖到數組中(從位置1開始);
????(6) 從java.io.PrintStream類中得到靜態的out變數;
????(7) 載入STR_BUF_1;
????(8) 載入字元串常量"is my name"(STR_2);
????(9) 以STR_2為參數,調用字元串緩沖(StringBuffer)實例中的append方法;
????(10) 對於STR_BUF_1執行toString命令(STR_3);
????(11)調用out變數中的println方法,輸出結果。

????由此能看出,經過改進後的代碼只生成了四個對象變數:STR_1,STR_2,STR_3和STR_BUF_1.你可能覺得少生成一個對象不會對程式的性能有非常大的提高。但下面的代碼段2的執行速度將是代碼段1的2倍。因為代碼段1生成了八個對象,而代碼段2隻生成了四個對象。

????代碼段1:

????String name= new StringBuffer("HuangWeiFeng");
????name+="is my";
????name+="name";

????代碼段2:

????StringBuffer name=new StringBuffer("HuangWeiFeng");
????name.append("is my");
????name.append("name.").toString();

????因此,充分的利用JAVA提供的庫函數來優化程式,對提高JAVA程式的性能時非常重要的.其注意點主要有如下幾方面;

????(1) 盡可能的使用靜態變數(Static Class Variables)

????如果類中的變數不會隨他的實例而變化,就能定義為靜態變數,從而使他所有的實例都共享這個變數。

????例:
????public class foo
????{
??????SomeObject so=new SomeObject();
????}

????就能定義為:
????public class foo
????{
??????static SomeObject so=new SomeObject();
????}

????(2) 不要對已生成的對象作過多的改動。

????對於一些類(如:String類)來講,寧願在重新生成一個新的對象實例,而不應該修改已生成的對象實例。

????例:
????String name="Huang";
????name="Wei";
????name="Feng";

????上述代碼生成了三個String類型的對象實例。而前兩個馬上就需要系統進行垃圾回收處理。如果要對字元串進行連接的操作,性能將得更差,因為系統將不得為此生成更多得臨時變數,如上例1所示。

????(3) 生成對象時,要分配給他合理的空間和大小JAVA中的非常多類都有他的默認的空間分配大小。對於StringBuffer類來講,默認的分配空間大小是16個字元。如果在程式中使用StringBuffer的空間大小不是16個字元,那麼就必須進行正確的初始化。

????(4) 避免生成不太使用或生命周期短的對象或變數。對於這種情況,因該定義一個對象緩沖池。以為管理一個對象緩沖池的開銷要比頻繁的生成和回收對象的開銷小的多。

????(5) 只在對象作用范圍內進行初始化。JAVA允許在代碼的所有地方定義和初始化對象。這樣,就能只在對象作用的范圍內進行初始化。從而節約系統的開銷。

????例:
????SomeObject so=new SomeObject();
????If(x==1) then
????{
??????Foo=so.getXX();
????}

????能修改為:
????if(x==1) then
????{
??????SomeObject so=new SomeObject();
??????Foo=so.getXX();
????}

????2.異常(Exceptions)

????JAVA語言中提供了try/catch來發方便用戶捕捉異常,進行異常的處理。不過如果使用不當,也會給JAVA程式的性能帶來影響。因此,要注意以下兩點:

????(1) 避免對應用程式的邏輯使用try/catch
????如果能用if,while等邏輯語句來處理,那麼就盡可能的不用try/catch語句。

????(2) 重用異常
????在必須要進行異常的處理時,要盡可能的重用已存在的異常對象。以為在異常的處理中,生成一個異常對象要消耗掉大部分的時間。

????3. 線程(Threading)

????一個高性能的應用程式中一般都會用到線程。因為線程能充分利用系統的資源。在其他線程因為等待硬碟或網路讀寫而 時,程式能繼續處理和運行。不過對線程運用不當,也會影響程式的性能。

????例2:正確使用Vector類
????Vector主要用來保存各種類型的對象(包括相同類型和不同類型的對象)。不過在一些情況下使用會給程式帶來性能上的影響。這主要是由Vector類的兩個特點所決定的。第一,Vector提供了線程的安全保護功能。即使Vector類中的許多方法同步。不過如果你已確認你的應用程式是單線程,這些方法的同步就完全不必要了。第二,在Vector查找存儲的各種對象時,常常要花非常多的時間進行類型的匹配。而當這些對象都是同一類型時,這些匹配就完全不必要了。因此,有必要設計一個單線程的,保存特定類型對象的類或集合來替代Vector類.用來替換的程式如下(StringVector.java):

????public class StringVector
????{
??????private String [] data;
??????private int count;
??????public StringVector()
??????{
????????this(10); // default size is 10
??????}
??????public StringVector(int initialSize)
??????{
????????data = new String[initialSize];
??????}
??????public void add(String str)
??????{
??????// ignore null strings
??????if(str == null) { return; }
??????ensureCapacity(count + 1);
??????data[count++] = str;
??????}
??????private void ensureCapacity(int minCapacity)
??????{
????????int oldCapacity = data.length;
????????if (minCapacity > oldCapacity)
????????{
??????????String oldData[] = data;
??????????int newCapacity = oldCapacity * 2;
??????????data = new String[newCapacity];
??????????System.array(oldData, 0, data, 0, count);
????????}
??????}
??????public void remove(String str)
??????{
??????if(str == null) { return; // ignore null str }
??????for(int i = 0; i < count; i++)
??????{
????????// check for a match
????????if(data[i].equals(str))
????????{
??????????System.array(data,i+1,data,i,count-1); // data
??????????// allow previously valid array element be gc

⑶ 面試Java開發時問到高並發怎麼處理的,還有sql優化有哪些辦法,有哪位大神知道啊,新手!!

Java開發高並發的處理方法:

  1. 最基礎的地方做起,優化我們寫的代碼,減少必要的資源浪費


    避免頻繁的使用new對象,對於整個應用只需要存在一個實例的類,我們可以使用單例模式。對於String連接操作,使用StringBuffer或StringBuilder,對於工具類可以通過靜態方法來訪問。


    避免使用錯誤的方式,盡量不用instanceof做條件判斷。使用java中效率高的類,比如ArrayList比Vector性能好。

  2. 圖片伺服器分離


    對於web伺服器來說,圖片是最消耗資源的,於是我們有必要把圖片與頁面進行分離,我們把圖片放到獨立的圖片伺服器。這樣的架構可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片的問題而崩潰。在圖片伺服器上,我們可以對不同的配置進行優化。

  3. 緩存


    具體接觸過的緩存機制是hibernate的緩存機制。為了避免每次都向資料庫中取得數據,我們把用戶常常訪問到的數據放到內存中,甚至緩存十分大的時候我們可以把內存中的緩存放到硬碟中。還有高級的分布式緩存資料庫使用,都可以增加系統的抗壓力。

  4. 分批傳送

在做某項目的時候,一次傳遞的參數太多,而且資料庫規定一次最多傳遞的參數最多是三萬條,當時有五萬條記錄,那怎麼傳送呢?最終是分批傳送,電梯里一次乘不下那麼多的人,會報超重的bug,那就分批把人送上去。

還有一次在考試系統中,如果那麼多的考試人員同時提交到資料庫中,資料庫的壓力增大,有時會被down掉,當時採用的方法是使用ajax非同步傳輸,沒有等待考生點擊提交按鈕的時候,就把考生的答案自動提交,這樣也避免了突然斷電考生前面做過的題出現丟失的現象。

DB優化

  • 在資料庫設計的時候就要考慮到後期的維護,資料庫三範式是我們設計資料庫索要遵循的原則。

  • 索引的建立:建立索引要適當,如果一個表經常用來被查詢,對於增加和修改很少被用到,我們就可以為這個表建立索引,因為對於增加和修改和刪除操作時,我們對索引的維護要大大超過索引給我們帶來的效率。

  • 表欄位的類型選擇要恰當。包括欄位的長度、類型等,要根據實際存儲的數據進行選擇,長度不要過長,否則會影響效率。

  • 外鍵要慎用,因為主鍵代表這一張表,而外鍵代表一群表,對表之間進行了關聯,在刪除修改等需要我們關聯。

  • 在資料庫操作上。 盡量使用prepareStatement,少用Statement,因為PrepareStatement是進行預編譯的。

    connection設置為readOnly,Connection是對書庫連接,屬於重量級,我們使用即可。

    連接池的使用,我們可以修改資料庫默認的連接數。

⑷ java 資料庫多表連接查詢性能優化

jdbc鏈接資料庫,然後執行一條多表連接的sql...
展示的話如果是web開發,就要涉及到servlet或者其他更復雜的框架了.
或者輸出到文件?
先描述自己想做什麼比較好.

⑸ java大數量資料庫操作優化處理

哪有一次性搞這么多數據的,做個分頁啊

⑹ java 程序中由於數據過多導致時間長,如何優化

如果是首頁的話,對於這種高頻訪問的數據用內存緩存
用緩存可以加快載入速度,但是還是要載入的,用ajax,需要載入那裡就載入那裡!局部刷新比全局刷新那不是快一點點啊!頁面上的東西
能不刷新就不刷新,至於數據方面太多的話還是要做分頁的,分頁後的查詢可以每次都查詢下一頁,保存到緩存,然後翻頁的時候把緩存里的拿出來,後台再去查下一頁,這一體驗效果會好很多的哦!

⑺ JAVA如何優化DAO層與資料庫交互的部分

for (int i = 0; i < xqList.size(); i++) {
Test test = xqList.get(i);
khDao.saveOrUpdate(test);
}
在DAO層有一段代碼是這么寫的,這樣會造成程序特別的慢,要刷很多sql,請問這個該怎麼優化專好?
這段代碼得主要問屬題是 在循環里與資料庫交互,xqlist數據大約幾十條,這樣的話就與資料庫交互幾十次,所以非常影響性能,我希望各位給些意見,怎麼能減少與資料庫的交互

⑻ java多線程訪問資料庫怎麼優化啊,並發很大

只是記錄訪問量而已對吧?
如果只是記錄這種日誌性的數據,可以建立一個消息池,把刷新的記錄寫到消息池裡面,然後寫個類實時從消息池裡面取數據插入到資料庫就好了,這樣就只需要一個連接就夠了。

⑼ java程序開發 面試時經常被問到資料庫怎麼優化 這怎麼回答

資料庫優化:
硬體優化(硬體不用說了吧)、配置優化(DB2、MyIsam)、結構優化(就是建表時,建索引注意哪些,not
null判斷、default默認值、不要用觸發器)、查詢優化(這個我救不細說了,
網上一大堆,
去搜一下)、

⑽ Java批量資料庫操作,如何性能優化

List<Student> list = new ArrayList<Student>();

for(int i=0;i<list.size();i++){
Student st = (Student)list.get(i);

Object o = getHibernateTemplate().get(Student.class, st.getStudentId());

if(null == o){
...

Address addr = new Address();
...

getHibernateTemplate().saveOrUpdate(addr);

getHibernateTemplate().saveOrUpdate(o);

getSession().flush();
getSession().evict(addr);
getSession().evict(o);
} else {
...
Address addr = methodForFindAddr(o);
...
getHibernateTemplate().saveOrUpdate(hql);

getHibernateTemplate().saveOrUpdate(o);

getSession().flush();
getSession().evict(addr);
getSession().evict(o);
}

}

現在實現如上面代碼所示,如果list數據量比較小的話,還可勉強湊合,若超過數萬條數據,需耗費大量時間,有什麼好的建議對此進行優化?

我曾試兩種方法:1.過線程池的方式,可方法methodForFindAddr可能會出現同步問題,線程之間數據串了。
2.將所有saveOrUpdate的對象抽取出來,循環批量保存,每循環50次,flush一次。可是兩個循環耗費的時間仍然很長。

熱點內容
塗鴉論文 發布:2021-03-31 13:04:48 瀏覽:698
手機資料庫應用 發布:2021-03-31 13:04:28 瀏覽:353
版面217 發布:2021-03-31 13:04:18 瀏覽:587
知網不查的資源 發布:2021-03-31 13:03:43 瀏覽:713
基金贖回參考 發布:2021-03-31 13:02:08 瀏覽:489
懸疑故事範文 發布:2021-03-31 13:02:07 瀏覽:87
做簡單的自我介紹範文 發布:2021-03-31 13:01:48 瀏覽:537
戰略地圖參考 發布:2021-03-31 13:01:09 瀏覽:463
收支模板 發布:2021-03-31 13:00:43 瀏覽:17
電氣學術會議 發布:2021-03-31 13:00:32 瀏覽:731