之前讲过,每次与数据库交互都需要进行创建连接的操作,而Connection对象是一个非常重要的资源,如果在网站上使用旧的代码方式,就会造成连接创建过多的问题,甚至会造成一些严重的问题。
所以就需要引入连接池的使用,数据库连接池负责分配、管理和释放数据库连接。
这里我使用的连接池是c3p0。
我在工具类中来编写c3p0的代码,这样也不会主方法中的代码过于复杂,其主要作用包含了 注册驱动,创建连接等(这些作用的配置需要在c3p0-config.xml里完成)
1. 首先需要在项目的lib包中,引入c3p0的jar包,可以在https://mvnrepository.com/artifact/com.mchange/c3p0这里下载。Maven项目的当然可以在pom.xml里引入依赖。
2. 接着便是在工具类中声明连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
public class JDBCUtils2 {
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 创建连接
* @return
* @throws Exception
*/
public static Connection getConnection() throws Exception {
//可以直接从连接池里得到连接
Connection conn = dataSource.getConnection();
return conn;
}
/**
* 释放资源
*/
public static void release(Statement stmt ,Connection conn) {
if(stmt!= null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stmt = null;
}
if(conn!= null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn) {
if(rs!= null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs = null;
}
if(stmt!= null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stmt = null;
}
if(conn!= null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}
}
3. 配置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/jdbctest1?characterEncoding=utf8useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true</property>
<property name="user">root</property>
<property name="password">pwd_970301</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
4. 其他的基本与原先JDBC操作类似,就不用再重复了
注:
根据上面的操作完成后,我遇到了问题:
a. 这是缺少jar包引起的,将 mchange-commons-java-xxxx.jar 包加入lib 包下 即可。(好像对版本没什么要求,反正用新的就好了),可以在这里下载 https://mvnrepository.com/artifact/com.mchange/mchange-commons-java
java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
at com.zhouxin.jdbc.utils.JDBCUtils2.<clinit>(JDBCUtils2.java:15)
at com.zhouxin.jdbc.demo1.JdbcDemo3.demo1(JdbcDemo3.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
... 25 more
b. 下面是c3p0的日志错误输出,“ [Fatal Error] :5:95: 对实体 "useSSL" 的引用必须以 ';' 分隔符结尾。”;
我上网查了解决方法,很简单,只要在每个&的后面加上amp; 即可。
即 <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbctest1?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true</property>
五月 28, 2019 7:02:59 下午 com.mchange.v2.log.MLog
信息: MLog clients using java 1.4+ standard logging.
[Fatal Error] :5:95: 对实体 "useSSL" 的引用必须以 ';' 分隔符结尾。
五月 28, 2019 7:02:59 下午 com.mchange.v2.c3p0.cfg.C3P0Config
警告: XML configuration disabled! Verify that standard XML libs are available.
org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 95; 对实体 "useSSL" 的引用必须以 ';' 分隔符结尾。