连接数据库,使用c3p0技术连接MySQL数据库
读取配置文件连接MySQL数据库
先确认已经导入了 mysql 的驱动包
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/v20?useUnicode=true&characterEncoding=utf8
username=root
password=123456
JdbcUtil.java
package com.stu_mvc.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtil {
private static String CLASS_DRIVER = "";
private static String URL = "";
private static String USERNAME = "";
private static String PASSWORD = "";
static {
Properties properties = new Properties();
try {
//读取上面的配置文件
properties.load(JdbcUtil.class.getResourceAsStream("/db.properties"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
CLASS_DRIVER = properties.getProperty("driver");
URL = properties.getProperty("url");
USERNAME = properties.getProperty("username");
PASSWORD = properties.getProperty("password");
try {
Class.forName(CLASS_DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* getConn()
* 获取conn
*/
public static Connection getConn() {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 利用泛型改进释放资源 rs,st,conn
*/
public static <T extends AutoCloseable> void closeAll(T... autos) {
for (AutoCloseable t : autos) {
if (t != null) {
try {
t.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
使用 c3p0数据库连接池连接MySQL
普通的数据库连接创建的缺点:
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。
数据库连接池概念
所谓数据库连接池,可以看作 :在用户和数据库之间创建一个”池”,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库。一旦连接池中的连接对象被拿光了,下一个想要操作数据库的用户必须等待,等待其他用户释放连接对象,把它放回连接池中,这时候等待的用户才能获取连接对象,从而操作数据库。
下载C3P0工具包
C3P0工具包包含的版本:
-
c3p0-0.9.5.2
-
mchange-commons-java-0.2.11
c3p0-config.xml 的配置
**注意: ** xml 配置文件的名称必须是:c3p0-config.xml
,也是放在src 目录下
这里的 jdbcUrl 比较容易出问题,要是出现问题,建议仔细找找。
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 文件名字是固定的,连接池会找到这个配置文件进行配置 -->
<default-config>
<!--第一条内容是固定的-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!--最后一项改成你的数据库名字即可,我这里之前总是连接不上,改成三个 /// 后发现连接成功-->
<property name="jdbcUrl">jdbc:mysql:///v20</property>
<!--mysql的用户名和密码-->
<property name="user">root</property>
<property name="password">123456</property>
</default-config>
</c3p0-config>
JdbcUtil.java
写一个封装的工具类,开发起来还不是美滋滋!
package com.register_mvc.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.impl.DbAuth;
public class JdbcUtil {
// 创建 c3p0 连接池对象
static ComboPooledDataSource dataSource = new ComboPooledDataSource("v20");
//创建一个 ThreadLocal
static ThreadLocal<Connection> th = new ThreadLocal<Connection>();
/**
* getConn()
* 获取conn
*/
public static Connection getConn() {
// 从连接池中获取连接
// 先从 th 中获取,如果为空再到连接池中获取
Connection conn = th.get();
if (conn == null) {
try {
//把 获取的conn 存到 ThreadLocal 中
// ThreadLocal 内部有个map
// 通过当前的 线程 作为 key value 是存的内容
// 统一线程 key一致 value值 肯定一致
conn = dataSource.getConnection();
//把 conn存到th中
th.set(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
/**
* 利用泛型方法释放资源 rs,st,conn
*/
public static <T extends AutoCloseable> void closeAll(T... autos) {
for (AutoCloseable t : autos) {
if (t != null) {
try {
t.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}