ThreadLocal 在面试中经常提到,关于ThreadLocal使用不当造成OOM以及在特殊场景下,通过ThreadLocal可以轻松实现一些看起来复杂的功能,都说明值得花时间研究其原理。
ThreadLocal 不是 Thread,是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,对数据存储后,只有在线程中才可以获取到存储的数据,对于其他线程来说是无法获取到数据。可能这才是Local的真正含义吧。
依旧用的三层架构
下面开始贴代码:
AccountDaoImpl.java
package bank.dao.impl;
import bank.dao.AccountDao;
import bank.util.Account;
import bank.util.JDBCUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.sql.Connection;
import java.sql.SQLException;
import static bank.util.JDBCUtil.getConnection;
public class AccountDaoImpl implements AccountDao {
@Override
public Account queryAccountByCard(int cardId) throws SQLException {
QueryRunner runner = new QueryRunner();
Connection conn = getConnection();
//手工提交 QueryRunner();无参 query加connection
Object[] params={cardId};
Account account =runner.query(conn,"select * from account where cardid =?",new BeanHandler<Account>(Account.class),params);
return account;
}
@Override
public void updateAccount(Account account) throws SQLException {
QueryRunner runner = new Q