-
2021-03-08 00:15:59
packagecom.eg.egsc.egc.mapanalysisapp;importjava.sql.Connection;importjava.sql.Date;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.util.Random;/*** 批量操作+事务提交
**/
public classJdbcBatchInsertData {private static String url = "jdbc:postgresql://10.102.73.53:5432/test_db?rewriteBatchedStatements=true&characterEncoding=utf8&serverTimezone=GMT%2B8";private static String user = "test";private static String password = "test";public static voidmain(String[] args) {
Connection conn= null;
PreparedStatement pstm= null;try{
Class.forName("org.postgresql.Driver");
conn=DriverManager.getConnection(url, user, password);
String sql= "INSERT INTO test_poi (id, park_id, project_id, longitude, latitude, type,"
+ " project_short_desc, project_desc, tag_ids, version,"
+ " pic_url, play_time, show_levels, play_number, wait_number,"
+ " create_user, create_time, update_user, update_time, delete_flag) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,? , ?, ?, ?, ?, ?, ?, ?)";
pstm=conn.prepareStatement(sql);//先将命令的提交方式设为false,即手动提交conn.setAutoCommit(false);//最后在所有命令执行完之后再提交事务conn.commit();
conn.setAutoCommit(false);
Long startTime=System.currentTimeMillis();
Random rand= newRandom();//int a, b;//插入10万条数据
for (int i = 1; i <= 100000; i++) {//随机值//a = rand.nextInt(10);//b = rand.nextInt(10);//1代表的是列索引,i是值
pstm.setString(1, i + "");
pstm.setString(2, i + "");//园区ID
pstm.setString(3, i + ""); //项目ID
pstm.setString(4, "109.18" + i); //经度
pstm.setString(5, "19.6" + i); //纬度
pstm.setInt(6, 1);//type
pstm.setString(7, "童话世界" +i);
pstm.setString(8, "这里是童话世界" +i);
pstm.setString(9, "1|2");//tag_id
pstm.setInt(10, 1); //版本
pstm.setString(11, "picUrl");//picUrl
pstm.setInt(12, 4);//play_time
pstm.setString(13, "3|5"); //show_levels
pstm.setInt(14, 0);//play_number
pstm.setInt(15, 0);//wait_number//Timestamp createDate = new Timestamp(System.currentTimeMillis());//pstm.setTimestamp(16,createDate);//us_start_time//pstm.setTimestamp(17, createDate);//us_end_time
pstm.setString(16, "admin");//create_user
pstm.setDate(17, new Date(i));//create_time
pstm.setString(18, "admin");//update_user
pstm.setDate(19, new Date(i));//update_time
pstm.setInt(20, 1);//delete_flag
pstm.addBatch();
}
pstm.executeBatch();//此处再commit
conn.commit();
Long endTime=System.currentTimeMillis();
System.out.println("************************正在插入中,请稍等******************************");
System.out
.println("批量插入用时:" + ((endTime - startTime)) + "毫秒" + "约等于" + ((endTime - startTime) / 1000) + "秒");
System.out.println("批量插入完成!");
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();throw newRuntimeException(e);
}finally{if (pstm != null) {try{
pstm.close();
}catch(SQLException e) {
e.printStackTrace();throw newRuntimeException(e);
}
}if (conn != null) {try{
conn.close();
}catch(SQLException e) {
e.printStackTrace();throw newRuntimeException(e);
}
}
}
}
}
更多相关内容 -
java加事务批量提交
2021-03-08 00:15:56Statement批量处理和事务代码如下:package com.ambow.day20.jdbc.JDBCTestCommitAndRollback;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import ...Statement批量处理和事务代码如下:
package com.ambow.day20.jdbc.JDBCTestCommitAndRollback;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import com.ambow.day19.jdbc.util.JDBCConAndClo;
/*
*1,首先把Auto commit设置为false,不让它自动提交
*2,进行手动提交(commit)
*3,提交完成后回复现场将Auto commit,还原为true,
*4,当异常发生执行catch中SQLException时,记得要rollback(回滚);
* */
public class StatementCommitAndRollbackTest {
public static void main(String args[]) {
Connection con = null;
Statement stm = null;
try {
con = JDBCConAndClo.getConnectionBao();
stm = con.createStatement();
con.setAutoCommit(false);
// 若不出现异常,则继续执行到try语句完,否则跳转到catch语句中
stm.addBatch("insert into student values(23,'tangbao','高数',100)");
stm.addBatch("insert into student values(24,'王定','c#',98)");
stm.addBatch("insert into student values(25,'王国云','java',90)");
stm.addBatch("insert into student values(26,'溜出','英语',89)");
stm.addBatch("insert into student values(27,'wqde','java',63)");
/*
* int[] executeBatch() throws
* SQLException将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
*/
stm.executeBatch();
System.out.println("插入成功!");
// commit:若成功执行完所有的插入操作,则正常结束
con.commit();
System.out.println("提交成功!");
con.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
try {
//rollback: 若出现异常,对数据库中所有已完成的操作全部撤销,则回滚到事务开始状态
if (!con.isClosed()) {
con.rollback();
System.out.println("提交失败,回滚!");
con.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
} finally {
JDBCConAndClo.closeStatement(stm);
JDBCConAndClo.closeConnection(con);
}
}
}
}
PreparedStatement批量处理和事务代码如下:
package com.ambow.day20.jdbc.JDBCTestCommitAndRollback;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.ambow.day19.jdbc.util.JDBCConAndClo;
/*
* PreparedStatement:
1.addBatch() 将一组参数添加到 PreparedStatement对象内部
2.executeBatch() 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
*
*/
public class PreparedStatementCommitAndRollbackTest {
public static void main(String args[]) {
Connection con = null;
PreparedStatement pstm = null;
try {
// 1. 建立与数据库的连接
con = JDBCConAndClo.getConnectionBao();
// 2. 执行sql语句
// 1).先创建PreparedStatement语句(发送slq请求):
pstm = con.prepareStatement("insert into student values(?,?,?,?)");
con.setAutoCommit(false);//1,首先把Auto commit设置为false,不让它自动提交
// 2) 设置sql语句1
pstm.setInt(1, 33);
pstm.setString(2,"wangqin");
pstm.setString(3, "c++");
pstm.setDouble(4, 78.5);
// 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
pstm.addBatch();
// 2) 设置sql语句2
pstm.setInt(1, 34);
pstm.setString(2,"wuytun");
pstm.setString(3, "c");
pstm.setDouble(4, 77);
// 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
pstm.addBatch();
// 2) 设置sql语句3
pstm.setInt(1, 31);
pstm.setString(2,"tetet");
pstm.setString(3, "c++");
pstm.setDouble(4, 90);
// 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
pstm.addBatch();
// 2) 设置sql语句4
pstm.setInt(1, 32);
pstm.setString(2,"liug");
pstm.setString(3, "c");
pstm.setDouble(4, 50);
// 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
pstm.addBatch();
// 4) 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
pstm.executeBatch();
System.out.println("插入成功!");
// 若成功执行完所有的插入操作,则正常结束
con.commit();//2,进行手动提交(commit)
System.out.println("提交成功!");
con.setAutoCommit(true);//3,提交完成后回复现场将Auto commit,还原为true,
} catch (SQLException e) {
e.printStackTrace();
try {
// 若出现异常,对数据库中所有已完成的操作全部撤销,则回滚到事务开始状态
if(!con.isClosed()){
con.rollback();//4,当异常发生执行catch中SQLException时,记得要rollback(回滚);
System.out.println("插入失败,回滚!");
con.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
JDBCConAndClo.closePreparedStatement(pstm);
JDBCConAndClo.closeConnection(con);
}
}
}
-
SpringBoot Mybatis 手动提交事务
2022-04-08 10:07:531.数据库配置文件mybatis-config-only.xml 2.Java工具类MybatisUtil public class MybatisUtil { public static SqlSession getSqlSession(){ //加载配置文件 //String resource = ResourceUtils.getFile("classpath...1.数据库配置文件mybatis-config-only.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--先加载基础配置文件 主要是数据库参数--> <!--<properties resource="application.properties"/>--> <!--设置--> <settings> <!-- 全局映射器启用缓存 默认为false --> <setting name="cacheEnabled" value="true"/> <!-- 查询时,关闭关联对象即时加载以提高性能 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="false"/> <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 允许使用列标签代替列名 --> <setting name="useColumnLabel" value="true"/> <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="true"/> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 --> <setting name="autoMappingBehavior" value="FULL"/> <!-- 对于批量更新操作缓存SQL以提高性能 但是返回id有问题--> <setting name="defaultExecutorType" value="SIMPLE"/> <!-- 数据库超过36000秒仍未响应则超时 --> <setting name="defaultStatementTimeout" value="36000"/> <!-- 日志使用logback实现 --> <!--<setting name="logPrefix" value="mybatis-log."/>--> <!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <environments default="development"> <environment id="development"> <!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置--> <transactionManager type="JDBC"/> <!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://1.1.1.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <!--指定Mybatis SQL配置文件--> <mapper resource="com/produce/core/demo/mapper/xml/TestMapper.xml"/> </mappers> </configuration>
2.Java工具类MybatisUtil
public class MybatisUtil { public static SqlSession getSqlSession(){ //加载配置文件 //String resource = ResourceUtils.getFile("classpath:mybatis-config-only.xml").getPath(); //将配置文件读入字节流 SqlSession session = null; try (InputStream is = Resources.getResourceAsStream("mybatis-config-only.xml")){ //构建sqlSession工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); //获取sqlSession session = sqlSessionFactory.openSession(); } catch (IOException e) { e.printStackTrace(); } return session; } }
3.数据库操作
public void updateEmployeeInfo() { System.out.println("执行开始变更员工基本信息..."); //获取sqlSession SqlSession session = MybatisUtil.getSqlSession(); //Mybatis SQL地址 String statement = "com.produce.core.demo.mapper.TestMapper.selectEmployeeList"; String statement1 = "com.produce.core.demo.mapper.TestMapper.updateEmployeeInfo"; try{ //查询系统员工号集合 List<String> list = session.selectList(statement); for(int i=0;i<list.size();i++){ Map map = new HashMap(); map.put("empCode",list.get(i)); map.put("status","1"); //根据员工号,更新员工信息 session.update(statement1,map); //每更新一名员工,便手动提交一次事务 session.commit(true); } }catch (Exception e){ System.out.println("同步员工基本信息异常..."); e.printStackTrace(); }finally { session.close(); } System.out.println("执行完毕变更员工基本信息..."); }
-
java使用oracle数据库进行批量插入操作
2021-05-05 02:39:49Connection conn;Statement stat;ResultSet rs;ResultSetMetaData rsmd;...[color=red]/*** 插入数据库(批量)* */[/color]public int addShopInfoList(Listlist){try {//获取表名Properties info = new Pr...Connection conn;
Statement stat;
ResultSet rs;
ResultSetMetaData rsmd;
PreparedStatement pstat;
[color=red]/**
* 插入数据库(批量)
* */[/color]
public int addShopInfoList(Listlist){
try {
//获取表名
Properties info = new Properties();
info.load(new FileInputStream(new File("jdbc.properties")));
String table_name= info.getProperty("table_name");
System.out.println(table_name);
long start = System.currentTimeMillis();//开始时间
conn=JdbcUtil.getConnection();
conn.setAutoCommit(false);
String sql ="insert into "+table_name+" " +
"(shop_name,shop_url,area,phone,address,ev_num,bad_num,score,pt_name,fp," +
" open_date,city,sales,code,lon,lat,update_zt,img_zz_count,is_yyzz,is_xkz," +
" is_lhfj,csdj,gldj,jcrq,dwmc,xkzh,fddbr,jydz,ztyt,jyfw," +
" yxq,fl,img_url)" +
" values" +
"(?,?,?,?,?, ?,?,?,?,?," +
" ?,?,?,?,?, ?,?,?,?,?," +
" ?,?,?,?,?, ?,?,?,?,?," +
" ?,?,?)";
pstat= conn.prepareStatement(sql);
for (Shop_Info_Model shopInfoModel:list) {//批量添加
System.err.println(shopInfoModel.getShop_name());
//Map map=(Map) list.get(i);
//System.out.println(map);
pstat.setString(1, shopInfoModel.getShop_name());
pstat.setString(2, shopInfoModel.getShop_url());
pstat.setString(3, shopInfoModel.getArea());
pstat.setString(4, shopInfoModel.getPhone());
pstat.setString(5, shopInfoModel.getAddress());
pstat.setString(6, shopInfoModel.getEv_num());
pstat.setString(7, shopInfoModel.getBad_num());
pstat.setString(8, shopInfoModel.getScore());
pstat.setString(9, shopInfoModel.getPt_name());
pstat.setString(10, shopInfoModel.getFp());
pstat.setString(11, shopInfoModel.getOpen_date());
pstat.setString(12, shopInfoModel.getCity());
pstat.setString(13, shopInfoModel.getSales());
pstat.setString(14, shopInfoModel.getCode());
pstat.setString(15, shopInfoModel.getLon());
pstat.setString(16, shopInfoModel.getLat());
pstat.setString(17, shopInfoModel.getUpdate_zt());
pstat.setString(18, shopInfoModel.getImg_zz_count());
pstat.setString(19, shopInfoModel.getIs_yyzz());
pstat.setString(20, shopInfoModel.getIs_xkz());
pstat.setString(21, shopInfoModel.getIs_lhfj());
pstat.setString(22, shopInfoModel.getCsdj());
pstat.setString(23, shopInfoModel.getGldj());
pstat.setString(24, shopInfoModel.getJcrq());
pstat.setString(25, shopInfoModel.getDwmc());
pstat.setString(26, shopInfoModel.getXkzh());
pstat.setString(27, shopInfoModel.getFddbr());
pstat.setString(28, shopInfoModel.getJydz());
pstat.setString(29, shopInfoModel.getZtyt());
pstat.setString(30, shopInfoModel.getJyfw());
pstat.setString(31, shopInfoModel.getYxq());
pstat.setString(32, shopInfoModel.getFl());
pstat.setString(33, shopInfoModel.getImg_url());
pstat.addBatch();
}
pstat.executeBatch(); //批量执行预定义SQL
conn.commit();//提交事务
//pstat.close();
clojdbc(); //关闭连接
long end = System.currentTimeMillis();
System.out.println("批量插入需要时间:"+(end - start)); //批量插入需要时间:24675
return 1;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
[color=red]/**
* 关闭数据库
* */[/color]
public void clojdbc() {
try {
if (rs != null)
rs.close();
if (stat != null)
stat.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
-
关于SpringMyBatis纯注解事务不能提交的问题分析与解决
2018-10-15 09:29:28关于SpringMyBatis纯注解事务不能提交的问题分析与解决 -
MyBatis通过BATCH批量提交的方法
2021-02-27 10:36:41很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没有批量插入和批量更新的方法。实际上许多时候没必要用去实现特别复杂的批量操作。直接通过 MyBatis 的 BATCH 方式执行增删改方法即可。下面是一个批量用法的... -
mysql使用jdbc进行批量插入时把事务设为手动提交比事务自动提交速度快了10倍
2018-06-21 15:56:37今天需要对mysql做一个批量插入的操作,使用的是原生的jdbc对mysql进行操作,大约插入20几万条数据,刚开始事务是自动提交的,插完数据大约用了4分钟,后来把事务改为手动提交,插完数据用了20秒,时间相缩短了十倍... -
使用jdbcTemplate的批量手动提交事务处理
2019-06-01 12:01:29DAO` protected int[] batchExcute...//手动提交 jdbcTemplate.getDataSource().getConnection().setAutoCommit(true);//还原 如以上处理报错,可以考虑将getConnection()赋给一个conn变量,后续使用conn操作 -
MySQL事务提交和回滚演示
2021-02-28 06:36:21在java程序员编写程序的时候,会在数据库中涉及到事务的相关操作,在java中,事务就是指准备要做的或所做的事情,是对数据库进行统一的提交或回滚的操作。下面就来学习一下MySQL事务提交和回滚演示的知识,对MySQL... -
java事务以及批量更新
2018-09-11 20:13:13java事务以及批量更新 1.概念简介 事务是一步或多部数据库操作序列组成的逻辑单元,这系列操作要么全部执行,要么全部放弃执行。 2.注意 一个事务可以由一组DML组成或者一个DDL语句或者一个DCL语句。... -
Java多线程数据库事务提交控制
2021-08-28 20:43:44四、为多线程提交添加事务控制 总结 前言 公司业务中遇到一个需求,需要同时修改最多约5万条数据,而且还不支持批量或异步修改操作。循环操作耗时太长,为提高效率我进行了下面这个测试,具体操作如下: 一... -
Java中开启事务操做数据库
2021-03-17 19:40:321、事务的四大特性(ACID)html一、原子性(atomicity):组成...数组三、隔离性(isolcation):一个事务处理和另外一个事务处理相互间互不影响;多线程四、持续性(durability):事务处理的效果可以被永久保存下来。并发2... -
mybatis怎么处理事务问题
2021-03-13 20:40:01} /** * 批量更新 * @param str * @param obj * @return * @throws Exception */ public Object batchSave(String str, List objs){ return sqlSessionTemplate.insert(str, objs); } /** * 修改对象 * @param str ... -
Spring+Mybatis批量提交(batchUpdate)
2021-10-12 17:07:02目录Spring+Mybatis批量提交(batchUpdate)公共引入:SqlSessionFactory方式一:手动调动并提交方式二:自动调用并提交 提供两种批量提交方式,如有问题,欢迎网友随时指正 公共引入:SqlSessionFactory @Autowired ... -
Hibernate中Transaction事务的批量提交
2016-05-05 21:32:37Hibernate中Transaction事务的批量提交 -
Java中开启事务操作数据库
2021-02-04 17:08:25一、事务的四大特性(ACID)1、原子性(atomicity):组成事务的语句形成了一个逻辑单元,不能只执行一部分;2、一致性(consistency):在事务处理执行前后,数据库与理论值是一致的(数据库完整性约束);3、隔离性... -
多线程批量执行事务处理
2021-11-19 15:17:00背景:有个数据量很大的列表,需要插入,由于数据量过大,所以分批批量插入,然后这些插入没有关联性,所以使用多线程来执行,提高效率,但是如果其中某一次执行失败,需要整体回滚; 如下是核心代码: //批量插 ... -
Java如何在JDBC中提交或回滚事务?
2021-04-22 03:33:02由于无效数据,有时执行诸如插入,更新或删除之类的数据库操作命令可能会引发异常。为了保护我们的应用程序数据的完整性,我们必须确保在事务失败时必须回退所有已执行的命令,以便它影响数据的...importjava.sql.*... -
java事务回滚失败问题分析
2021-03-09 05:10:49Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。一切还是要从Java的检查型异常和非检查型异常说起。那么什么是检查... -
java表单批量删除操作核心代码,手动开启事务
2020-01-12 23:25:511 2 3 4 5 -
Java-JDBC-事务与设置回滚点
2021-03-21 08:16:56Java-JDBC-事务与设置回滚点事务能够保证SQL要么全部执行成功,要么全部执行失败JDBC 默认是自动提交事务每条DML都是默认提交事务的,多个preparedStatement.executeUpdate();都会提交一次事务如果想手动控制事务,那么... -
java 关于批量更新操作的实现
2021-01-19 03:05:48批量更新操作批量更新逻辑:底层真正的批量更新(一次请求发送批量更新语句)底层循环发送语句(假批量更新)—本质上就是一条一条更新批量更新逻辑判断JdbcTemplateJdbcUtils.supportsBatchUpdates(ps.getConnection())... -
手动提交事务和在for循环里进行事务控制及声明式事务的使用实例!
2018-04-04 17:30:45事务场景:需要做一个跑批进行一个流程的实现,0.获取异常数据(多条),for循环对单条数据进行下面三个操作:1).调用别的系统进行查询,2).查询自己的库中数据,3)更改自己数据库中的数据状态。此时就需要对单条... -
JDBC PreparedStatement和事务提交
2021-12-24 10:01:20代码的漏洞 通过1 'or '... } } 手动提交事务 批量删除TRUNCATE:删除磁盘文件,新建一个空表 默认情况下,mysql是不支持批处理,在jdbc批处理参数 打开批处理开关characterEncoding=utf8&useSSL=false&serverTimezone=UTC&... -
spring+mybatis 手动开启和提交事务
2017-05-30 10:55:00示例java代码 // 保存信息 public MessageTpl saveMessage(Map, Object> mqInfo, Message message) throws Exception{ // 保存信息 //获取Spring容器的对象 ClassPathXmlApplicationContext contextLoader... -
Java--SpringBoot使用@Transactional注解添加事务
2021-08-10 21:41:17一、Java事务 1、通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。 事务的...