一、数据库连接池

开发的时候经常会需要对数据库进行一些操作,比如说常见的增删改查之类的,当数据量小的时候,可以直接进行操作,但是当数据量增多的时候,每一次连接以及释放数据库都会耗费一定的时间,这个时候,可以采用数据库连接池来保持数据库的链接,减少连接数据库对程序带来的开销,并且可以减少数据库的压力,那么数据库链接池是一个什么样的东西呢?顾名思义,它是一个池子,池子里放的是对数据库的链接,打个比方鱼塘,就是养鱼的池子,想要吃鱼可以直接去捞,不用自己去亲自的买鱼苗养鱼等,数据库连接池就是放的对于数据库的链接,统一的把所有的链接都给建立好了,用的时候就可以直接的从里面去取,用完了之后放回池子里就可以,既然用这个东西,那么我们也没必要完全自己去写代码实现,有些开源的可以直接用,常见的有三种开源的连接池,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最大的活动链接数,如果是多线程可以设置为超出多线程个数个链接数
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数据库连接池配置以及使用时候的一些坑的更多相关文章

  1. Tomcat数据库连接池配置

    Tomcat数据库连接池配置 1.            Server.xml的配置 (1)找到tomcat所在目录下的conf\server.xml文件 (2)在文件最后一个</host> ...

  2. 【Java】java数据库连接池配置的几种方法

    今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下面建文件夹META- ...

  3. Tomcat 与 数据库连接池 的小坑

    连接池的优点众所周知. 我们可以自己实现数据库连接池,也可引入实现数据库连接池的jar包,按要求进行配置后直接使用. 关于这方面的资料,好多dalao博客上记录的都是旧版本Tomcat的配置方式,很可 ...

  4. 【Java EE 学习 16 上】【dbcp数据库连接池】【c3p0数据库连接池】

    一.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: package day16.utils; import java.io.IOException; import java.lang.ref ...

  5. Tomcat6.0数据库连接池配置

    http://blog.163.com/magicc_love/blog/static/185853662201111101130969/ oracle驱动包Tomcat 6.0配置oracle数据库 ...

  6. Tomcat 动态数据库连接池

    package com.boguan.bte.util; import java.sql.Connection;import java.sql.SQLException;import java.uti ...

  7. 数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前

    数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前

  8. 一次项目实践中DBCP数据库连接池性能优化

    关于数据库连接池DBCP的关注源于刚刚结束的一轮测试,测试内容是衡量某Webserver服务创建用户接口的性能.这是一款典型的tomcat应用,使用的测试工具是Grinder.DBCP作为tomcat ...

  9. DBCP数据库连接池原理分析

    在比较大的项目中,需要不断的从数据库中获取数据,Java中则使用JDBC连接数据库,但是获取数据库的连接可是相当耗时的操作,每次连接数据库都获得 .销毁数据库连接,将是很大的一个开销.为了解决这种开销 ...

随机推荐

  1. spring @Async 线程池使用

    最近公司项目正逐渐从dubbo向springCloud转型,在本次新开发的需求中,全部使用springcloud进行,在使用时线程池,考虑使用spring封装的线程池,现将本次使用心得及内容记录下来 ...

  2. Selenium辅助工具

    下载Firefox39.0版本浏览器,安装firebug和FirePath.最新版的Firefox在扩展组件中无法找到firebug,可以使用旧的版本的Firefox浏览器. FirePath插件的使 ...

  3. Charles设置可抓https的包

    一.help 二.proxy

  4. Python之路Python文件操作

    Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...

  5. promise思考

    我写了三个单元块,分别对应三种业务场景 let query;query = (url) => { url=url||"传递的参数为空"; return new Promise ...

  6. Linux管理命令

    管理命令 用户管理: useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage 组管理: groupadd, groupdel, ...

  7. 获取当前按钮或者html的ID名称

    今天做的上传图片,点击图片删除. 随机给图片id,获取图片id,然后删除图片. 由于图片id是随机的,用点击img或者点击class,获取id都不行,最后用onclick事件获取. js代码如下: $ ...

  8. 20165224 陆艺杰 Exp5 MSF基础应用

    用自己的话解释什么是exploit,payload,encode Exploit是攻击的行为 Payload是一段植入目标机的简短的带功能的恶意代码 Encode是编码,用于更改恶意代码,编码特征码检 ...

  9. Optimizing and caching browser bundles...

    扎心了,老铁!!! 他妈的,弄了几天都是卡在这里!!上网查了一下.说是我的内存不够,好吧.我慢慢等,然而让我等了好几天都没什么反应..两天了,一直卡在这里.今天在虚拟机也是发狠了. 我直接把虚拟机的内 ...

  10. C++_类和动态内存分配6-复习各种技术及队列模拟

    知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一 ...