⑴ oracle資料庫是多線程應用嗎
您好,資料庫肯定都支持多線程的。在資料庫范疇,你需要關注的是;這個資料庫各個線程間寫和讀的關系。oracle 是隨時都可以讀到當前的數據,不會因為別的線程在寫而阻塞。但是,等到寫的動作完成,再去讀,才是新數據。
多線程一般是指連接資料庫的程序,是否支持多線程。
比如JAVA,採用JDBC方式連接ORACLE。想讓它能夠多線程,那麼你就用java的多線程方法來實現。
當然,為了提高效率,你還可以使用資料庫連接池,就使你的多線程更加優秀了。
⑵ oracle資料庫連接池怎麼配置
連接池是創建和管理多個連接的一種技術,這些連接可被需要使用它們的任何線程使用。連接池技術基於下述事實:對於大多數應用程序,當它們正在處理通常需要數毫秒完成的事務時,僅需要能夠訪問JDBC連接的1個線程。未處理事務時,連接處於閑置狀態。使用連接池,允許其他線程使用閑置連接來執行有用的任務。事實上,當某一線程需要用JDBC在Mysql或其他資料庫上執行操作時,需要用到由連接池提供的連接。使用連接完成線程後,線程會將連接返回給連接池,以便該連接能夠被其他需要使用連接的線程使用。從連接池「借出」連接時,該連接僅供請求它的線程使用。從編程觀點看,其效果等同於每次需要JDBC連接時調用DriverManager.getConnection(),但是,採用連接池技術,可通過使用新的或已有的連接結束線程。連接池技術能顯著增加Java應用程序的性能,同時還能降低資源使用率。
http://blog.csdn.net/xilangyuyun/article/details/52800380
⑶ java線程中使用mysql連接查詢資料庫
不建議這樣做,一般不符合開發規范,如果這樣的話,你想想在業務量多的情況下,多個線程如果不控制,資料庫連接會將資料庫伺服器爆掉的,會影響業務的
常規做法:資料庫連接池(rid了解一下),據某些統計哈,真正用來做查詢的資源不超過整個查詢資料庫的生命周期的30%,大部分時間都用開創建連接關閉連接等操作,如果這個時候建立資料庫連接池的話,可以有效的將這部分時間釋放掉
⑷ jdbc是什麼
JDBC為工具/資料庫開發人員提供了一個標準的API,據此可以構建更高級的工具和介面,使資料庫開發人員能夠用純 Java API 編寫資料庫應用程序,同時,JDBC也是個商標名。 有了JDBC,向各種關系數據發送SQL語句就是一件很容易的事。換言之,有了JDBC API,就不必為訪問Sybase資料庫專門寫一個程序,為訪問Oracle資料庫又專門寫一個程序,或為訪問Informix資料庫又編寫另一個程序等等,程序員只需用JDBC API寫一個程序就夠了,它可向相應資料庫發送SQL調用。同時,將Java語言和JDBC結合起來使程序員不必為不同的平台編寫不同的應用程序,只須寫一遍程序就可以讓它在任何平台上運行,這也是Java語言"編寫一次,處處運行"的優勢。 Java資料庫連接體系結構是用於Java應用程序連接資料庫的標准方法。JDBC對Java程序員而言是API,對實現與資料庫連接的服務提供商而言是介面模型。作為API,JDBC為程序開發提供標準的介面,並為資料庫廠商及第三方中間件廠商實現與資料庫的連接提供了標准方法。JDBC使用已有的SQL標准並支持與其它資料庫連接標准,如ODBC之間的橋接。JDBC實現了所有這些面向標準的目標並且具有簡單、嚴格類型定義且高性能實現的介面。 Java 具有堅固、安全、易於使用、易於理解和可從網路上自動下載等特性,是編寫資料庫應用程序的傑出語言。所需要的只是 Java應用程序與各種不同資料庫之間進行對話的方法。而 JDBC 正是作為此種用途的機制。 JDBC 擴展了 Java 的功能。例如,用 Java 和 JDBC API 可以發布含有 applet 的網頁,而該 applet 使用的信息可能來自遠程資料庫。企業也可以用 JDBC 通過 Intranet 將所有職員連到一個或多個內部資料庫中(即使這些職員所用的計算機有Windows、 Macintosh 和UNIX 等各種不同的操作系統)。隨著越來越多的程序員開始使用Java 編程語言,對從 Java 中便捷地訪問資料庫的要求也在日益增加。 MIS 管理員們都喜歡 Java 和 JDBC 的結合,因為它使信息傳播變得容易和經濟。企業可繼續使用它們安裝好的資料庫,並能便捷地存取信息,即使這些信息是儲存在不同資料庫管理系統上。新程序的開發期很短。安裝和版本控制將大為簡化。程序員可只編寫一遍應用程序或只更新一次,然後將它放到伺服器上,隨後任何人就都可得到最新版本的應用程序。對於商務上的銷售信息服務, Java 和JDBC 可為外部客戶提供獲取信息更新的更好方法。JDBC 的用途 簡單地說,JDBC 可做三件事:與資料庫建立連接、發送 SQL 語句並處理結果。下列代碼段給出了以上三步的基本示例: Connection con = DriverManager.getConnection("jdbc:odbc:wombat","login", "password"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); } 上述代碼對基於JDBC的資料庫訪問做了經典的總結,當然,在本小節的後續部分會對它做詳盡的分析講解。JDBC API JDBC 是個"低級"介面,也就是說,它用於直接調用 SQL 命令。在這方面它的功能極佳,並比其它的資料庫連接 API 易於使用,但它同時也被設計為一種基礎介面,在它之上可以建立高級介面和工具。高級介面是"對用戶友好的"介面,它使用的是一種更易理解和更為方便的 API,這種API在幕後被轉換為諸如 JDBC 這樣的低級介面。 在關系資料庫的"對象/關系"映射中,表中的每行對應於類的一個實例,而每列的值對應於該實例的一個屬性。於是,程序員可直接對 Java 對象進行操作;存取數據所需的 SQL 調用將在"掩蓋下"自動生成。此外還可提供更復雜的映射,例如將多個表中的行結合進一個 Java 類中。 隨著人們對 JDBC 的興趣日益增漲,越來越多的開發人員一直在使用基於 JDBC 的工具,以使程序的編寫更加容易。程序員也一直在編寫力圖使最終用戶對資料庫的訪問變得更為簡單的應用程序。例如應用程序可提供一個選擇資料庫任務的菜單。任務被選定後,應用程序將給出提示及空白供填寫執行選定任務所需的信息。所需信息輸入應用程序將自動調用所需的 SQL 命令。在這樣一種程序的協助下,即使用戶根本不懂 SQL 的語法,也可以執行資料庫任務。JDBC與ODBC的比較 目前,Microsoft 的 ODBC API 可能是使用最廣的、用於訪問關系資料庫的編程介面。它能在幾乎所有平台上連接幾乎所有的資料庫。為什麼 Java 不使用 ODBC?對這個問題的回答是:Java 可以使用 ODBC,但最好是在 JDBC 的幫助下以 JDBC-ODBC 橋的形式使用,這一點我們稍後再說。現在的問題已變成:"為什麼需要 JDBC"?答案是顯然的:ODBC 不適合直接在 Java 中使用,因為它使用 C 語言介面。從Java 調用本地 C 代碼在安全性、實現、堅固性和程序的自動移植性方面都有許多缺點。從 ODBC C API 到 Java API 的字面翻譯是不可取的。例如,Java 沒有指針,而 ODBC 卻對指針用得很廣泛(包括很容易出錯的指針"void *")。您可以將 JDBC 想像成被轉換為面向對象介面的 ODBC,而面向對象的介面對 Java 程序員來說較易於接收。 ODBC 很難學。它把簡單和高級功能混在一起,而且即使對於簡單的查詢,其選項也極為復雜。相反,JDBC 盡量保證簡單功能的簡便性,而同時在必要時允許使用高級功能。啟用"純 Java "機制需要象 JDBC 這樣的 Java API。如果使用ODBC,就必須手動地將 ODBC 驅動程序管理器和驅動程序安裝在每台客戶機上。如果完全用 Java 編寫 JDBC 驅動程序則 JDBC 代碼在所有 Java 平台上(從網路計算機到大型機)都可以自 動安裝、移植並保證安全性。 總之,JDBC API 對於基本的 SQL 抽象和概念是一種自然的 Java 介面。它建立在 ODBC 上而不是從零開始。因此,熟悉 ODBC 的程序員將發現 JDBC 很容易使用。JDBC 保留了 ODBC 的基本設計特徵;事實上,兩種介面都基於 X/Open SQL CLI(調用級介面)。它們之間最大的區別在於:JDBC 以 Java 風格與優點為基礎並進行優化,因此更加易於使用。 目前,Microsoft 又引進了 ODBC 之外的新 API: RDO、 ADO 和OLE DB。這些設計在許多方面與 JDBC 是相同的,即它們都是面向對象的資料庫介面且基於可在 ODBC 上實現的類。但在這些介面中,我們未看見有特別的功能使我們要轉而選擇它們來替代 ODBC,尤其是在 ODBC 驅動程序已建立起較為完善的市場的情況下。它們最多也就是在 ODBC 上加了一種裝飾而已。JDBC對B/S和C/S的支持 JDBC API 既支持資料庫訪問的兩層模型(C/S),同時也支持三層模型(B/S)。在兩層模型中,Java applet或應用程序將直接與資料庫進行對話。這將需要一個JDBC驅動程序來與所訪問的特定資料庫管理系統進行 通訊。用戶的SQL語句被送往資料庫中,而其結果將被送回給用戶。資料庫可以位於另一台計算機上,用戶通過網路連接到上面。這就叫做客戶機/伺服器配置,其中用戶的計算機為客戶機,提供資料庫的計算機為伺服器。網路可以是 Intranet(它可將公司職員連接起來),也可以是 Internet。 在三層模型中,命令先是被發送到服務的"中間層",然後由它將SQL 語句發送給資料庫。資料庫對 SQL 語句進行處理並將結果送回到中間層,中間層再將結果送回給用戶。MIS 主管們都發現三層模型很吸引人,因為可用中間層來控制對公司數據的訪問和可作的的更新的種類。中間層的另一個好處是,用戶可以利用易於使用的高級API,而中間層將把它轉換為相應的低級調用。最後,許多情況下三層結構可提供一些性能上的好處。 到目前為止,中間層通常都用 C 或 C++ 這類語言來編寫,這些語言執行速度較快。然而,隨著最優化編譯器(它把 Java 位元組代碼轉換為高效的特定於機器的代碼)的引入,用 Java 來實現中間層將變得越來越實際。這將是一個很大的進步,它使人們可以充分利用 Java 的諸多優點(如堅固、多線程和安全等特徵)。JDBC 對於從Java的中間層來訪問資料庫非常重要。SQL 的一致性 結構化查詢語言 (SQL) 是訪問關系資料庫的標准語言。困難之處在於:雖然大多數的 DBMS (資料庫管理系統)對其基本功能都使用了標准形式的 SQL,但它們卻不符合最近為更高級的功能定義的標准 SQL 語法或語義。例如,並非所有的資料庫都支持儲存程序或外部連接,那些支持這一功能的資料庫又相互不一致。人們希望 SQL 中真正標準的那部份能夠進行擴展以包括越來越多的功能。但同時 JDBC API 又必須支持現有的 SQL。 JDBC API 解決這個問題的一種方法是允許將任何查詢字元串一直傳到所涉及的 DBMS 驅動程序上。這意味著應用程序可以使用任意多的 SQL 功能,但它必須冒這樣的風險:有可能在某些 DBMS 上出錯。事實上,應用程序查詢甚至不一定要是 SQL,或者說它可以是個為特定的 DBMS 設計的 SQL 的專用派生物(例如,文檔或圖象查詢)。 JDBC 處理 SQL 一致性問題的第二種方法是提供 ODBC 風格的轉義子句,這將在後續部分中討論。轉義語法為幾個常見的 SQL 分歧提供了一種標準的 JDBC 語法。例如,對日期文字和已儲存過程的調用都有轉義語法。 對於復雜的應用程序,JDBC 用第三種方法來處理 SQL 的一致性問題它利用 DatabaseMetaData 介面來提供關於 DBMS 的描述性信息,從而使應用程序能適應每個 DBMS 的要求和功能。 由於JDBC API 將用作開發高級資料庫訪問工具和 API 的基礎 API,因此它還必須注意其所有上層建築的一致性。"符合JDBC標准TM" 代表用戶可依賴的 JDBC 功能的標准級別。要使用這一說明,驅動程序至少必須支持 ANSI SQL-2 Entry Level(ANSI SQL-2 代表美國國家標准局 1992 年所採用的標准。Entry Level代表SQL功能的特定清單)。驅動程序開發人員可用 JDBC API 所帶的測試工具包來確定他們的驅動程序是否符合這些標准。 "符合 JDBC 標准TM" 表示提供者的 JDBC 實現已經通過了JavaSoft 提供的一致性測試。這些一致性測試將檢查 JDBC API中定義的所有類和方法是否都存在,並盡可能地檢查程序是否具有SQL Entry Level 功能。當然,這些測試並不完全,而且 JavaSoft 目前也無意對各提供者的實現進行標級。但這種一致性定義的確可對JDBC實現提供一定的可信度。隨著越來越多的資料庫提供者、連接提供者、Internet 提供者和應用程序編程員對 JDBC API 的接受,JDBC 也正迅速成為 Java 資料庫訪問的標准。JDBC建立聯接 你需要做的第一事情是你與想要使用的 DBMS 建立一個連接。這包含 2 個步驟:裝載驅動程序並建立連接。裝載驅動程序 裝載驅動程序只需要非常簡單的一行代碼。例如,你想要使用 JDBC-ODBC 橋驅動程序, 可以用下列代碼裝載它: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 你的驅動程序文檔將告訴你應該使用的類名。例如, 如果類名是 jdbc.DriverXYZ ,你將用代碼以下的代碼裝載驅動程序: Class.forName("jdbc.DriverXYZ"); 你不需要創建一個驅動程序類的實例並且用 DriverManager 登記它,因為調用 Class.forName 將自動將載入驅動程序類。如果你曾自己創建實例,你將創建一個不必要的副本,但它不會帶來什麼壞處。 載入Driver 類後,它們即可用來與資料庫建立連接。建立連接 第二步就是用適當的驅動程序類與 DBMS 建立一個連接。下列代碼是一般的做法: Connection con = DriverManager.getConnection(url, "myLogin", "myPassword"); 這個步驟也非常簡單,最難的是怎麼提供 url。如果你正在使用 JDBC-ODBC 橋, JDBC URL 將以 jdbc:odbc 開始:餘下 URL 通常是你的數據源名字或資料庫系統。因此,假設你正在使用 ODBC 存取一個叫 "Fred" 的 ODBC 數據源,你的 JDBC URL 是 jdbc:odbc:Fred 。把 "myLogin" 及 "myPassword" 替換為你登陸 DBMS 的用戶名及口令。如果你登陸資料庫系統的用戶名為 "Fernanda" 口令為 "J8",只需下面的 2 行代碼就可以建立一個連接: String url = "jdbc:odbc:Fred"; Connection con = DriverManager.getConnection(url,"Fernanda", "J8"); 如果你使用的是第三方開發了的 JDBC驅動程序,文檔將告訴你該使用什麼 subprotocol, 就是在 JDBC URL 中放在 jdbc 後面的部分。例如, 如果驅動程序開發者注冊了acme 作為 subprotocol, JDBC URL 的第一和第二部分將是 jdbc:acme。驅動程序文檔也會告訴你餘下 JDBC URL 的格式。JDBC URL 最後一部分提供了定位資料庫的信息。 如果你裝載的驅動程序識別了提供給 DriverManager.getConnection 的 JDBC URL ,那個驅動程序將根據 JDBC URL 建立一個到指定 DBMS 的連接。正如名稱所示,DriverManager 類在幕後為你管理建立連接的所有細節。除非你是正在寫驅動程序,你可能無需使用此類的其它任何方法,一般程序員需要在此類中直接使用的唯一方法是 DriverManager.getConnection。 DriverManager.getConnection 方法返回一個打開的連接,你可以使用此連接創建 JDBC statements 並發送 SQL 語句到資料庫。
⑸ java 多線程存儲資料庫
以mysql為資料庫寫的一個粗陋的demo,你參考一下,希望不會因為代碼過多被網路吞了——
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
allotThread();
}
/**
* 將100條數據分成10份並啟動10個線程分別操作
*/
public static void allotThread() {
List<String[]> datas = buildDatas();
for (int i=0; i<100; i+=10) {
List<String[]> tenDatas = datas.subList(i, i + 10);
insertData(tenDatas);
}
}
/**
* 創建100條模擬數據
* @return
*/
public static List<String[]> buildDatas() {
List<String[]> datas = new ArrayList<String[]>();
for (int i=0; i<100; i++) {
String[] data = {"id " + i, "name " + i};
datas.add(data);
}
return datas;
}
/**
* 啟動線程進行數據插入操作
* @param tenDatas
*/
public static void insertData(final List<String[]> tenDatas) {
new Thread(new Runnable() {
public void run() {
String sql = "insert into testtable (id, name) values (?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
pstmt = getPstmt(conn, sql);
for (String[] data : tenDatas) {
pstmt.setString(1, data[0]);
pstmt.setString(2, data[1]);
pstmt.addBatch();
}
pstmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
rollback(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
close(pstmt);
close(conn);
}
}
}).start();
}
public static Connection getConnection() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
String dbUrl = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8";
Connection conn = DriverManager.getConnection(dbUrl, "root", "tooeasy");
return conn;
}
public static PreparedStatement getPstmt(Connection conn, String sql) throws SQLException, ClassNotFoundException {
PreparedStatement pstmt = conn.prepareStatement(sql);
return pstmt;
}
public static void rollback(Connection conn) {
try {
if (null != conn) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn) {
try {
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(PreparedStatement pstmt) {
try {
if (null != pstmt) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs) {
try {
if (null != rs) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
⑹ 用JDBC訪問ORACLE資料庫,做DELETE操作,能用JAVA多線程實現嗎 ORACLE伺服器要怎麼配
就像樓上說的。Oracle有自己的鎖機制。就算你開100條線,它還是一條一條刪除。不能同時刪除多項的。
對於大量數據更新,Oracle有建議一些優化措施。
1. 首先是把auto-commit給關閉。因為你每刪一條數據,oracle就要自動執行一次commit。commit是需要資源的。所以如果你手動設置為每刪數據1000條,執行一次commit. 那你就可以節省資源了。
2. 充分利用batch update。如果不用batch,每個delete命令都需要從網路上傳送到oracle。1萬個刪除命令,要有1萬次傳送。如果將100個刪除命令綁在一起送去Oracle執行。那就只要傳送100次就可以了。大大縮短所需時間和網路資源。
以上這些建議,都可以在Oracle參考里查到。
⑺ java jdbc裡面,一個connection創建多個statement共享給多線程使用,請問何時關閉connection才合適
可以增加計數器機制。
創建一個statement,計數器+1;
當一個線程執行完畢後,計數器-1;
當計數器=0,就可以關閉了。。。
⑻ java 多線程操作資料庫
//將資料庫中的數據條數分段
publicvoiddivision(){
//獲取要導入的總的數據條數
Stringsql3="SELECTcount(*)FROM[CMD].[dbo].[my1]";
try{
pss=cons.prepareStatement(sql3);
rss=pss.executeQuery();
while(rss.next()){
System.out.println("總記錄條數:"+rss.getInt(1));
sum=rss.getInt(1);
}
//每30000條記錄作為一個分割點
if(sum>=30000){
n=sum/30000;
resie=sum%30000;
}else{
resie=sum;
}
System.out.println(n+""+resie);
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
線程類
publicMyThread(intstart,intend){
this.end=end;
this.start=start;
System.out.println("處理掉余數");
try{
System.out.println("--------"+Thread.currentThread().getName()+"------------");
Class.forName(SQLSERVERDRIVER);
System.out.println("載入sqlserver驅動...");
cons=DriverManager.getConnection(CONTENTS,UNS,UPS);
stas=cons.createStatement();
System.out.println("連接SQLServer資料庫成功!!");
System.out.println("載入mysql驅動.....");
Class.forName(MYSQLDRIVER);
con=DriverManager.getConnection(CONTENT,UN,UP);
sta=con.createStatement();
//關閉事務自動提交
con.setAutoCommit(false);
System.out.println("連接mysql資料庫成功!!");
}catch(Exceptione){
e.printStackTrace();
}
//TODOAuto-generatedconstructorstub
}
publicArrayList<Member>getAll(){
Membermember;
Stringsql1="select*from(selectrow_number()over(orderbypmcode)asrowNum,*"+
"from[CMD].[dbo].[my1])astwhererowNumbetween"+start+"and"+end;
try{
System.out.println("正在獲取數據...");
allmembers=newArrayList();
rss=stas.executeQuery(sql1);
while(rss.next()){
member=newMember();
member.setAddress1(rss.getString("address1"));
member.setBnpoints(rss.getString("bnpoints"));
member.setDbno(rss.getString("dbno"));
member.setExpiry(rss.getString("expiry"));
member.setHispoints(rss.getString("hispoints"));
member.setKypoints(rss.getString("kypoints"));
member.setLevels(rss.getString("levels"));
member.setNames(rss.getString("names"));
member.setPmcode(rss.getString("pmcode"));
member.setRemark(rss.getString("remark"));
member.setSex(rss.getString("sex"));
member.setTelephone(rss.getString("telephone"));
member.setWxno(rss.getString("wxno"));
member.setPmdate(rss.getString("pmdate"));
allmembers.add(member);
//System.out.println(member.getNames());
}
System.out.println("成功獲取sqlserver資料庫數據!");
returnallmembers;
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
System.out.println("獲取sqlserver資料庫數據發送異常!");
e.printStackTrace();
}
try{
rss.close();
stas.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}
publicvoidinputAll(ArrayList<Member>allmembers){
System.out.println("開始向mysql中寫入");
Stringsql2="insertintotest.my2values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
try{
ps=con.prepareStatement(sql2);
System.out.println("-------------------------等待寫入數據條數:"+allmembers.size());
for(inti=0;i<allmembers.size();i++){
ps.setString(1,allmembers.get(i).getPmcode());
ps.setString(2,allmembers.get(i).getNames());
//System.out.println(allmembers.get(i).getNames());
ps.setString(3,allmembers.get(i).getSex());
ps.setString(4,allmembers.get(i).getTelephone());
ps.setString(5,allmembers.get(i).getAddress1());
ps.setString(6,allmembers.get(i).getPmdate());
ps.setString(7,allmembers.get(i).getExpiry());
ps.setString(8,allmembers.get(i).getLevels());
ps.setString(9,allmembers.get(i).getDbno());
ps.setString(10,allmembers.get(i).getHispoints());
ps.setString(11,allmembers.get(i).getBnpoints());
ps.setString(12,allmembers.get(i).getKypoints());
ps.setString(13,allmembers.get(i).getWxno());
ps.setString(14,allmembers.get(i).getRemark());
//插入命令列表
//ps.addBatch();
ps.executeUpdate();
}
//ps.executeBatch();
con.commit();
ps.close();
con.close();
this.flag=false;
System.out.println(Thread.currentThread().getName()+"--->OK");
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
System.out.println("向mysql中更新數據時發生異常!");
e.printStackTrace();
}
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true&&flag){
this.inputAll(getAll());
}
}
⑼ java爬蟲採用多線程,資料庫連接多了就報異常
可以通過測試對錯誤原因進行排查,如果連接少量時不出問題,那就是連接量超出了某一數值出現異常,可以查看資料庫的鏈接上限,如果是連接上限原因,可以嘗試上調上限或者降低連接數量