最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql三種批量增加的性能分析

 更新時(shí)間:2012年08月14日 17:15:07   作者:  
最近在深入學(xué)習(xí)hibernate,在進(jìn)行批量操作時(shí),發(fā)現(xiàn)hibernate批量操作性能非常低.于是就想找一個(gè)性能較高的方法,在對(duì)jdbc、jdbcTemplate、hibernate進(jìn)行測(cè)試后,發(fā)現(xiàn)jdbc的執(zhí)行效率是最高的,jdbcTemplate也很相近,hibernate就不考慮了,慘不忍睹啊
下面把代碼寫(xiě)出來(lái),希望大家批評(píng)指正.
首先domain對(duì)象.在這里使用的注解的方式,都是比較新的版本.
User.java
復(fù)制代碼 代碼如下:

package com.bao.sample.s3h4.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.bao.sample.base.domain.BaseDomain;
@Entity
@Table(name = "t_user")
public class User extends BaseDomain {
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String password;
/**
* @Description 注解最好標(biāo)記在get方法上.注意:采用一致的標(biāo)記方式,注解是以Id的標(biāo)記方式為準(zhǔn)的,如果標(biāo)記在get方法上,則忽略property上的注解.
* @return
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(nullable = false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(nullable = false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
super();
}
public User(int id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
}

接下來(lái)是Dao接口,繼承一個(gè)BaseDao接口.
復(fù)制代碼 代碼如下:

package com.bao.sample.s3h4.dao;
import java.util.List;
import com.bao.sample.base.dao.BaseDao;
import com.bao.sample.s3h4.domain.User;
public interface UserBatchDao extends BaseDao<User> {
/**
* @Description 批量增加操作
* @return -1:操作失敗;0:執(zhí)行正常;>0:執(zhí)行成功的數(shù)目
*/
public int batchAddUsingJdbc(List<User> users);
public int batchAddUsingHibernate(List<User> users);
public int batchAddUsingJdbcTemplate(List<User> users);
}

UserBatchDao的實(shí)現(xiàn):
復(fù)制代碼 代碼如下:

UserBatchDaoImpl
package com.bao.sample.s3h4.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate4.SessionFactoryUtils;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.bao.sample.base.dao.BaseDaoImpl;
import com.bao.sample.s3h4.domain.User;
/**
*
* @Description 三種批量增加方法,執(zhí)行效率依次是jdbc、jdbcTemplate、hibernate.<br />jdbc和jdbcTemplate執(zhí)行效率相近,不過(guò)jdbcTemplate可以使用事務(wù)注解控制,所以?xún)?yōu)先選擇.
* @author Bob hehe198504@126.com
* @date 2012-8-13
*/
@Repository("userBatchDao")
public class UserBatchDaoImpl extends BaseDaoImpl<User> implements UserBatchDao {
@Resource
protected JdbcTemplate jdbcTemplate;
/**
* 執(zhí)行10W條記錄,大致耗時(shí)15188ms
*/
@Override
public int batchAddUsingJdbc(List<User> users) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "insert into t_user (username,password) values (?,?)";
try {
conn = SessionFactoryUtils.getDataSource(sessionFactory).getConnection();
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < users.size(); i++) {
int j = 1;
pstmt.setString(j++, users.get(i).getUsername());
pstmt.setString(j++, users.get(i).getPassword());
pstmt.addBatch();
}
pstmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* 執(zhí)行10W條記錄,大致耗時(shí)131203ms,大致是jdbc或jdbcTemplate的10倍.
*/
@Override
// @Transactional(noRollbackFor = RuntimeException.class)
@Transactional
public int batchAddUsingHibernate(List<User> users) {
Session session = this.getSession();
for (int i = 0; i < users.size(); i++) {
session.save(users.get(i));
// 添加20條以后,強(qiáng)制入庫(kù)
// clear()清空緩存
// postgres數(shù)據(jù)庫(kù)的隔離級(jí)別是已提交讀(Read committed),
// 所以flush以后,數(shù)據(jù)看不到,只有commit后才能看到數(shù)據(jù),
// 如果失敗,rollback,前面的flush的數(shù)據(jù)不會(huì)入庫(kù)
if (i % 20 == 0) {
session.flush();
session.clear();
}
}
return 0;
}
/**
* 執(zhí)行10W條記錄,大致耗時(shí)15671ms
*/
// @Transactional(noRollbackFor = RuntimeException.class)
@Transactional
public int batchAddUsingJdbcTemplate(List<User> users) {
String sql = "insert into t_user (username,password) values (?,?)";
final List<User> tempUsers = users;
final int count = users.size();
BatchPreparedStatementSetter pss = new BatchPreparedStatementSetter() {
// 為prepared statement設(shè)置參數(shù)。這個(gè)方法將在整個(gè)過(guò)程中被調(diào)用的次數(shù)
public void setValues(PreparedStatement pstmt, int i) throws SQLException {
int j = 1;
pstmt.setString(j++, tempUsers.get(i).getUsername());
pstmt.setString(j++, tempUsers.get(i).getPassword());
}
// 返回更新的結(jié)果集條數(shù)
public int getBatchSize() {
return count;
}
};
jdbcTemplate.batchUpdate(sql, pss);
return 0;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
}

外圍的框架沒(méi)有附上,有需要可以留言,我提供打包下載.
作者:聽(tīng)雨軒

相關(guān)文章

