连接池是一个对数据库连接进行管理的东西,当一个线程需要用 JDBC 对 数据库操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用,而不是每次都重新建立一个数据库连接。
一、 数据库连接池主要逻辑代码
1.1数据库连接池需要的maven包:
数据库连接的jdbc驱动包,阿里巴巴的druid数据库连接池包
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1104-jdbc4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
1.2 主要连接池代码:
package test.druid;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DBPoolConnectionManager {
//可以使用Systemt.out.println()代替
private static final Logger LOGGER = Logger.getLogger("DBPoolConnection");
/*
*声明私有构造器:防止在外部类文件中使用new DBPoolConnectionManager();创建该连接池对象;保证只是使用静态静态内部类方式创建该连接池对象;
*:即实现单例模式
*/
private DBPoolConnectionManager () {
}
/*
* 声明内部类
*/
public static class Holder {
/**
* instance数据库连接池对象:保证任何时候只有一个对象
* 方法一:此处使用静态内部类构造单例模式
* 方法二:使用其它单例模式:生命私有构造器
*/
private static DataSource instance;
//跟随该类文件一起加载
static {
try {
Properties properties = loadPropertyFile("db_server.properties");
System.out.println(properties);
instance = DruidDataSourceFactory.createDataSource(properties);
LOGGER.info("Data source had finished initialization.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static Connection getConnection() {
// 外围类能直接访问内部类(不管是否是静态的)的私有变量
try {
LOGGER.info("Return connection");
return Holder.instance.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
//读取外部连接配置文件:db_server.properties
private static Properties loadPropertyFile(String fullFile) throws IOException {
Properties p = new Properties();
if (fullFile == null || "".equals(fullFile)) {
LOGGER.info("File path is null.");
System.exit(1);
} else {
//加载属性文件
InputStream inStream = DBPoolConnection.class.getClassLoader().getResourceAsStream(fullFile);
p.load(inStream);
}
return p;
}
}
3.1 读取配置文件中数据库的连接信息:
连接配置文件db_server.properties,放在程序src根目录下;
#转换为不同的数据库驱动字符串
driverClassName=org.postgresql.Driver
#数据库连接的url
url=jdbc:postgresql://192.168.xx.xxx:5432/db_tablexxx?&useUnicode=true&characterEncoding=utf-8&autoReconnect=true
username=root
password=123456
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
1.4 主函数调用测试:
package test.druid;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DruidTest {
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
Connection connection1 = DBPoolConnectionManager .getConnection();
Connection connection2 = DBPoolConnectionManager .getConnection();
Statement stmt = connection1.createStatement();
if (connection1.isClosed() == false && connection2.isClosed() ==false) {
if (!connection1.equals(connection2)) {
System.out.println("!connection1.equals(connection2): 两个连接不是一个对象");
}else {
System.out.println("connection1.equals(connection2): 两个连接是一个对象");
}
ResultSet rs = stmt.executeQuery("SELECT * from shipping_cp_cargo ");
while (rs.next()) {
// System.out.println(rs.toString());
}
System.out.println("yijing ------------");
}
}
}