最近优化代码,发现第一次调用数据库连接时非常慢,往后便不再发生。经了解,数据库连接是用dbcp管理的,想在网上查找答案,但没有找到。在某人的提醒下决定研究源代码:

部分源代码如下(BasicDataSource.java):

protected volatile DataSource dataSource = null;  

public Connection getConnection() throws SQLException {
return createDataSource().getConnection();
} protected synchronized DataSource createDataSource()
throws SQLException {
if (closed) {
throw new SQLException("Data source is closed");
} // Return the pool if we have already created it
if (dataSource != null) {
return (dataSource);
} // create factory which returns raw physical connections
ConnectionFactory driverConnectionFactory = createConnectionFactory(); // create a pool for our connections
createConnectionPool(); // Set up statement pool, if desired
GenericKeyedObjectPoolFactory statementPoolFactory = null;
if (isPoolPreparedStatements()) {
statementPoolFactory = new GenericKeyedObjectPoolFactory(null,
-1, // unlimited maxActive (per key)
GenericKeyedObjectPool.WHEN_EXHAUSTED_FAIL,
0, // maxWait
1, // maxIdle (per key)
maxOpenPreparedStatements);
} // Set up the poolable connection factory
createPoolableConnectionFactory(driverConnectionFactory, statementPoolFactory, abandonedConfig); // Create and return the pooling data source to manage the connections
createDataSourceInstance(); try {
for (int i = 0 ; i < initialSize ; i++) {
connectionPool.addObject();
}
} catch (Exception e) {
throw new SQLNestedException("Error preloading the connection pool", e);
} return dataSource;
}

当我第一次们调用BasicDataSource的getConnection()方法时,需要先调用createDataSource()方法,该方法内有下面这一句:

// Return the pool if we have already created it
if (dataSource != null) {
return (dataSource);
}

而默认的dataSource是null

protected volatile DataSource dataSource = null; 

所以,第一次调用getConnection()方法时,需要先创建dataSource实例,这个实例的创建非常费时间,就导致了我开始说的第一次调用数据库连接非常慢的问题了。那么该如何解决这个问题呢?

笔者想了两个方法,思路都是一样的,都是要在调用连接之前初始化好dataSource这个实例:

第一种,在调用连接之前先获取连接,然后将这个连接关掉,这样,就执行了dataSource的实例化;

第二种,写一个BasicDataSource的子类,用于代替BasicDataSource

public class BasicDataSourceSub extends BasicDataSource
{
public synchronized DataSource createDataSource()
{
try
{
return super.createDataSource();
}
catch (SQLException e)
{
throw new RuntimeException();
}
}
}

将原来protected synchronized DataSource createDataSource()方法变为共有的,在设置完dbcp的属性后执行这个方法,也会让dataSource实例化。

以上就是我对dbcp第一次获取连接时间的相关经验,如有不到之处,还请大家多多指教。

dbcp第一次获取连接的时间问题的更多相关文章

  1. DBCP 数据源获取连接

    Main package p1; import com.JdbcUtils; import org.apache.commons.dbcp.BasicDataSource; import org.ap ...

  2. 连接字符串中Min Pool Size的理解是错误,超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

    Min Pool Size的理解是错误的 假设我们在一个ASP.NET应用程序的连接字符串中将Min Pool Size设置为30: <add name="cnblogs" ...

  3. System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

    2017/8/15 20:55:21 [AgentPayQuery_205506102_1BBBB]系统异常:System.Data.Entity.Core.EntityException: The ...

  4. [bug]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

    引言 自己弄了一个小项目——日程管理系统,在初始化日期时,查询了数据库,每个日期就会查询一次数据库,就导致了这个问题. 问题 出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. Desc ...

  5. 【Java】java数据库连接中C3P、DBCP、Druid连接池的使用

    使用JDBC的步骤:1.加载数据库驱动2.通过DriverManager获得数据库连接3.通过Connection获得Statement对象4.使用Statement执行SQL语句.5.操作结果集合6 ...

  6. HTML5的学习--performance获取加载时间的工具

    前段时间因为项目需要获取页面加载的时间,就去看了下HTML5中的performane. 可以用其获得页面详细的加载时间. 关于performance的详细内容可以查看 http://www.cnblo ...

  7. c3p0获取连接Connection后的Close()---释疑

    论题: java c3p0获取连接Connnection 之后, 调用 con.close( ) 是否真的关闭了物理连接 ? 简答: c3p0采用连接池, 目的就是提前预置一定数量的连接, 在使用时候 ...

  8. httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接

    PoolingHttpClientConnectionManager是一个HttpClientConnection的连接池,可以为多线程提供并发请求服务.主要作用就是分配连接,回收连接等.同一个rou ...

  9. 转 HttpClient 设置连接超时时间

    要: HttpClient 4.5版本升级后,设置超时时间的API又有新的变化,请大家关注. HttpClient升级到4.5版本后,API有很多变化,HttpClient 4之后,API一直没有太稳 ...

随机推荐

  1. Nop常用知识点

    1.列表标题与内容均居中对齐,列中配置为: headerAttributes: { style: "text-align:center" }, attributes: { styl ...

  2. 《算法》第四章部分程序 part 19

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,有边权有向图的邻接矩阵,FloydWarshall 算法可能含负环的有边权有向图任意两点之间的最短路径 ● 有边权有向图的邻接矩阵 package p ...

  3. FreeMarker生成Word文档

    FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ...

  4. 使用Shiro登录成功后,跳转到之前访问的页面实现

    转:http://blog.csdn.net/lhacker/article/details/20450855 很多时候,我们需要做到,当用户登录成功后,跳转回登录前的页面.如果用户是点击" ...

  5. node.js 发送邮件

    var nodemailer = require('nodemailer'); var smtpTransport = require('nodemailer-smtp-transport'); // ...

  6. git 配置提交过滤文件

    1)在Git项目中定义.gitignore文件 2)在Git项目的设置中指定排除文件 3)定义Git全局的 .gitignore 文件

  7. vue 踩坑-事件修饰符

    (1).stop // 阻止事件继续传播 即阻止冒泡过程 (2).prevent //阻止默认事件发生 即event.preventdefault(): 实例: 阻止了a标签的默认刷新 (3).cap ...

  8. 把网卡中断绑定到CPU,最大化网卡的吞吐量(转)

    先来看一下问题, 我们通过 ifconfig 查看接口的名称 为 p15p1, 一般机器为 eth0 再通过命令 ➜ ~ cat /proc/interrupts | head -n 1 && ...

  9. debian下redis2.8.17安装过程

    下载redis源码包,我下载的是redis2.8.17 解压缩该源码包 tar zxf redis-2.8.17.tar.gz 进入解压缩后的目录 cd redis-2.8.17/ 添加redis用户 ...

  10. Linux date命令使用方法

    date命令用来显示或设定以及计算系统的日期和时间.本文主要描述date命令的基本语法和工作中常用的使用方法. date命令语法 用法:date [OPTION]... [+FORMAT] 常用参数: ...