  • 常見(jiàn)的數(shù)據(jù)庫(kù)1045密碼錯(cuò)誤問(wèn)題解決方法

    常見(jiàn)的數(shù)據(jù)庫(kù)1045密碼錯(cuò)誤問(wèn)題解決方法

    連接MySQL數(shù)據(jù)庫(kù)時(shí)難免會(huì)遇到1045錯(cuò)誤,主要是因?yàn)橛脩?hù)輸入的用戶(hù)名或密碼錯(cuò)誤被拒絕訪問(wèn),下面這篇文章主要給大家介紹了關(guān)于常見(jiàn)的數(shù)據(jù)庫(kù)1045密碼錯(cuò)誤問(wèn)題的解決方法,需要的朋友可以參考下
    2023-04-04
  • Mysql 主從集群同步延遲的問(wèn)題解決

    Mysql 主從集群同步延遲的問(wèn)題解決

    本文主要介紹了Mysql 主從集群同步延遲的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 淺析MySQL如何實(shí)現(xiàn)事務(wù)隔離

    淺析MySQL如何實(shí)現(xiàn)事務(wù)隔離

    使用過(guò)關(guān)系型數(shù)據(jù)庫(kù)的,應(yīng)該都事務(wù)的概念有所了解,知道事務(wù)有 ACID 四個(gè)基本屬性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),今天我們主要來(lái)理解一下事務(wù)的隔離性
    2021-06-06
  • mysql 批量查詢(xún)?nèi)∶恳唤M最新一條數(shù)據(jù)

    mysql 批量查詢(xún)?nèi)∶恳唤M最新一條數(shù)據(jù)

    根據(jù)車(chē)牌號(hào)查詢(xún)最新的一條交車(chē)記錄的‘合同號(hào)’ ,這里只需要查詢(xún)‘合同號(hào)’這個(gè)字段,這篇文章主要介紹了mysql 批量查詢(xún)?nèi)∶恳唤M最新一條數(shù)據(jù),需要的朋友可以參考下
    2024-02-02
  • MySQL主從復(fù)制不一致的原因分析以及解決

    MySQL主從復(fù)制不一致的原因分析以及解決

    這篇文章主要介紹了MySQL主從復(fù)制不一致的原因分析以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • mysql常見(jiàn)問(wèn)題解決

    mysql常見(jiàn)問(wèn)題解決

    網(wǎng)上看到了不錯(cuò)的mysql下常見(jiàn)錯(cuò)誤解決方法,特整理下,方便大家學(xué)習(xí)mysql
    2008-02-02
  • mysql日常鎖表之flush_tables詳解

    mysql日常鎖表之flush_tables詳解

    Flushtables和Flushtableswithreadlock是MySQL中的兩個(gè)命令,用于關(guān)閉表對(duì)象和清空查詢(xún)緩存,它們會(huì)等待所有正在運(yùn)行的SQL請(qǐng)求執(zhí)行結(jié)束,如果請(qǐng)求操作的表集合為{tables},則會(huì)阻塞其他會(huì)話對(duì){tables}表上的所有操作,包括查詢(xún)和寫(xiě)操作
    2024-11-11
  • MySQL SQL 語(yǔ)法參考

    MySQL SQL 語(yǔ)法參考

    MySQL SQL 語(yǔ)法參考...
    2006-12-12
  • MySQL優(yōu)化GROUP BY方案

    MySQL優(yōu)化GROUP BY方案

    滿(mǎn)足GROUP BY子句的最一般的方法是掃描整個(gè)表并創(chuàng)建一個(gè)新的臨時(shí)表,表中每個(gè)組的所有行應(yīng)為連續(xù)的,然后使用該臨時(shí)表來(lái)找到組并應(yīng)用累積函數(shù)(如果有)。在某些情況中,MySQL能夠做得更好,即通過(guò)索引訪問(wèn)而不用創(chuàng)建臨時(shí)表。
    2014-07-07
  • mysql8連接不上問(wèn)題及解決

    mysql8連接不上問(wèn)題及解決

    這篇文章主要介紹了mysql8連接不上問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論

仁寿县| 长兴县| 桑日县| 五家渠市| 唐山市| 乌海市| 开江县| 龙海市| 永丰县| 文山县| 航空| 五台县| 江西省| 衡山县| 贡山| 资溪县| 从江县| 定远县| 绥芬河市| 东方市| 凭祥市| 抚州市| 莱西市| 建阳市| 长治市| 武鸣县| 奈曼旗| 肇庆市| 淮阳县| 抚州市| 广汉市| 周宁县| 炎陵县| 南丹县| 固镇县| 常山县| 龙井市| 武平县| 香港 | 扎赉特旗| 宁化县|