数据库连接池--阿里巴巴的druid

连接池是一个对数据库连接进行管理的东西,当一个线程需要用 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 ------------");
		}
		
	}

}

猜你喜欢

转载自blog.csdn.net/fct2001140269/article/details/83176955