zoukankan      html  css  js  c++  java
  • 利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题

    问题的描述:

    一个项目,涉及到了 两个数据源,分别使用的是 两个不同的 数据库连接池,其中一个是 poxool 连接池,问题在于,spring在启动时,只初始化其中的一个 数据库连接池中的数据库连接,而 poxool配置的数据库连接池,在启动时 没有进行初始化,一个数据库连接也没有初始化好,所以导致了首次需要 访问数据库时,临时需要进行数据库连接的初始化,导致了首次点击页面按钮时,如果是远程访问,最多需要15秒左右。

    一开始以为可以在 dataSource 这个bean 上使用属性 lazy-init = "false" 来搞定,其实默认就是 lazy-init="false",其实从 spring 的启动日志来看,poxool 对应的 dataSource已经实例化了,所以不是 dataSource 延迟初始化的问题,而是 dataSoruce 实例化了,但是其中的 数据库连接却没有初始化,所以这才是问题的根本原因。

    找到了原因,那么解决起来就容易了,我们知道 bean 有个属性: init-method ="someMethod",表示在实例化 bean的后期阶段,调用 该 bean 的 someMethod 方法。

    所以,我们查看 org.logicalcobwebs.proxool.ProxoolDataSource 的源码,找到他的初始化数据库连接的 方法,赋值该 init-method 属性就可以搞定了。源码如下:

        /**
         * @see javax.sql.DataSource#getConnection()
         */
        public Connection getConnection() throws SQLException {
    
            ConnectionPool cp = null;
            try {
                if (!ConnectionPoolManager.getInstance().isPoolExists(alias)) {
                    registerPool();
                }
                cp = ConnectionPoolManager.getInstance().getConnectionPool(alias);
                return cp.getConnection();
            } catch (ProxoolException e) {
                LOG.error("Problem getting connection", e);
                throw new SQLException(e.toString());
            }
        }
    

    很显然,getConnection 会触发了 org.logicalcobwebs.proxool.ProxoolDataSource 建立数据库连接。

    所以将 bean:

        <bean id="dataSource"
              class="org.logicalcobwebs.proxool.ProxoolDataSource">
    

    改为:

        <bean id="dataSource"
              class="org.logicalcobwebs.proxool.ProxoolDataSource" init-method="getConnection">
    

    就OK了,会强制 org.logicalcobwebs.proxool.ProxoolDataSource 在实例化时,立即调用 getConnection方法,立即初始化好数据库连接。

    避免直到第一次访问数据库时,才临时去初始化数据库连接池,从而导致的首次访问超级慢的问题。

    这样配置的话,会导致另一个小小的问题,启动时,会变慢一点,因为启动时,需要出事化两个数据库连接池中的数据库连接。

    关于 init-method的原理,可以参考我的另一篇博客:http://www.cnblogs.com/digdeep/p/4518571.html

  • 相关阅读:
    [算法] 堆栈
    [刷题] PTA 02-线性结构3 Reversing Linked List
    java IO流 (八) RandomAccessFile的使用
    java IO流 (七) 对象流的使用
    java IO流 (六) 其它的流的使用
    java IO流 (五) 转换流的使用 以及编码集
    java IO流 (四) 缓冲流的使用
    java IO流 (三) 节点流(或文件流)
    java IO流 (二) IO流概述
    java IO流 (一) File类的使用
  • 原文地址:https://www.cnblogs.com/digdeep/p/5423004.html
Copyright © 2011-2022 走看看