数据库配置文件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.jarcommons-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);
	}
}
原文链接: https://marshucheng1.github.io/2017/02/13/java-jdbc/