JDBC -- 批处理 & ThreadLocal

(1) 批处理:一个批次的数据库操作。这一个批次中可以包含任意条数的SQL语句。
(2) 业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。

	public class TestBatch {
		@Test
		public void testBatch() throws SQLException {
	
			long start = System.currentTimeMillis();
			Connection conn = JDBCUtil.getConnection();
			String sql = "insert into t_batch(id,content) values (?,?)";
			PreparedStatement pstmt = conn.prepareStatement(sql);
	
			// 设置参数
			for (int i = 1; i <= 1000; i++) {
				pstmt.setString(1, "id_" + i);
				pstmt.setString(2, "content_" + i);
				//添加到批处理中,不执行数据库
				pstmt.addBatch();
			}
			
			//执行批处理,执行数据库操作(一次)
			int[] counts = pstmt.executeBatch();
			long end = System.currentTimeMillis();
			System.out.println(end - start);
			System.out.println(counts.length); 
		}
	}

JDBC – ThreadLocal
(1) ThreadLocal,叫做线程本地变量,也叫做线程本地存储。
(2) ThreadLocal在每个线程中对该变量会创建一个副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。
(3) ThreadLocal类提供的几个方法:
public T get() { } : 用来获取ThreadLocal在当前线程中保存的变量副本;
public void set(T value) { } :用来设置当前线程中变量的副本;
public void remove() { } :用来移除当前线程中变量的副本;
protected T initialValue() { } :一般是用来在使用时进行重写的,它是一个延迟加载方法。

    	//提供一个线程局部变量(私有、静态)
    	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
    	/**
    	 * 获得数据库连接
    	 * @return 连接对象
    	 */
    	public static Connection getConnection() {
    		Connection conn = null;
    		try {
    			//先在本地线程中获取连接对象
    			conn = threadLocal.get();
    			if(null == conn) {
    				//如果conn在本地线程局部变量中不存在,就创建conn
    				conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    				//创建之后,将conn连接对象存入线程的局部变量中
    				threadLocal.set(conn);
    			}
    			return conn;
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
   		 }	

猜你喜欢

转载自blog.csdn.net/Spectre_win/article/details/89086968