我是靠谱客的博主 飘逸钻石,最近开发中收集的这篇文章主要介绍浅谈Spring事物管理,实现百万数据插入MySQL数据库30秒内,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

事物的定义:用于保证数据的完整性和一致性的事件

事物的四大特性:

ACID, 原子性(Atomicity, 一致性(Consistency, 隔离性(Isolation, 持久性(Durability

原子性(Atomicity

事务是一个原子操作,不可以拆分。事务的原子性确保动作要么全部完成,要么完全不起作用

一致性(Consistency

一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏

隔离性(Isolation

可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

持久性(Durability

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

 

事物的实现方式:

1、编程式事物      2、声明式事物    

声明式事物的实现方式

  1. 基于 TransactionProxyFactoryBean的声明式事务管理
  2. 基于 @Transactional 的声明式事务管理
  3. 基于Aspectj AOP声明式事务管理

下面我们主要了解编程式事物,基于 @Transactional 的声明式事务管理,基于Aspectj AOP声明式事务管理这三种事物管理

编程式事物的实现,原生jdbc

核心代码
 

//关闭自动提交
conn.setAutoCommit(false);
//提交事物
conn.commit(); 
//回滚事物
conn.rollback();

完整实例代码,可以实现500万数据在2分钟内插入数据库

  /**
	        * 利用事物和批处理实现100完数据30秒内完成
	        */
	      @org.junit.Test
	      public void Test(){
	         Connection conn = null;
	         PreparedStatement pstm =null;
	         long time1=System.currentTimeMillis();
	          try {
	             conn=getConnection();  
	             String sql = "insert into info(username,sex,age) VALUES(?,?,?)";
	             pstm = (PreparedStatement) conn.prepareStatement(sql);
	             conn.setAutoCommit(false);
	            for (int i = 1; i <= 1000000; i++) {
	            	String names[]={"张三","李四","Lily","露西","Jack","小明"};
	            	int ss=(int) (Math.random()*6);
	            	 pstm.setString(1, names[ss]);
	            		String sexs[]={"男","女"};
		            	int kk=(int) (Math.random()*2);
		            	pstm.setString(2, names[ss]);
		            	pstm.setInt(3,(int) (Math.random()*100));
	                    pstm.addBatch();
	             }
	             pstm.executeBatch();
	            conn.commit(); 
	         } catch (Exception e) {
					try {
						conn.rollback();
					} catch (SQLException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
	        }finally{
	        	conClose(conn, pstm, null);
	         }
	          long time2=System.currentTimeMillis();
	          System.out.println("插入数据库耗时"+(time2-time1)/1000);
	     }
	
	      
	      
	      
	      
	    /**
	     * 关闭数据库连接 
	     * @param conn
	     * @param ps
	     * @param rs
	     */
	    public  void conClose(Connection conn,Statement ps,ResultSet rs){
		    	try{
			    	if(rs!=null){
			    		rs.close();
			    	}
			    	if(ps!=null){
			    		ps.close();	
			    	if(conn!=null){
			    		conn.close();
			    		}
			    	}
		    	}catch (SQLException e) {
					System.out.println(e.getMessage());
				}
	    }  
	    
	    
	    /**
	     * 获取数据库连接
	     * @return
	     */
	    public Connection  getConnection(){
	    	Connection conn =null;
	    	try {
				  String url = "jdbc:mysql://localhost:3306/test2?characterEncoding=utf-8&useSSL=true&rewriteBatchedStatements=true";
		      String user = "liuhong";
		      String password = "liuhong987";
		      Class.forName("com.mysql.jdbc.Driver");
		      conn = (Connection) DriverManager.getConnection(url, user, password);  
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
	    	return conn;
	    }
	    
	    

@Transactional 的声明式事务管理

	@Transactional
	public int  batchInsert(){
		List<Object[]> infoList=getInfoList();
		long time1 = System.currentTimeMillis();
		int result=infoDao.addBatchStudent(infoList);
		long time2 = System.currentTimeMillis();
		System.out.println("插入数据库耗时"+(time2-time1));
		return result;	
	}
	

 

最后

以上就是飘逸钻石为你收集整理的浅谈Spring事物管理,实现百万数据插入MySQL数据库30秒内的全部内容,希望文章能够帮你解决浅谈Spring事物管理,实现百万数据插入MySQL数据库30秒内所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部