数据库配置文件properties
使用properties
文件存放数据库配置,读取properties
文件。并配置dbcp
连接池。
创建DBUtil连接,连接数据库,方便复用建立数据库的连接和关闭操作。
oracle数据库相关配置,db.properties
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.user=oracle
jdbc.password=123456
Mysql数据库相关配置,db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.user=root
jdbc.password=123456
这里,
useSSL=false
这段因为连接高版本的数据库需要确认,没有的话会有提示。
数据库连接池dbcp
jdbc隐患
使用JDBC访问数据库时,需要避免以下隐患:
- 每一次数据操作请求都需要建立数据库连接、打开连接、存取数据和关闭连接等步骤。而建立和打开数据库连接是一件既耗资源又费时的过程,如果频繁发生这种数据库操作,势必会使系统性能下降。
- 连接对象代表着数据库系统的连接进程,是有限的资源。如果系统的使用用户非常多,有可能超出数据库服务器的承受极限,造成系统的崩溃。
连接池功能
数据库连接池是解决上述问题最常用的方法。所谓连接池,即可以创建并持有数据库连接的组件。
连接池可以预先创建并封装一些连接对象并将其缓存起来,当需要使用连接对象时可以向连接池“借”一个
连接,用完之后将其“归还”到连接池中。数据库连接池的主要功能如下:
- 连接池对象的创建和释放。
- 服务器启动时,创建指定数量的数据库连接。
- 为用户请求提供可用连接。如果没有空闲连接,且连接数没有超出最大值,创建一个新的数据库连接。
- 将用户不再使用的连接标识为可用连接,等待其他用户请求。
- 当空闲的连接数过多时,释放连接对象。
使用commons-dbcp:1.4
,需要导入:commons-dbcp-1.4.jar
和commons-pool-1.5.4.jar
两个jar包。
使用连接池创建DBUtil工具类
使用mysql数据库驱动。需要导入mysql-connector-java-5.1.46.jar
包。完整代码:
properties文件完整代码
#数据库驱动
jdbc.driver=com.mysql.jdbc.Driver
#数据库连接地址
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
#数据库用户
jdbc.user=root
#数据库密码
jdbc.password=123456
#初始化连接
dataSource.initialSize=10
#最大空闲连接
dataSource.maxIdle=20
#最小空闲连接
dataSource.minIdle=5
#最大连接数量
dataSource.maxActive=50
#超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
dataSource.maxWait=1000
原始DBUtil.java完整代码
package cn.ahzhuoshan.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtil {
private static Properties properties = new Properties();
private static String driver = null;
private static String url = null;
private static String user = null;
private static String pwd = null;
static {
try {
// 加载配置文件
properties.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
driver = properties.getProperty("jdbc.driver");
url = properties.getProperty("jdbc.url");
user = properties.getProperty("jdbc.user");
pwd = properties.getProperty("jdbc.password");
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static Connection openConnection() throws SQLException {
return DriverManager.getConnection(url, user, pwd);
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭连接时发生异常");
}
}
}
public static void main(String[] args) throws SQLException {
System.out.println(DBUtil.openConnection());
}
}
配置了连接池的DBUtil.java完整代码
package cn.ahzhuoshan.util;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtil {
private static BasicDataSource dataSource = null;
public static void init() {
Properties dbProps = new Properties();
// 取配置文件可以根据实际的不同修改
try {
dbProps.load(DBUtil.class.getClassLoader().getResourceAsStream("mysqldb.properties"));
} catch (IOException e) {
e.printStackTrace();
}
try {
String driveClassName = dbProps.getProperty("jdbc.driver");
String url = dbProps.getProperty("jdbc.url");
String username = dbProps.getProperty("jdbc.user");
String password = dbProps.getProperty("jdbc.password");
String initialSize = dbProps.getProperty("dataSource.initialSize");
String minIdle = dbProps.getProperty("dataSource.minIdle");
String maxIdle = dbProps.getProperty("dataSource.maxIdle");
String maxWait = dbProps.getProperty("dataSource.maxWait");
String maxActive = dbProps.getProperty("dataSource.maxActive");
dataSource = new BasicDataSource();
dataSource.setDriverClassName(driveClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
// 初始化连接数
if (initialSize != null) {
dataSource.setInitialSize(Integer.parseInt(initialSize));
}
// 最小空闲连接
if (minIdle != null) {
dataSource.setMinIdle(Integer.parseInt(minIdle));
}
// 最大空闲连接
if (maxIdle != null) {
dataSource.setMaxIdle(Integer.parseInt(maxIdle));
}
// 超时回收时间(以毫秒为单位)
if (maxWait != null) {
dataSource.setMaxWait(Long.parseLong(maxWait));
}
// 最大连接数
if (maxActive != null) {
if (!maxActive.trim().equals("0")) {
dataSource.setMaxActive(Integer.parseInt(maxActive));
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("创建连接池失败!请检查设置!");
}
}
public static synchronized Connection getConnection() throws SQLException {
Connection conn = null;
if (dataSource == null) {
init();
}
if (dataSource != null) {
conn = dataSource.getConnection();
}
return conn;
}
public static void main(String[] args) throws SQLException {
Connection conn = DBUtil.getConnection();
System.out.println(conn);
}
}