• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > tomcat-dbcp数据库连接池配置以及使用时候的一些坑

tomcat-dbcp数据库连接池配置以及使用时候的一些坑

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了tomcat-dbcp,数据库,池配置等相关知识,希望本文的分享对您有所帮助

一、数据库连接池

开发的时候经常会需要对数据库进行一些操作,比如说常见的增删改查之类的,当数据量小的时候,可以直接进行操作,但是当数据量增多的时候,每一次连接以及释放数据库都会耗费一定的时间,这个时候,可以采用数据库连接池来保持数据库的链接,减少连接数据库对程序带来的开销,并且可以减少数据库的压力,那么数据库链接池是一个什么样的东西呢?顾名思义,它是一个池子,池子里放的是对数据库的链接,打个比方鱼塘,就是养鱼的池子,想要吃鱼可以直接去捞,不用自己去亲自的买鱼苗养鱼等,数据库连接池就是放的对于数据库的链接,统一的把所有的链接都给建立好了,用的时候就可以直接的从里面去取,用完了之后放回池子里就可以,既然用这个东西,那么我们也没必要完全自己去写代码实现,有些开源的可以直接用,常见的有三种开源的连接池,c3p0,dbcp,proxool这三种,对于c3p0、proxool这两种没用过,只是简单的用过dbcp的池子,在此讲下如何使用dbcp数据库连接池,以及使用的时候遇到的一些坑

图1、使用连接池之前



图2 使用连接池之后

如上图1所示,在使用连接池之前,需要每次都对数据库建立链接,并且需要随时进行释放,在数据量大的情况下,需要很大的连接数据库的开销,并且频繁的对数据库进行访问以及释放,也会对数据库造成很大的压力,图2为使用数据库连接池之后,将所有的链接放在池子里,不进行释放,当用的时候直接从池子里去取,用完之后放回池子里,池子保持对数据库的长链接,链接断开会进行自动重连,如果连接不够那么对应后来的用户就需要进行等待

二、使用tomcat-dbcp所使用的jar包

包含tomcat-dbcp.jar即可,剩下的都是一些基础包

三、所使用的配置

dbname.Driver=com.mysql.jdbc.Driver
dbname.Url=jdbc:mysql://<your ip>/<your dbname>?useUnicode=true&characterEncoding=UTF-8
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&autoReconnectForPools=true&zeroDateTimeBehavior=convertToNull&connectTimeout=3000
dbname.Username=<your username>
dbname.Password=<your password>
dbname.InitialSize=15
dbname.MinIdle=10
dbname.MaxIdle=20
dbname.MaxWait=5000
dbname.MaxActive=20
dbname.validationQuery=select 1

其中这些配置只需要放在<yourname>.properties里面即可,关于每一个的意义


其中driver,url,username,password为常见的数据库连接的配置


InitialSize为初始化建立的连接数
minidle为数据库连接池中保持的最少的空闲的链接数
maxidle数据库连接池中保持的最大的连接数
maxwait等待数据库连接池分配连接的最长时间,超出之后报错
maxactivite最大的活动链接数,如果是多线程可以设置为超出多线程个数个链接数
<pre name="code" class="java">validationQuery测试是否连接是有效的sql语句

三、连接池代码

public abstract class DB {

    private static HashMap<String, DataSource> dsTable = new HashMap<String, DataSource>();//此处记得用static
    private BasicDataSource ds;
    private PreparedStatement stmt = null;

