单例模式自定义数据库连接池
public class DBUtil {
private static Logger logger = Logger.getLogger(DBUtil.class);
/**
* 数据库连接信息
*/
private static final String JDBC_DRIVER;
private static final String JDBC_URL;
private static final String JDBC_NAME;
private static final String JDBC_PWD;
private static final int JDBC_DATASOURCE_SIZE;
private volatile static DBUtil instance;
private static LinkedList<Connection> dataSource = new LinkedList<Connection>();
static {
Properties props = new Properties();
InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("config.properties");
props.load(in);
JDBC_DRIVER = prop.getProperty("jdbcDriver");
JDBC_URL = prop.getProperty("jdbcUrl");
JDBC_NAME = prop.getProperty("jdbcName");
JDBC_PWD = prop.getProperty("jdbcPwd");
JDBC_DATASOURCE_SIZE = Integer.parseInt(prop.getProperty("jdbcDatasourceSize"));
}
/***
*@描述 获取数据库实例(单例)
*@参数
*@作者 by think
*@创建时间 2021/3/29 11:26
*/
public static DBUtil getInstance() {
if (instance == null) {
synchronized (DBUtil.class) {
if (instance == null) {
instance = new DBUtil();
}
}
}
return instance;
}
/***
*@描述 初始化数据库连接池
*@返回值 * @return: null
*@作者 by think
*@创建时间 2021/3/29 11:28
*/
private DBUtil() {
//初始数据源连接池
for (int i = 0; i < JDBC_DATASOURCE_SIZE; i++) {
try {
Class.forName(JDBC_DRIVER);
Connection connection = DriverManager.getConnection(JDBC_URL, JDBC_NAME, JDBC_PWD);
dataSource .push(connection);
} catch (Exception e) {
logger.error("连接数据库异常", e);
}
}
logger.info(String.format("初始化数据源连接池大小:%s", dataSource .size()));
}
/**
* @描述 获取数据库连接
* @参数
* @返回值
* @author by think
* @创建时间 2021/3/15 16:23
*/
public Connection getConnection() {
while (dataSource.size() == 0) {
try {
logger.info("数据库连接正忙,请稍后再试...");
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return dataSource.poll();
}
/**
* 回收使用完毕的数据库连接
* @参数 [conn]
* @返回值 void
* @作者 think
* @创建时间 2021/3/29 11:41
*/
public void putBackDataConn(Connection conn) {
dataSource.push(conn);
}
}
config.properties
#数据库驱动(默认,无需修改)
jdbcDriver=oracle.jdbc.driver.OracleDriver
#数据库连接串
jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl
#数据库用户名
jdbcName=test
#数据库密码
jdbcPwd=123456
#数据源连接池大小
jdbcDatasourceSize=50
测试
/**
* @author Think
*/
public class TestSql {
public static void main(String[] args) {
DBUtil dbUtil = DBUtil.getInstance();
Connection dbConn = dbUtil.getOldImageConnection();
try {
String sql="select count(*) from AI006FTI;";
PreparedStatement ps = dbConn.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();
int count =0;
while (resultSet.next()){
count = resultSet.getInt(1);
}
System.out.println(String.format("%d",count));
} catch (Exception e) {
System.out.print("fail!");
}finally {
dbUtil.putBackDataConn(dbConn);
}
}
}