一、开源数据库连接池
现在很多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
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
,在以后的项目中可以使用,而且其功能强大。