eclipse进行C3P0和DBCP数据库连接池的运用
前期准备
在开始之前要创建好数据库我这边建好的数据库如下图所示:
一、DBCP数据连接池的应用
- 上官网下载dbcp、pool网站为:http://commons.apache.org/proper/
- 下载完后在eclipse创建web项目进行jar包导入
- 编写DBCP的配置文件,文件名一定要为:dbcpconfig.properties;并且要在src包下面具体创建方法如下:点击src包(注意这里是src的根包,而不是src下面创建的包)然后在目录那边选择file-new-file到这个界面:
我这里不能点击是因为,我已经创建好一个dbcpconfig.properties所以不能在继续创建了。 - 创建好后进行编写代码
#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root(个人数据库用户)
password=个人数据库密码
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
maxWait=1000
实际上编写进入后是看不到中文字符的
- 注意这里得driverClassName=com.mysql.cj.jdbc.Driver是mysql8.0的写法和以前的版本com.mysql.jdbc.Driver的区别是多了一个cj。
- 创建一个名称为DBCPUtils的工具类,其代码如下所示。
import java.sql.*;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class DBCPUtils {
private static DataSource ds;//定义一个连接池对象
static{
try {
Properties pro = new Properties();
pro.load(DBCPUtils.class.getClassLoader()
.getResourceAsStream("dbcpconfig.properties"));
//得到一个连接池对象
ds = BasicDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化连接错误,请检查配置文件!");
}
}
//从池中获取一个连接
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
public static void closeConn(Connection conn){
if(conn!=null){
try {
conn.close();//关闭
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- 创建一个测试类DBCPTest,在其main方法中测试获取数据连接。其测试类的代码如下:
import java.sql.Connection;
import java.sql.SQLException;
import cn.wbl.jdbc.utils.DBCPUtils;
public class DBCPTest {
public static void main(String[] args) throws SQLException {
//输出连接信息
System.out.println(DBCPUtils.getConnection());
long begin = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
Connection conn = DBCPUtils.getConnection();
DBCPUtils.closeConn(conn);
}
long end = System.currentTimeMillis();
System.out.println("用时:" + (end - begin));
}
}
- 当运行后出现这样的问题:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.commons.dbcp2.BasicDataSourceFactory.<clinit>(BasicDataSourceFactory.java:60)
at cn.wbl.jdbc.utils.DBCPUtils.<clinit>(DBCPUtils.java:17)
at cn.wbl.jabc.Lianxi.example.DBCPTest.main(DBCPTest.java:9)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 3 more
这就需要上这个网站:http://commons.apache.org/proper/commons-logging/download_logging.cgi;下载Apache Commons Logging 1.2,下载后将包导入
- 再次运行后结果如下:
二、C3P0的数据连接池的应用
- 上C3P0下在C3P0的jar包网站为:https://sourceforge.net/projects/c3p0/,我这里下载的是c3p0-0.9.5.5.jar,下载好后将jar包导入项目当中
- 编写C3P0的配置文件,文件名一定要为:c3p0-config.xml;然后编写代码代码为:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC</property>
<property name="user">root(个人数据库用户)</property>
<property name="password">个人数据库密码</property>
<property name="checkoutTimeout">30000</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<named-config name="itcast">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">
jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC
</property>
<property name="user">root</property>
<property name="password">990411wbl</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">15</property>
</named-config>
</c3p0-config>
- 创建一个名称为C3p0Test的类,其代码如下所示
import java.sql.*;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3p0Test {
public static DataSource ds = null;
// 初始化C3P0数据源
static {
// 使用c3p0-config.xml配置文件中的named-config节点中name属性的值
ComboPooledDataSource cpds = new ComboPooledDataSource("itcast");
ds = cpds;
}
public static void main(String[] args) {
Connection conn = null;
PreparedStatement prestmt = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
String sql = "select * from user";
prestmt = conn.prepareStatement(sql);
rs = prestmt.executeQuery();
while (rs.next()) {
System.out.print(rs.getInt("id") + " \t");
System.out.print(rs.getString("name") + " \t");
System.out.print(rs.getString("password") + " \t");
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (prestmt != null) {
try {
prestmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
prestmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
}
4.运行出现弹窗:
错误代码显示如下:
Exception in thread "main" java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector at cn.wbl.jabc.Lianxi.example.C3p0Test.<clinit>(C3p0Test.java:13) Caused by: java.lang.ClassNotFoundException: com.mchange.v2.ser.Indirector at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more
这是因为在C3P0里面哈需要导入一个jar包
将这一jar包导入项目后就可以解决这一问题。
5. 重新运行结果如下:
三、结言
1、本文所需要的jar包我也以上传,各位看官有需要的可自取:
CSDN资源:https://download.csdn.net/download/wbl9904/43651307
百度网盘:https://pan.baidu.com/s/1pOf4NEqttk4MlCg_oOvZtQ
提取码:9904
2、如果有写错的请指出来,大家相互进步!谢谢啦!编程之路学无止境!!