Ⅰ java中的通過JDBC事務批量提交的問題,我的代碼如下,問題是不回滾.大神幫我看看什麼原因
getPreparedStatement(conn,sql,item);
方法是幹啥的,貼出來
其實問題很簡單
MyLog.e(">>>提交之前<<<");
//在try塊內添加事務的提交操作,表示操作無異常,提交事務。
conn.commit();//此處都沒有執行到
MyLog.e(">>>全部提交了<<<");
}catch(SQLExceptione){
isInsertOk=false;
MyLog.e(">>>出錯,准備rollback<<<");
try{
上面的那個SQLException e
換成 Exception e 應該就可以了,
Ⅱ java,jdbc,大量數據update更新效率很慢,哪位大神可憐可憐我吧
mysql使用jdbc的批量插入需要在連接Mysql的地方加上rewriteBatchedStatements=true
,也就是spring.datasource.url = jdbc:mysql://192.168.15.44:3306/ml_test?useSSL=false&useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true
,如果不加這個的話,和自己循環插入差不多
Ⅲ java的jdbc批量更新使用了PreparedStatement的addBatch方法,添加了事務不回滾..
事務是不是沒有開啟啊?感覺你寫的事務不對,conn是個連接吧
Ⅳ 關於JDBC批量操作中異常BatchUpdateException的getUpdateCounts()方法
此類問題的出現主要來自三個方面。
1、 SQL語句中存在語法錯誤或是傳入的數據有誤;
2、 資料庫的配置不合法,或者說是配置有誤。較容易出現的有數據表的映射文件(,hbm.xml文件)配置有誤;Hibernate.cfg.xml文件配置有誤;
3、 當前的資料庫用戶許可權不足,不能操作資料庫。以是以Oracle 資料庫為例,這種情況下在錯誤提示中會顯示java.sql.BatchUpdateException: ORA-01031: insufficient privileges這樣的信息。
Ⅳ jdbc一次批量處理多少條數據
作為一個替代方案,可以試試使用Statement 的批量處理特性看看能否同時執行所有的SQL以提高速度。 存儲過程的最簡單的形式就是包含一系列SQL語句的過程,將這些語句放在一起便於在同一個地方管理也可以提高速度。Statement 類可以包含一系列SQL語句,因此允許在同一個資料庫事務執行所有的那些語句而不是執行對資料庫的一系列調用。 使用批量處理功能涉及下面的兩個方法: · addBatch(String) 方法 · executeBatch方法 如果你正在使用Statement 那麼addBatch 方法可以接受一個通常的SQL語句,或者如果你在使用PreparedStatement ,那麼也可以什麼都不向它增加。executeBatch 方法執行那些SQL語句並返回一個int值的數組,這個數組包含每個語句影響的數據的行數。如果將一個SELECT語句或者其他返回一個ResultSet的SQL語句放入批量處理中就會導致一個SQLException異常。 關於java.sql.Statement 的簡單範例可以是: Statement stmt = conn.createStatement(); stmt.insert(DELETE FROM Users); stmt.insert(INSERT INTO Users VALUES(rod, 37, circle)); stmt.insert(INSERT INTO Users VALUES(jane, 33, triangle)); stmt.insert(INSERT INTO Users VALUES(freddy, 29, square)); int[] counts = stmt.executeBatch(); PreparedStatement 有些不同,它只能處理一部分SQL語法,但是可以有很多參數,因此重寫上面的範例的一部分就可以得到下面的結果: // 注意這里沒有DELETE語句 PreparedStatement stmt = conn.prepareStatement(INSERT INTO Users VALUES(?,?,?));
Ⅵ java JDBC 批量插入的時候報數組下標越界,求大神
擦
已經解決:原因是
我insert_st.setString(1,
ZH_S(user.getId()));,傳遞的參數過多,Oracle的批處理個數限制為:
count=傳參個數
*
查入的數據條數
上邊設置的1000條數據,進行一次批處理,越界了~
將
final
int
batchSize
=
500;
的值設小一點就屁事沒有
Ⅶ 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、如果這一批次中的記錄毫無相關性,可以將失敗的記錄回滾,成功的記錄依然提交,並將失敗記錄保存下來,或者列印日誌什麼的,這樣可以知道哪裡錯了,改正後手動插入;
2、當然如果這一批次作為一個原子型事務的話,就全部回滾;
Ⅸ java Spring 的JDBCTemplet批量入庫數據時如果有一條數據入庫不成功,其他的數據還會入庫嗎
在我們的項目中遇到這樣一個問題:我們的項目需要連接多個資料庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的資料庫。我們以往在spring和hibernate框架中總是配置一個數據源,因而sessionFactory的dataSource屬性總是指向這個數據源並且恆定不變,所有DAO在使用sessionFactory的時候都是通過這個數據源訪問資料庫。但是現在,由於項目的需要,我們的DAO在訪問sessionFactory的時候都不得不在多個數據源中不斷切換,問題就出現了:如何讓sessionFactory在執行數據持久化的時候,根據客戶的需求能夠動態切換不同的數據源?我們能不能在spring的框架下通過少量修改得到解決?是否有什麼設計模式可以利用呢?問題的分析我首先想到在spring的applicationContext中配置所有的dataSource。這些dataSource可能是各種不同類型的,比如不同的資料庫:Oracle、SQLServer、MySQL等,也可能是不同的數據源:比如apache提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然後sessionFactory根據客戶的每次請求,將dataSource屬性設置成不同的數據源,以到達切換數據源的目的。但是,我很快發現一個問題:當多用戶同時並發訪問資料庫的時候會出現資源爭用的問題。這都是「單例模式」惹的禍。眾所周知,我們在使用spring框架的時候,在beanFactory中注冊的bean基本上都是採用單例模式,即spring在啟動的時候,這些bean就裝載到內存中,並且每個bean在整個項目中只存在一個對象。正因為只存在一個對象,對象的所有屬性,更准確說是實例變數,表現得就如同是個靜態變數(實際上「靜態」與「單例」往往是非常相似的兩個東西,我們常常用「靜態」來實現「單例」)。拿我們的問題來說,sessionFactory在整個項目中只有一個對象,它的實例變數dataSource也就只有一個,就如同一個靜態變數一般。如果不同的用戶都不斷地去修改dataSource的值,必然會出現多用戶爭用一個變數的問題,對系統產生隱患。通過以上的分析,解決多數據源訪問問題的關鍵,就集中在sessionFactory在執行數據持久化的時候,能夠通過某段代碼去根據客戶的需要動態切換數據源,並解決資源爭用的問題。問題的解決(一)採用Decorator設計模式要解決這個問題,我的思路鎖定在了這個dataSource上了。如果sessionFactory指向的dataSource可以根據客戶的需求去連接客戶所需要的真正的數據源,即提供動態切換數據源的功能,那麼問題就解決了。那麼我們怎麼做呢?去修改那些我們要使用的dataSource源碼嗎?這顯然不是一個好的方案,我們希望我們的修改與原dataSource代碼是分離的。根據以上的分析,使用GoF設計模式中的Decorator模式(裝飾者模式)應當是我們可以選擇的最佳方案。什麼是「Decorator模式」?簡單點兒說就是當我們需要修改原有的功能,但我們又不願直接去修改原有的代碼時,設計一個Decorator套在原有代碼外面。當我們使用Decorator的時候與原類完全一樣,當Decorator的某些功能卻已經修改為了我們需要修改的功能。Decorator模式的結構如圖。我們本來需要修改圖中所有具體的Component類的一些功能,但卻並不是去直接修改它們的代碼,而是在它們的外面增加一個Decorator。Decorator與具體的Component類都是繼承的AbstractComponent,因此它長得和具體的Component類一樣,也就是說我們在使用Decorator的時候就如同在使用ConcreteComponentA或者ConcreteComponentB一樣,甚至那些使用ConcreteComponentA或者ConcreteComponentB的客戶程序都不知道它們用的類已經改為了Decorator,但是Decorator已經對具體的Component類的部分方法進行了修改,執行這些方法的結果已經不同了。(二)設計MultiDataSource類現在回到我們的問題,我們需要對dataSource的功能進行變更,但又不希望修改dataSource中的任何代碼。我這里指的dataSource是所有實現javax.sql.DataSource介面的類,我們常用的包括apache提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等,這些類我們不可能修改它們本身,更不可能對它們一個個地修改以實現動態分配數據源的功能,同時,我們又希望使用dataSource的sessionFactory根本就感覺不到這樣的變化。Decorator模式就正是解決這個問題的設計模式。首先寫一個Decorator類,我取名叫MultiDataSource,通過它來動態切換數據源。同時在配置文件中將sessionFactory的dataSource屬性由原來的某個具體的dataSource改為MultiDataSource。如圖:對比原Decorator模式,AbstractComponent是一個抽象類,但在這里我們可以將這個抽象類用介面來代替,即DataSource介面,而ConcreteComponent就是那些DataSource的實現類,如BasicDataSource、JndiObjectFactoryBean等。MultiDataSource封裝了具體的dataSource,並實現了數據源動態切換:java代碼{privateDataSourcedataSource=null;publicMultiDataSource(DataSourcedataSource){this.dataSource=dataSource;}publicConnectiongetConnection()throwsSQLException{returngetDataSource().getConnection();}//其它DataSource介面應當實現的方法publicDataSourcegetDataSource(){returnthis.dataSource;}}publicvoidsetDataSource(DataSourcedataSource){this.dataSource=dataSource;}}客戶在發出請求的時候,將dataSourceName放到request中,然後把request中的數據源名通過調用newMultiDataSource(dataSource)時可以告訴MultiDataSource客戶需要的數據源,就可以實現動態切換數據源了。但細心的朋友會發現這在單例的情況下就是問題的,因為MultiDataSource在系統中只有一個對象,它的實例變數dataSource也只有一個,就如同一個靜態變數一般。正因為如此,單例模式讓許多設計模式都不得不需要更改,這將在我的《「單例」更改了我們的設計模式》中詳細討論。那麼,我們在單例模式下如何設計呢?(三)單例模式下的MultiDataSource在單例模式下,由於我們在每次調用MultiDataSource的方法的時候,dataSource都可能是不同的,所以我們不能將dataSource放在實例變數dataSource中,最簡單的方式就是在方法getDataSource()中增加參數,告訴MultiDataSource我到底調用的是哪個dataSource:java代碼publicDataSourcegetDataSource(StringdataSourceName){log.debug("dataSourceName:"+dataSourceName);try{if(dataSourceName==null||dataSourceName.equals("")){returnthis.dataSource;}return(DataSource)this.applicationContext.getBean(dataSourceName);}catch(){thrownewDaoException("ThereisnotthedataSource}}值得一提的是,我需要的數據源已經都在spring的配置文件中注冊,dataSourceName就是其對應的id。xml代碼oracle.jdbc.driver.OracleDrivervalue>property>bean>oracle.jdbc.driver.OracleDrivervalue>property>bean>為了得到spring的ApplicationContext,MultiDataSource類必須實現介面org.springframework.context.ApplicationContextAware,並且實現方法:java代碼=null;()throwsBeansException{this.applicationContext=applicationContext;}如此這樣,我就可以通過this.applicationContext.getBean(dataSourceName)得到dataSource了。(四)通過線程傳遞dataSourceName查看以上設計,MultiDataSource依然無法運行,因為用戶在發出請求時,他需要連接什麼資料庫,其數據源名是放在request中的,要將request中的數據源名傳給MultiDataSource,需要經過BUS和DAO,也就是說為了把數據源名傳給MultiDataSource,BUS和DAO的所有方法都要增加dataSourceName的參數,這是我們不願看到的。寫一個類,通過線程的方式跳過BUS和DAO直接傳遞給MultiDataSource是一個不錯的設計:java代碼publicclassSpObserver{privatestaticThreadLocallocal=newThreadLocal();publicstaticvoidputSp(Stringsp){local.set(sp);}publicstaticStringgetSp(){return(String)local.get();}}做一個filter,每次客戶發出請求的時候就調用SpObserver.petSp(dataSourceName),將request中的dataSourceName傳遞給SpObserver對象。最後修改MultiDataSource的方法getDataSource():java代碼publicDataSourcegetDataSource(){Stringsp=SpObserver.getSp();returngetDataSource(sp);}完整的MultiDataSource代碼在附件中。(五)動態添加數據源通過以上方案,我們解決了動態分配數據源的問題,但你可能提出疑問:方案中的數據源都是配置在spring的ApplicationContext中,如果我在程序運行過程中動態添加數據源怎麼?這確實是一個問題,而且在我們的項目中也確實遇到。spring的ApplicationContext是在項目啟動的時候載入的。載入以後,我們如何動態地載入新的bean到ApplicationContext中呢?我想到如果用spring自己的方法解決這個問題就好了。所幸的是,在查看spring的源代碼後,我找到了這樣的代碼,編寫了DynamicLoadBean類,只要調用loadBean()方法,就可以將某個或某幾個配置文件中的bean載入到ApplicationContext中(見附件)。不通過配置文件直接載入對象,在spring的源碼中也有,感興趣的朋友可以自己研究。(六)在spring中配置在完成了所有這些設計以後,我最後再嘮叨一句。我們應當在spring中做如下配置:xml代碼bean>property>bean>property>bean>其中dataSource屬性實際上更准確地說應當是defaultDataSource,即spring啟動時以及在客戶沒有指定數據源時應當指定的默認數據源。該方案的優勢以上方案與其它方案相比,它有哪些優勢呢?首先,這個方案完全是在spring的框架下解決的,數據源依然配置在spring的配置文件中,sessionFactory依然去配置它的dataSource屬性,它甚至都不知道dataSource的改變。唯一不同的是在真正的dataSource與sessionFactory之間增加了一個MultiDataSource。其次,實現簡單,易於維護。這個方案雖然我說了這么多東西,其實都是分析,真正需要我們寫的代碼就只有MultiDataSource、SpObserver兩個類。MultiDataSource類真正要寫的只有getDataSource()和getDataSource(sp)兩個方法,而SpObserver類更簡單了。實現越簡單,出錯的可能就越小,維護性就越高。最後,這個方案可以使單數據源與多數據源兼容。這個方案完全不影響BUS和DAO的編寫。如果我們的項目在開始之初是單數據源的情況下開發,隨著項目的進行,需要變更為多數據源,則只需要修改spring配置,並少量修改MVC層以便在請求中寫入需要的數據源名,變更就完成了。如果我們的項目希望改回單數據源,則只需要簡單修改配置文件。這樣,為我們的項目將增加的彈性。特別說明:實例中的DynamicLoadBean在web環境下運行會出錯,需要將類中AbstractApplicationContext改為org.springframework.context.。
Ⅹ java jdbc 執行sql語句批量操作問題
sql優化:
1.name欄位創建索引
2.「table_c.*」 不要用」*「號,可以換成table_c.id,table_c.name,table_c.sex,table_c.email
如果可以的話,你和以在insert into table_a 中間加 append ,這樣寫 insert /*+ append */ into
希望能幫到你!