- 该系列,其实是对《架构探险》这本书的实践。本人想记录自己的学习心得所写下的。
- 从一个简单的Servlet项目开始起步。对每一层进行优化,然后形成一个轻量级的框架。
- 每一篇,都是针对项目的不足点进行优化的。
- 项目已放上github
本篇
- 由于上篇对数据库的操作分到了Dao层,所以这一篇就针对Dao层进行一个优化。
- 本篇完成后,接下来就可以开始架构的演进了。想想都(≧▽≦)/激动
代码实现
由于Dao层每次获取Connection都要和数据库重写建立一个连接,用完后就销毁。导致 连接的创建和销毁 消耗了大量的资源,而且如果请求多了,数据库连接就不够用了。这就是性能上的瓶颈了。
解决办法:
- 从使用apache的dbcp2数据库。管理数据库的连接
- 为了线程安全以及保证一个线程只会使用一个连接,使用Threadload来获取连接。
代码实现:
DatabaseUtil 层的部分修改代码
public class DatabaseUtil {
// 利用Apache的一个工具库DbUtils 对JDBC的封装
private static final QueryRunner QUERY_RUNNER = new QueryRunner();
// 线程池
private static final BasicDataSource DATA_SOURCE;
// 用ThreadLoad 用来存放一个线程的Connection,保证线程隔离
private static final ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
private static final Logger logger = LoggerFactory.getLogger(DatabaseUtil.class);
static{
System.out.println("配置加载");
Properties conf = PropsUtil.loadProps("config.properties");
String driver = conf.getProperty("jdbc.driver");
String url = conf.getProperty("jdbc.url");
String username = conf.getProperty("jdbc.username");
String password = conf.getProperty("jdbc.password");
DATA_SOURCE = new BasicDataSource();
DATA_SOURCE.setDriverClassName(driver);
DATA_SOURCE.setUrl(url);
DATA_SOURCE.setUsername(username);
DATA_SOURCE.setPassword(password);
}
public static Connection getConnection() {
Connection connection = null;
connection=threadLocal.get();
if (connection == null) {
try {
connection = DATA_SOURCE.getConnection();
} catch (SQLException e) {
logger.error("获取连接失败", e);
e.printStackTrace();
}finally {
threadLocal.set(connection);
}
}
return connection;
}
- 首先声明了 ** BasicDataSource DATA_SOURCE **线程池。并对其配置。
- 然后重写了getConnection方法 。如果ThreadLoad 里没有连接,那么就重线程池里获取连线。保证一个线程只有一个连接。
- 删除了close方法。因为连接用完不需要关闭,继续放在线程池里。
网友评论