美文网首页
从零写一个Java WEB框架(三)Dao层优化

从零写一个Java WEB框架(三)Dao层优化

作者: 蓝汝丶琪 | 来源:发表于2018-06-13 20:07 被阅读83次
    • 该系列,其实是对《架构探险》这本书的实践。本人想记录自己的学习心得所写下的。
    • 从一个简单的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方法。因为连接用完不需要关闭,继续放在线程池里。

    相关文章

      网友评论

          本文标题:从零写一个Java WEB框架(三)Dao层优化

          本文链接:https://www.haomeiwen.com/subject/tfsseftx.html