0 前提:
数据库连接是很宝贵的资源,每一次初始化一个连接时都耗时较长,如果网站访问量较大,并不做优化前提下,很容易造成数据库服务器内存溢出,导致宕机。
1 数据库连接池:
结构如下图:
2 java提供类来让开发人员自定义实现数据库连接池: (一般都是用开源的数据库连接池)
2.0 自己编写连接池大概流程:
编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:
Connection getConnection()
Connection getConnection(String username, String password)
开发的流程: 一次性从数据库中获取X个conn,然后将原始的conn(Connection)动态代理,然后将这些个conn放如到linkedlist保存,每次获取conn时去list获取,当在业务逻辑代码中执行释放资源时,将使用的动态代理的close将conn返回到list中。
其中对connection动态代理后代码如下:
public Connection getConnection() throws SQLException { // 这就是使用动态代理技术构建除了conn返回出去了 if(connections.size()>0){ final Connection conn = connections.removeFirst(); System.out.println(conn + "从连接池里面取出来了!!,池大小为:" + connections.size()); //第三个参数表示返回的代理对象干什么事情 /* *Proxy --JDK提供的这个类 可以构建成某一接口的 代理对象 * 调用方法 newProxyInstance(当前类的类加载器, 给的是那个类的接口那么返回的就是这个类的代理对象, 返回的是代理对象要干的事情,事情是通过对象来指定的); */ return (Connection)Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),conn.getClass().getInterfaces(), new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("close")){ connections.addLast(conn); System.out.println(conn + "被还到池里了!!,池大小为:" + connections.size()); }else{// 如果不是调用conn的close方法而是调用conn的其他方法那么我就调用mysql的conn把其他事情给干了 return method.invoke(conn, args); } return null; } }); }else{ throw new RuntimeException("服务器繁忙,请过会再来!!"); } }
2.1 市场上开源的连接池介绍(原理都是 1 维护X个数据库连接资源conn 2对原始conn实现动态代理,主要涉及两块 执行close时将conn返回到list 执行别的方法时交由原始conn执行):
一些开源组织提供了数据源(数据库连接池+技术实现)的独立实现,实际应用时不需要编写连接数据库代码
a) DBCP 数据库连接池,
需要jarCommons-dbcp.jar:连接池的实现 Commons-pool.jar:连接池实现的依赖库
配置文件:
#连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbc3 username=root password=root #<!-- 初始化连接 --> initialSize=5 #最大连接数量 maxActive=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=gbk #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED
b) C3P0 数据库连接池
需要的jar : c3p0-0.9.1.2.jar
关于这两个数据源的读取写法,需要的JAR,配置文件 见附件: db_super.rar
相关推荐
提供了数据库连接池的驱动,分别有c3p0、druid、dbcp三种数据库连接池的驱动
里面有dbcp以及其依赖的jar包和c3p0jar包。可以通过使用数据库链接池,高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。
数据库连接池的资源包(c3p0 , dbcp,druid连接池)
包含了连接数据库连接池所需的大部分jar包
DBCP 数据库连接池 DBCP 数据库连接池 DBCP 数据库连接池 里面是DBCP的jar,导进去就可以用了
JAVA数据库连接池(C3P0,Druid,JNDI ,DBCP,Proxool,BoneCP) 源码包含各个数据库连接池的连接DEMO spring+mybatis+maven
dbcp数据库连接池需要用到的jar,包括源码和api文档,javadoc
DBCP数据库连接池的完整jar包
常见的两种数据库连接池的jar包和源码。
该文件包含了DBCP,C3P0数据库连接池所需要的jar,有需要的可以下载哦
DBCP配置数据库连接池实现对数据库的连接并附上增删改查
DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
java web开发 dbcp数据库连接池 所用jar包。java web开发 dbcp数据库连接池 所用jar包。
基于DBCP,c3p和Tomcat提供的数据库连接池的支持,分别实现了一个demo
本例演示c3p0 、dbcp 、proxool三种常用数据库连接池的用法及log4j2日志使用方法
1. 引 2. 数据库连接池 3. 主要配置说明 2. FindBugs:Java 静态代码检查(3486)
数据库连接池DBCPjar包,数据库连接时.我们要是用到了数据库连接池,你需要的
收集了常见的数据库连接jar包,包括oracle、mysql、sql server、db2、opta、dbcp连接池、c3p0连接池等等常见的数据库jar包,不断更新中。
DBCP连接池DBCP和C3P0配置,可以对数据源进行各种有效的控制