多线程_10_ThreadLocal案例之JDBC

转载 2016年08月21日 11:07:04

引用:

http://my.oschina.net/huangyong/blog/159725

http://www.iteye.com/topic/103804

/*
 ThreadLocal
 它就是一个容器,用于存放线程的局部变量,我认为应该叫做 ThreadLocalVariable(线程局部变量)才对,
 真不理解为什么当初 Sun 公司的工程师这样命名。
 早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,
 它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用
 可以解决同步抢占资源的问题
 ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了线程保持对象的方法和避免参数传递的方便的对象访问方式 
 ThreadLocal的应用场合,最适合的是按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。 
 */
public class DBUtil {
	// 数据库配置
	private static final String driver = "com.mysql.jdbc.Driver";
	private static final String url = "jdbc:mysql://localhost:3306/test";
	private static final String username = "root";
	private static final String password = "root";

	// 定义一个用于放置数据库连接的局部线程变量(使每个线程都拥有自己的连接)
	private static ThreadLocal<Connection> connContainer = new ThreadLocal<Connection>();

	// 获取连接
	public static Connection getConnection() {
		Connection conn = connContainer.get();
		try {
			if (conn == null) {
				Class.forName(driver);
				conn = DriverManager.getConnection(url, username, password);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			connContainer.set(conn);
		}
		return conn;
	}

	// 关闭连接
	public static void closeConnection() {
		Connection conn = connContainer.get();
		try {
			if (conn != null) {
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			connContainer.remove();
		}
	}
}


public interface PersonService {
	  void updatePerson(long personId, String personName);
}


public class PersonServiceImpl implements PersonService{
	private static final String UPDATE_PERSON_SQL = "update person set name = ? where id = ?";
	private static final String INSERT_LOG_SQL = "insert into person_log (created, description) values (?, ?)";
	@Override
	public void updatePerson(long personId, String personName) {
		try {
			// 获取连接
			Connection conn = DBUtil.getConnection();
			conn.setAutoCommit(false); // 关闭自动提交事务(开启事务)

			// 执行操作
			updatePerson(conn,  UPDATE_PERSON_SQL,  personName, personId); // 更新PERSON
			insertLog(conn, INSERT_LOG_SQL, "Create product."); // 插入日志

			// 提交事务
			conn.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭连接
			DBUtil.closeConnection();
		}
	}

	private void updatePerson(Connection conn, String updateProductSQL,
			 String personName,long personId )throws Exception {
		PreparedStatement pstmt = conn.prepareStatement(updateProductSQL);
		pstmt.setString(1, personName);
		pstmt.setLong(2, personId);
		int rows = pstmt.executeUpdate();
		if (rows != 0) {
			System.out.println("Update product success!");
		}
	}

	private void insertLog(Connection conn, String insertLogSQL,
			String logDescription) throws Exception {
		PreparedStatement pstmt = conn.prepareStatement(insertLogSQL);
		pstmt.setString(1, UUID.randomUUID().toString());
		pstmt.setString(2, logDescription);
		int rows = pstmt.executeUpdate();
		if (rows != 0) {
			System.out.println("Insert log success!");
		}
	}
	
	public static void main(String[] args) {
		 for (int i = 0; i < 140; i++) {
			    PersonService personService = (PersonService) new PersonServiceImpl();
		        ClientThread thread = new ClientThread(personService);
		        thread.start();
		    }
		 /**
	    PersonService personService = (PersonService) new PersonServiceImpl();
	    personService.updatePerson(1, "test");*/
	}
	@Test
	public  void threadTest(String[] args) {
	   
	}
	
}


相关文章推荐

jdbc操作 数据库同步,全量,加入线程,批处理

数据库的全量同步,多线程增加性能,批处理。 数据库一次整体同步。
  • Gooooa
  • Gooooa
  • 2017年01月19日 13:56
  • 1312

java jdbc线程池的使用

好久没直接使用jdbc了,今天重温了一下相关知识,并对连接池的使用写了简单的示例,记录在此以便需要的同行参考和方便自己查阅,不足之处欢迎批评指正。 1、dbcp数据源 所需jar包 dbcp:连接池的...

大量数据情况下单线程插入和多线程insert数据库的性能测试

大量数据情况下单线程插入和多线程insert数据库的性能测试   之前一直没有遇到过大批量数据入库的场景,所以一直没有思考过在大量数据的情况下单线程插入和多线程插入的性能情况。今天在看一个...

【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源

线程安全一直是程序猿们关注的焦点,多线程也一直是比较让人头疼的话题,想必大家曾经也遇到过各种各种的问题,我就不再累述了。当然,解决方式也有很多,这篇博文给大家提供一种很好的解决线程安全问题的思路。 。...

JAVA多线程实现的三种方式

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没...
  • aboy123
  • aboy123
  • 2014年07月31日 18:34
  • 422243

【Java技术点滴】——ThreadLocal封装JDBC事务操作

背景     在Java程序实现中,我们往往应用到事务的机制,在业务层进行事务开启,创建数据库连接,调用Dao层方法进行数据库访问,过程中需要将数据库连接Connection作为参数传递给Dao层方法...

Connection实例是线程安全的吗

关于JDBC中关于Connection的两个疑问:   1.Connection实例是线程安全的吗?     即一个connection实例,在多线程环境中是否可以确保数据操作是安全...
  • xwq911
  • xwq911
  • 2015年10月15日 11:13
  • 2222

java jdbc正确使用transaction 线程安全的TransactionManager

关于如何正确使用jdbc的transaction的问题,我想了很久,直接看到以下这篇文章, http://www.cnblogs.com/CloudTeng/archive/2013/02/23/29...

JDBC多线程访问数据库获取结果集的问题

有时候有多个线程需要访问JDBC,执行SQL语句并获取到该语句的执行结果,在写这个执行SQL方法的时候就比较麻烦。因为使用的地方需要用到一个ResultSet,而这些数据库连接都必须关闭,关闭的最佳顺...
  • goalwp
  • goalwp
  • 2011年11月23日 20:32
  • 1693

Java多线程10:ThreadLocal的作用及使用

ThreadLocal的作用 从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程_10_ThreadLocal案例之JDBC
举报原因:
原因补充:

(最多只允许输入30个字)