Ⅰ java如何快速處理大數據
文件讀取:首先是一個文件上傳,數據入庫,10-200萬條不等,這里主要考慮到一次性讀取,JVM分配出來的棧內存不一定會夠(個人對內存這一塊還是處於一知半解的狀態,所以比較謹慎,若諸位大神有好寬隱的認知,希望評論留下地址分享一下),是依行讀取數據,設定一個批量值,當讀取的數據達到一定量之後,執行批量入庫操作,清空集合,再接著讀取。
//讀取文件內容
while((s = br.readLine())!=null){
//判斷是否達到單次處理量
if(num%leadingNum==0&&num!=0){
int a = stencDao.insertBatch(listBean);
if(a!=leadingNum){
flag = false;
}
//清空集合
listBean.clear();
}
String value = s.trim();
//將讀取到的內容放入集合中
if(!value.equals("")){
StencilCustomer bean = new StencilCustomer();
bean.setCustomerPhone(value);
bean.setLinkStencilId(id);
listBean.add(bean);
num ++;
}
}
數據處理:這里的思路也是將數據小化然後處理,這里使用了多線程,設定單個線程處理量,然後開啟多個線程處理,這里需要考慮你的伺服器的承載能力,如果線程開得太多了,處理不過數敏來,會出現蹦死的情況。慎畢廳例如200萬數據,我開了20個線程,單個線程處理600條。
//建立一個線程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
minTaskNumber, maxTaskNumber, 3L, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(minTaskNumber),
new ThreadPoolExecutor.DiscardOldestPolicy());
//當正在執行的線程數達到最大執行線程數的時候等待
boolean flag = true;
while(flag){
Thread.sleep(1000);//休眠2ms查詢一次
int c = threadPool.getActiveCount();//線程池中活動中的線程數量
if(c<maxTaskNumber){
flag = false;
}
}
上面的代碼是我對線程池的一個控制,控制伺服器一直最大線程執行,Thread.sleep(1000);用while的時候,這個休眠最好不要去掉,去掉之後很影響執行效率
Ⅱ java 批量執行sql語句 mysql批量執行sql語句
public static List>> getData {
List>> data = new LinkedList>>;
data.add(SQLHelper.executeQuery("select * from a"));
data.add(SQLHelper.executeQuery("select * from b"));
data.add(SQLHelper.executeQuery("select * from c"));
data.add(SQLHelper.executeQuery("select * from d"));
return data;
}
publicintdeleteGoodsOne(Stringgoodid,intstatus){
inti=0;
Stringsql="";
conn=db.getConn;
try{
if(status==1||status==2){
sql="updategoodssetstatus=0wheregoodid=?";
//這里想增加updaterecordsetstatus=0wheregoodid=?
}else{
sql="updategoodssetstatus=1wheregoodid=?";
//這里想增加updaterecordsetstatus=0wheregoodid=?
}
//第一次執行邏輯判斷埋絕sql
ps=conn.prepareStatement(sql);
ps.setString(1,goodid);
i=ps.executeUpdate;
//第二次執行更新record表的sql
sql='updaterecordsetstatus=0wheregoodid=?'
ps=conn.prepareStatement(sql);
ps.setString(1,goodid);
i=ps.executeUpdate;
}catch(SQLExceptione){
e.printStackTrace;
}finally{
db.closeDB(conn);
}
returni;
}
使用PreparedStatement的addBatch方法添加批量sql執行,然後用executeBatch來批量執行add進去的sql
Connection con=.............; //這里是取得Lian接代碼,省略
PrepareStatment ps=null;
String sql1="select * from test1";
String sql2="update test1 set xxx=1 ";
ps=con.prepareStatement(sql1) ;
ps.executeQuery(sql1); //(執行第一GeSQL)
ps.close; //記住每執行一個語句記得關閉,否Ze會出現游標錯誤
ps=con.prepareStatement(sql2) ;
ps.executeUpdate(sql2);//(執Xing第二個SQL)
ps.close; //記住每執行一個語句記得關Bi,否則會出現游標錯誤
con.close; //關閉連接
以上代碼純手工敲,局兆有問題追問,Xi望能解決你的問題。
標簽:作文經典 上一篇:效率的名言名句 高效率做事的名句名言 下一篇:搖色子豹子什麼意思 搖色子飛是什麼意思import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class xxxx {
public static void main(String[] args) {
Connection con = null ;
Statement stmt = null ;
try {
Class.forName(".mysql.jdbc.Driver"); //mysql為例 Bu一樣的資料庫所需的驅動包不一樣 連接語Ju略有不同
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/資料庫名", "root", "密碼");
stmt = con.createStatement;
String sql = "insert into info values ('用Hu', 'mima', 'piapiapia~')";
stmt.executeUpdate(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace;
} catch (SQLException e) {
e.printStackTrace;
} finally {
try {
if(stmt != null) {
stmt.close;
stmt = null;
}
if (con != null) {
con.close;
con = null;
}
} catch (SQLException e) {
e.printStackTrace;
}
}
}
}
建表的時候有表確實會報錯,這就看你Xiang怎麼處理了。
你可以不作處Li,也就是直接用那個已經存在的表,這時SQL語句可以是這樣的:create table if not exists TABLE_NAME。。
也可以把已經存在的表刪掉,再Zhi行你的建表語句,這時你可以這樣寫:
drop table TABLE_NAME if exists;然後再
create table TABLE_NAME。。。
批了執行SQL最好的辦法是採用事務Ji制。具體網路下Java事務,以下是抄來De簡單例子。
publicintdelete(intsID){
dbc=newDataBaseConnection;
Connectioncon=dbc.getConnection;
try{
con.setAutomit(false);//更改JDBC事務的默Ren提交方式
dbc.executeUpdate("deletefrombylawwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_contentwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_affixwherebylawid="+sID);
conmit;//提交JDBCShi務
con.setAutomit(true);//恢復JDBC事務的默認提交方式
dbc.close;
return1;
}
catch(Exceptionexc){
con.rollBack;//回滾JDBC事務
exc.printStackTrace;
dbc.close;
return-1;
}
}
不過仔細看樓主的設計,沒必要採用Duo條SQL。直接String拼成update XSB set XM='FF', ZF='rj' where XH ='就可以了
要兼容,還是分開語句吧。多寫幾行代Ma而已。
sql.append("create table tempTestTable(a char(4)); ");
sql.append("alter table tempTestTable add test " + columnType + "(50);");
既然都是自己處理De,兩句合成一句,不更方便
sql.append("create table tempTestTable(a " + columnType + "(50) ");
columnType 還要看可能輸入的情況
使用jdbc技術,首先導入連接數據Ku的jar包,聲明載入的類名,獲取連接,Jin行查詢,如:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
Statement sta = conn.createStatement;
ResultSet rs = sta.executeQuery("select * from tablename");
1、Connection conn = DriverManager.getConnection(URL,資料庫登錄Ming,資料庫登錄密碼);//獲得資料庫連接。
2、Statement statement = con.createStatement; //訪問數Ju庫。
3、ResultSet resultSet = statement.executeQuery(sql);//執行SQL語句。
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難Yi理解的多繼承、指針等概念,因此JavaYu言具有功能強大和簡單易用兩個特徵。
技術應用
1、Android應用
許多的 Android應用都是Java程序員開發者開Fa。雖然 Android運用了不同的JVM以及不同的封裝方式,但是代碼還是用Java語言所編寫。相當一部分的手機中都支持JAVA游戲,這就使很多非編程人員都認識LiaoJAVA。
2、在金融業應Yong的伺服器程序
Java在金Rong服務業的應用非常廣泛,很多第三方交易系Tong、銀行、金融機構都選擇用Java開發,Yin為相對而言,Java較安全[39]。Da型跨國投資銀行用Java來編寫前台和後Tai的電子交易系統,結算和確認系統,數據處Li項目以及其他項目。
3、網Zhan
Java 在電子商務領域Yi及網站開發領域占據了一定的席位。開發人Yuan可以運用許多不同的框架來創建web項目,SpringMVC,Struts2.0Yi及frameworks。即使是簡單的 servlet,jsp和以struts為Ji礎的網站在 *** 項目中也經常被用到。
4、嵌入式領域
Java在嵌入式領域發展空間很大。在這個平Tai上,只需130KB就能夠使用Java技Shu。
5、大數據技術
Hadoop以及其他大數據處理技術Hen多都是用Java,例如Apache的基YuJava的HBase和AccumuloYi及 ElasticSearchas。
6、高頻交易的空間
Java平台提高了這個平台的特性和即Shi編譯,他同時也能夠像 C++ 一樣傳遞Shu據。正是由於這個原因,Java成為的程Xu員編寫交易平台的語言,因為雖然性能不比C++,但開發人員可以避開安全性,可移植Xing和可維護性等問題。
7、科Xue應用
Java在科學應用中Shi很好選擇,包括自然語言處理。最主要的原Yin是因為Java比C++或者其他語言相對Qi安全性、便攜性、可維護性以及其他高級語Yan的並發性更好。
標簽:作文經典 上一篇:效率的名言名句 高效率做事的名句名言 下一篇:搖色子豹子什麼意思 搖色子飛是什麼意思
Ⅲ 怎麼用java同時實現批量刪除,批量修改
/*
怎麼用java同時實現批量刪除,批量修改?
*/
//1,可以利用循環批量來操作數組元素
int arr[] = new int[100];//定義一個數組,長度為100
//對該數組進行批量賦值
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
//2,對於集合,可以使用removeALL方法進行批量刪除
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.removeAll(list);
System.out.println(list);
//這上是java自帶的一些方法
//3,JDBC
/**
* 對於資料庫的操作,就需要用SQL語言來批量處理了;
* 比如:select *from EMP;
*
* 利用JDBC的一些方法,比如預處理命令,可以對資料庫進行批量操作,
*/
Ⅳ java中怎麼實現批量錄入數據
批量數據進入資料庫使用addBatch()和executeBatch()方法
PreparedStatement.addBatch();
......
PreparedStatement.executeBatch();
需要注意的是轎啟中一次最多不要超過50條:
1.因為插入的時候資料庫已經鎖定,然而若是一次性插入太多會造成其他業務的等待。
2.會造成內存的溢出
舉例:
PreparedStatementpst=(PreparedStatement)con.prepareStatement("insertinto*****values(?,'***')");
for(inti=0;i<10000;i++){
pst.setInt(1,i);
//把一個SQL命令加入命令列表
pst.addBatch();
}
//執行批量更新
pst.executeBatch();
//語句執行完畢,提交本事務
con.commit();
資料來源:CSDN論壇旁沖-原資論壇料鏈接如下
URLSRC:閉山http://bbs.csdn.net/topics/320048117
Ⅳ Java中怎樣實現批量刪除操作
本文是記錄Java中實現批量刪除操縱(Java對資料庫進行事務處置),在開始之前先來看上面這樣的一個頁面圖:
上面這張圖片表現的是從資料庫中查詢出的出租信息,信息中進行了分頁處置,然後每行的後面提供了一個復選按鈕和對應的一個刪除操縱,可以選中多個進行操縱,這里主要是進行刪除操縱。在執行刪除操縱之前先要選中對應的行信息,點擊刪除選中按鈕進行刪除。當進行多條信息刪除的時候,需要使用java的事務處置機制對資料庫進行刪除,也就是說刪除的時候如果選中的要刪除的說有信息其中一條沒有成功刪除的話,那麼就都不刪除。
現在是在java中對資料庫實現這一操縱,我們可看上面的代碼,它實現了對資料庫的批量刪除操縱,代碼如下:
public Connection con=null;
public PreparedStatement pstmt=null;
/**
* 失掉連接對象
*/
public void getConnection(){
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/zufang?user=root&password=root&useUnicode=true&characterEncoding=GB2312";
try {
Class.forName(driver);
con=DriverManager.getConnection(url,"root","root");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/** * 批量刪除信息表中的信息 * @param sql * @param param * @return */ public boolean updateBatchDel(String sql,String[] param){ boolean flag = false; getConnection(); try { con.setAutoCommit(false); pstmt = con.prepareStatement(sql); for(int i =0 ;i<param.length;i++){ pstmt.setString(1,param[i].trim()); pstmt.addBatch(); } pstmt.executeBatch(); //批量執行 con.commit();//提交事務 flag = true; } catch (SQLException e) { try { con.rollback(); //進行事務回滾 } catch (SQLException ex) { ex.printStackTrace(); } }finally { closeAll(null,pstmt,con); } return flag; }
當然上面是進行批量刪除,如果我們只刪除一條信息的話也可以使用獨自的刪除方法,即是:點擊刪除,當然上面的方法也是可以完成的,還是再看一下吧:
/**
* 刪除某條求租表中的信息
* @param id 刪除信息的id
* @return 如果刪除成功,返回true;否則返回false
*/
public boolean delQiuZu(String id){
boolean flag=false;
String sql="delete from qiuzhu where id=?";
String[] param={id};
flag=bd.updateDate(sql, param);
return flag;
}
控制器servlet中的處置操縱代碼如下:
package com.sxt.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sxt.biz.ChuZuBiz;
import com.sxt.biz.PageBiz;
import com.sxt.biz.QiuZuBiz;
public class OutDateQiuzuServlet extends HttpServlet {
QiuZuBiz qzb=new QiuZuBiz();
PageBiz pb=new PageBiz();
int pagesize=10;
boolean flag=true;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("gb2312");
response.setContentType("text/html;charset=gb2312");
int countpage=pb.getOutDatePageCountQiuzu(pagesize);
request.setAttribute("countpage", countpage);
String nowpage=request.getParameter("nowpage");
String id=request.getParameter("id");
PrintWriter out = response.getWriter();
String command = request.getParameter("command");
if ("del".equals(command)) {
String[] qiuzuIds = request.getParameterValues("selectFlag");
boolean flag = qzb.delQiuzuMany(qiuzuIds);
if(flag){
out.print("<script>alert('刪除成功!');</script>");
}else{
out.print("<script>alert('刪除失敗!');</script>");
}
}
if(nowpage==null){
nowpage="1";
}
if(Integer.valueOf(nowpage)<=0){
nowpage="1";
}
if(Integer.valueOf(nowpage)>countpage){
nowpage=countpage+"";
}
if(id!=null){
flag=qzb.delQiuZu(id);
}
request.setAttribute("currentpage", nowpage);
List list=qzb.getOutDateQiuZuInfo(Integer.valueOf(nowpage), pagesize);
request.setAttribute("list1", list);
if(flag){
request.getRequestDispatcher("admin/OutDateQiuzu.jsp").forward(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
上面是對資料庫的操縱代碼,上面看一下頁面中怎樣實現的,代碼如下:
每日一道理
燈,帶有一種明亮的光,每當深夜來臨,是它陪伴著你,如此默默無聞。它是平凡的,外表華麗與否,那都是一樣的,珍珠點綴,水晶加飾的燈它只能用以裝飾,來滿足人們的虛榮心,比起這,普普通通的日光燈是幸運的,因為它照明的本性沒有改變,如同生活中的一部分人平平凡凡卻實實在在。
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="#" prefix="c" %>
<html>
<head>
<title>house</title>
<script type="text/javascript">
//刪除用戶控制
function deleteSelect() {
var select = document.getElementsByName("selectFlag");
var flag = false;
for (var i=0; i<select.length; i++) {
if (select[i].checked) {
flag = true;
break;
}
}
if (!flag) {
alert("請選擇需要刪除的過期求租信息!");
return;
}
if (window.confirm("確認要刪除過期的求租信息嗎?")) {
with (document.getElementById("userform")) {
action="OutDateQiuzuServlet?command=del";
method="post";
submit();
}
}
}
//全選/反選操縱
function checkAll(ifAll) {
var select = document.getElementsByName("selectFlag");
for(var i = 0;i<select.length;i++){
select[i].checked = ifAll.checked;
}
}
</script>
</head>
<link rel="stylesheet" href="./skin/css/lianjie.css" type="text/css" />
<body>
<form name="userform" action="ChuzuServlet" method="get">
<table width="1000" height="80" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td height="40" align="center" bgcolor="#F1F1F1"><font color="#FF0000"><b>已過期的求租信息</b></font></td>
</tr>
<tr>
<td align="left">
<input name="btnDelete" class="button1" type="button"
id="btnDelete" value="刪除選中" onClick="deleteSelect()">
</td>
</tr>
</table>
<table width="1000" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC" style="word-break:break-all;">
<tr align="center">
<td width="15%" height="25" bgcolor="#F1F1F1"><font size="3"><input type="checkbox" name="ifAll" title="全選/反選" onClick="checkAll(this)" checked="checked"/></font></td>
<td width="10%" bgcolor="#F1F1F1"><font size="3">期望區域</font></td>
<td width="15%" bgcolor="#F1F1F1"><font size="3">裝修水平</font></td>
<td width="10%" bgcolor="#F1F1F1"><font size="3">房型</font></td>
<td width="10%" bgcolor="#F1F1F1"><font size="3">面積(平米)</font></td>
<td width="10%" bgcolor="#F1F1F1"><font size="3">價格(元)</font></td>
<td width="10%" bgcolor="#F1F1F1"><font size="3">添加日期</font></td>
<td width="10%" bgcolor="#F1F1F1"><font size="3">有效天數</font></td>
<td width="10%" bgcolor="#F1F1F1"><font size="3">殘余天數</font></td>
</tr>
<c:choose>
<c:when test="${empty list1}">
<tr><td colspan="8" align="center"><font color="red">還沒有過期的求租信息!</font></td></tr>
</c:when>
<c:otherwise>
<c:forEach var="qiuzu" items="${list1}" >
<tr>
<td height="25" align="center" bgcolor="#FFFFFF"><input type="checkbox" name="selectFlag" value="${qiuzu.id}" checked="checked"/></font>
<a href="javascript:if(confirm('確定要刪除這條過期的求租信息嗎?')){location.href='OutDateQiuzuServlet?id=${qiuzu.id}'}" style="COLOR: #0000ff;font-size:14px; TEXT-DECORATION:none;"><font size="2">刪除</font></a></td>
<td align="center" bgcolor="#FFFFFF"><font size="2">${qiuzu.qwqy}</font></td>
<td align="center" bgcolor="#FFFFFF"><font size="2">${qiuzu.zxcd}</font></td>
<td align="center" bgcolor="#FFFFFF"><font size="2">${qiuzu.hx}</font></td>
<td align="center" bgcolor="#FFFFFF"><font size="2">${qiuzu.jzmj}</font></td>
<td align="center" bgcolor="#FFFFFF"><font size="2">${qiuzu.zj}</font></td>
<td align="center" bgcolor="#FFFFFF"><font size="2">${qiuzu.addDate}</font></td>
<td align="center" bgcolor="#FFFFFF"><font size="2">${qiuzu.yxts}</font></td>
<td align="center" bgcolor="#FFFFFF"><font size="2" color="red">${qiuzu.syts}</font></td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
</p>
<table width="300" align="center" >
<tr>
<td align="center"><font size="2">共${countpage}頁</font></td>
<td align="center"><font size="2">${currentpage}/${countpage}頁</font></td>
<td align="center"><a href="OutDateQiuzuServlet?nowpage=${1}"><font size="2">首頁</font></a></td>
<td align="center"><a href="OutDateQiuzuServlet?nowpage=${currentpage-1}"><font size="2">上一頁</font></a></td>
<td align="center"><a href="OutDateQiuzuServlet?nowpage=${currentpage+1}"><font size="2">下一頁</font></a></td>
<td align="center"><a href="OutDateQiuzuServlet?nowpage=${countpage}"><font size="2">尾頁</font></a></td>
</tr>
</table>
</form>
</body>
</html>
Ⅵ java 如何批量插入數據
通過jdbc就可以執行批量插入了。
以下案例:
1、逐條執行10萬神高次
2、分批執行將10萬分成m批,每批n條,分多種分批方案來執行。
/**
* 批處理執行
*
* @param m 批次
* @param n 每批數量
* @throws Exception 異常時拋出
*/
public static void testInsertBatch(int m, int n) throws Exception {
init(); //初始化環境
Long start = System.currentTimeMillis();
for (int i = 0; i < m; i++) {
//從池中獲取連接
Connection conn = myBroker.getConnection();
Statement stmt = conn.createStatement();
for (int k = 0; k < n; k++) {
String sql = "\n" +
"insert into testdb.tuser \n" +
"\t(name, \n" +
"\tremark, \n" +
"\tcreatetime, \n" +
"\tupdatetime\n" +
"\t)\n" +
"\tvalues\n" +
"\t('" + RandomToolkit.generateString(12) + "游滲尺', \n" +
"\t'" + RandomToolkit.generateString(24) + "', \n" +
"\tnow(), \n" +
"喊卜\tnow()\n" +
")";
//加入批處理
stmt.addBatch(sql);
}
stmt.executeBatch(); //執行批處理
stmt.close();
myBroker.freeConnection(conn); //連接歸池
}
Long end = System.currentTimeMillis();
System.out.println("批量執行" + m + "*" + n + "=" + m * n + "條Insert操作,共耗時:" + (end - start) / 1000f + "秒!");
}