java 数据库连接池 开源_21.JDBC开发(4)开源数据库连接池(javaEE笔记)

一、开源数据库连接池

现在很多web服务器都提供了DataSource的实现,即连接池的实现。通常我们把DataSource的实现按其英文含义称为数据源,数据源中都包含了数据库连接池的实现。

也有一些开源组织提供了数据源的独立实现:

DBCP数据库连接池

C3P0数据库连接池

使用tomcat数据源

实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编写时也尽量使用这些数据源的实现,以提升程序的数据库访问性能。

二、DBCP数据源(工程day16)

DBCP是Apache软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个jar文件:

commons-dbcp.jar:连接池的实现

commons-pool.jar:连接池实现的依赖库

tomcat的连接池正式采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

使用此数据源需要一个配置文件:

dbcpconfig.properties

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3305/day15

username=root

password=walp1314

#

initialSize=10

#最大连接数量

maxActive=50

#

maxIdle=20

#

minIdle=5

#

maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]

#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。

connectionProperties=useUnicode=true;characterEncoding=UTF8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。

defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。

#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)

defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。

#可用值为下列之一:(详情可以看文档)NONE,READ_UNCOMMITED,READ_COMMITED,REPEATABLE_READ,SERIALIZABLE

#但是注意:以上是mysql的隔离级别,Oracle有些不同,Oracle最低要求READ_COMMITED

defaultTransactionIsolation=READ_UNCOMMITED

JdbcUtils_DBCP.java

package cn.itcast.utils;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class JdbcUtils_DBCP {

private static DataSource ds = null;

static{

try{

InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");

Properties properties = new Properties();

properties.load(in);

//先new一个工厂

BasicDataSourceFactory factory = new BasicDataSourceFactory();

//使用工厂生成数据源

ds = factory.createDataSource(properties);

System.out.println(ds);

}catch(Exception e){

throw new ExceptionInInitializerError(e);

}

}

public static Connection getConnection() throws SQLException{

return ds.getConnection();

}

public static void release(Connection conn, Statement ps , ResultSet result){

if(result != null){

try {

result.close();

} catch (Exception e) {

e.printStackTrace();

}

result = null;

}

if(ps != null){

try {

ps.close();

} catch (Exception e) {

e.printStackTrace();

}

ps = null;

}

if(conn != null){

try {

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

conn = null;

}

}

}

说明:这里我们可以使用之前的例子(如Demo1.java)进行测试,但是当我们使用的DBCP是版本1,那么是可以测试成功的,但是如果用DBCP的版本2,那么会出现异常,此时我们需要再导入一个jar包:commons-logging-1.2.jar。这样才能测试成功。

C3P0数据源(工程day16)

首先需要导入相关的jar包:

c3p0-0.9.5.1.jar

mchange-commons-java-0.2.10.jar

使用此数据源需要的配置文件是:

c3p0-config.xml

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3305/day16

root

walp1314

5

10

5

20

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/day16

root

walp1314

5

10

5

20

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/day16

root

walp1314

5

10

5

20

说明:如果我们在后面程序中如果不指定使用哪个数据库配置,那么就使用默认的配置。

JdbcUtils_C3P0.java

package cn.itcast.utils;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils_C3P0 {

private static ComboPooledDataSource ds = null;

static{

try{

//使用配置文件时,配置文件必须放在src下,同时配置文件名不要改,如果不指定配置文件名,则使用默认的配置

ds = new ComboPooledDataSource("mysql");

}catch(Exception e){

throw new ExceptionInInitializerError(e);

}

}

public static Connection getConnection() throws SQLException{

return ds.getConnection();

}

public static void release(Connection conn, Statement ps , ResultSet result){

if(result != null){

try {

result.close();

} catch (Exception e) {

e.printStackTrace();

}

result = null;

}

if(ps != null){

try {

ps.close();

} catch (Exception e) {

e.printStackTrace();

}

ps = null;

}

if(conn != null){

try {

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

conn = null;

}

}

}

说明:我们也可以直接在程序中对其驱动等信息进行设置,但是那样太麻烦,这里我们使用配置文件,如果不具体指定使用哪个配置,那就使用默认配置。同样我们可以使用之前的程序进行测试。

四、使用tomcat数据源(工程day16_web)

我们可以在tomcat服务器中配置一个数据源,这个数据源使用的JNDI技术。

所谓JNDI:

JNDI(java Naming and Directory Interface),java命名和目录接口,它对应于J2SE中的javax.naming包。这套API的主要作用在于:它可以把java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得java对象,只需通过名称检索即可。

其核心API为context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。

首先我们需要配置tomcat的Context,配置Context可以有多种方式,这里我们使用一个配置文件放在META-INF/context.xml

auth="Container"

type="javax.sql.DataSource"

username="root"

password="walp1314"

driverClassName="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3305/day16"

maxTotal="8"

maxIdle="4"/>

ServletDemo1.java

package cn.itcast.web.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import cn.itcast.dao.BaseDao;

//记得mysql的驱动一定要加到tomcat的lib中

public class ServletDemo1 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

BaseDao dao = new BaseDao();

dao.add();

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

BaseDao.java

package cn.itcast.dao;

import java.sql.Connection;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class BaseDao {

public void add() {

try {

// 此时我们所有的程序都是在服务器中,在一般的类中我们也可以拿到数据库链接

Context initCtx = new InitialContext();// 初始化JNDI

Context envCtx = (Context) initCtx.lookup("java:comp/env");// 得到JNDI容器

DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");// 从容器中检索一个链接池

Connection conn = ds.getConnection();// 获取到一个链接

System.out.println(conn);

} catch (Exception e) {

e.printStackTrace();

}

}

}

说明:这里一定注意要将mysql的jdbc驱动放在tomcat的lib目录中。

最后:其实还有一些开源的数据源可以使用,比如阿里巴巴的数据源druid-1.0.19.jar,在以后的项目中可以使用,而且其功能强大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值