    private DataSource getDataSource(String n) {
        if (dsTable.containsKey(n)) {
            return dsTable.get(n);//如果不同的数据库,多个连接池
        } else {
        	synchronized (dsTable) {
        		ds = new BasicDataSource();
                ds.setDriverClassName(DBConfig.getString("db", n.concat(".Driver")));//将<yourname>.properties的值读进来
                ds.setUrl(DBConfig.getString("db", n.concat(".Url")));
                ds.setUsername(DBConfig.getString("db", n.concat(".Username")));
                ds.setPassword(DBConfig.getString("db", n.concat(".Password")));
                ds.setInitialSize(DBConfig.getInteger("db", n.concat(".InitialSize")));
                ds.setMinIdle(DBConfig.getInteger("db", n.concat(".MinIdle")));
                ds.setMaxIdle(DBConfig.getInteger("db", n.concat(".MaxIdle")));
                ds.setMaxWait(DBConfig.getInteger("db", n.concat(".MaxWait")));
                ds.setMaxActive(DBConfig.getInteger("db", n.concat(".MaxActive")));
                ds.setValidationQuery(DBConfig.getString("db", n.concat(".validationQuery")));
                dsTable.put(n, ds);

                return ds;
			}
        }
    }

    protected Connection conn;

    public boolean open() throws SQLException {
    	BasicDataSource bds=(BasicDataSource)this.getDataSource(this.getConnectionName());
    	System.out.println("connection_number:"+bds.getNumActive()+"dsTable:"+dsTable);
        this.conn = this.getDataSource(this.getConnectionName()).getConnection();
        return true;
    }

    public void close() throws SQLException {
    	
        if (this.conn != null)
            this.conn.close();
    }

    protected abstract String getConnectionName();//此函数可以根据自己的需求,将数据库的名字传进来即可

    public void prepareStatement(String sql) throws SQLException {
        this.stmt = this.conn.prepareStatement(sql);
    }

    public void setObject(int index, Object value, int type) throws SQLException {
        this.stmt.setObject(index, value, type);
    }

    public void setObject(int index, Object value) throws SQLException {
        this.stmt.setObject(index, value);
    }

    public int execute() throws SQLException {
        return this.stmt.executeUpdate();
    }
}

上述是线程池使用的时候所用到的代码,只是给出了大概的写法,具体的DBDAO部分需要根据自己的需求去自己实现,比如批处理,查询,更新等函数,可以根据个人的需求去进行修改,那么如何判断你所创建的链接是你想要的呢?有两种办法可以检验

1、建立一个空的数据库,查看链接个数

2、在linux下面查看链接个数

得到processid

ps aux|grep <your java name>

查看链接数据库的链接

netstat -apn|grep <your processid>

可以看到具体的链接的个数,用来检验是否你的链接池是正确的


四、遇到的一些坑

因为使用的时候是多线程形式使用的,遇到的最主要的一个坑就是static的用法,因为不是太熟,没用static,导致了每个线程都建立了一个数据库连接池,出现了一个“too many files open”的错误,这就是因为线程池那边没用static所导致的。

以上就是tomcat-dbcp数据库连接池配置以及使用时候的一些坑的内容,更多相关内容请关注微课江湖()!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • tomcat-dbcp数据库连接池配置以及使用时候的一些坑

相关文章

  • 2018-12-05SQL SERVER 数据类型详解补充2
  • 2018-12-05mysql 常用数据库语句 小练习
  • 2018-12-05mysql5.7.19(tar.gz)在linux下安装图文教程详解
  • 2018-12-05最新更新的6篇内容推荐
  • 2018-12-05有关步骤分享的文章推荐10篇
  • 2018-12-05sql server中datetime字段去除时间的语句
  • 2018-12-05浅谈mysql可有类似oracle的nvl的函数的详情
  • 2017-05-11mysql中提高Order by语句查询效率的两个思路分析
  • 2018-12-05php 处理数组和XML之间的互相转换实例代码
  • 2018-12-05微软azure的mysql database服务器怎么修改系统时间呢

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • mysql增删改查--CURD操作
    • 从两种SQL表连接写法来了解过去
    • 汇总整理MYSQL相关操作命令
    • Python怎么统计字母出现的次数
    • sqlserver 数据库学习笔记
    • MySQL数据库如何导入dbf格式数据?
    • mysql的安装信息如何在linux服务器下查看(图)
    • 详解MySQL中UNION的用法
    • Mysql中的触发器简单介绍及使用案例
    • sysbench对mysql压力测试的详细教程_MySQL

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有