`
lijing727
  • 浏览: 16004 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JDCB的基本写法和数据库连接池的实现

阅读更多

1、使用静态方法实现

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbConnStatic {

	private final static String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";

	private final static String DB_URL = "jdbc:oracle:thin:@localhost:testData";

	private final static String DB_USER_NAME = "testData";

	private final static String DB_PASSWROD = "testData";

	private static Connection conn = null;

	static{

		try {

			Class.forName(DB_DRIVER);

			conn = DriverManager.getConnection(DB_URL, DB_USER_NAME,
					DB_PASSWROD);

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	public static Connection getConnection(){
		
		return conn;
		
	}
	
	public static void freeConnection(){
		
		try {
			
			conn.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

 

2、使用非静态方法实现

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbConn {
	
	private final String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";

	private final String DB_URL = "jdbc:oracle:thin:@localhost:testData";

	private final String DB_USER_NAME = "testData";

	private final String DB_PASSWROD = "testData";

	private Connection conn = null;

	public DbConn(){

		try {

			Class.forName(DB_DRIVER);

			conn = DriverManager.getConnection(DB_URL, DB_USER_NAME,
					DB_PASSWROD);

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	public Connection getConnection(){
		
		return conn;
		
	}
	
	public void freeConnection(){
		
		try {
			
			conn.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 

 

3、数据库连接池的实现

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Vector;

public class DbPool {

	// 连接池里面的数据库连接
	class PoolConnection {

		Connection conn = null;

		boolean busy = false;

		public PoolConnection(Connection conn) {

			this.conn = conn;

		}

		public Connection getConn() {
			return conn;
		}

		public void setConn(Connection conn) {
			this.conn = conn;
		}

		public boolean isBusy() {
			return busy;
		}

		public void setBusy(boolean busy) {
			this.busy = busy;
		}

	}

	private final String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";

	private final String DB_URL = "jdbc:oracle:thin:@localhost:testData";

	private final String DB_USER_NAME = "testData";

	private final String DB_PASSWROD = "testData";

	private int initialConnections = 10; // 连接池的初始大小

	private int incrementalConnections = 5;// 连接池自动增加的大小

	private int maxConnections = 50; // 连接池最大的大小

	// private String testTable = "LIJING727_ORIGDATA"; // 测试表,用于测试来连接是否可用

	private Vector<PoolConnection> connections = null;

	public int getInitialConnections() {
		return initialConnections;
	}

	public void setInitialConnections(int initialConnections) {
		this.initialConnections = initialConnections;
	}

	public int getIncrementalConnections() {
		return incrementalConnections;
	}

	public void setIncrementalConnections(int incrementalConnections) {
		this.incrementalConnections = incrementalConnections;
	}

	public int getMaxConnections() {
		return maxConnections;
	}

	public void setMaxConnections(int maxConnections) {
		this.maxConnections = maxConnections;
	}

	private Connection newConnection() throws SQLException {

		Connection conn = DriverManager.getConnection(DB_URL, DB_USER_NAME,
				DB_PASSWROD);

		// 首次创建链接
		if (connections.size() == 0) {

			int driverMaxConnenction = conn.getMetaData().getMaxConnections();

			System.out.println("数据库支持的最大连接数:" + driverMaxConnenction);

			if (driverMaxConnenction > 0
					&& maxConnections > driverMaxConnenction) {

				maxConnections = driverMaxConnenction;

			}

		}

		return conn;

	}

	private void createConnections(int num) throws SQLException {

		for (int i = 0; i < num; i++) {

			if (maxConnections > 0 && connections.size() >= maxConnections) {
				break;
			}

			try {

				connections.add(new PoolConnection(newConnection()));

			} catch (SQLException e) {

				System.out.println("数据库创建失败! " + e.getMessage());
				throw e;
			}

		}

	}

	// 创建数据库连接池
	public synchronized void createPool() throws ClassNotFoundException,
			SQLException {

		if (connections != null) {

			return;

		}

		Class.forName(DB_DRIVER);

		connections = new Vector<PoolConnection>();

		createConnections(initialConnections);

		System.out.println("数据库连接池创建成功!");

	}

	private void closeConnection(Connection conn) {

		try {

			conn.close();

		} catch (SQLException e) {

			System.out.println(" 关闭数据库连接出错: " + e.getMessage());

		}
	}

	private void wait(int mSeconds) {

		try {

			Thread.sleep(mSeconds);

		} catch (InterruptedException e) {

		}
	}

	// 归还数据库连接
	public void returnConnection(Connection conn) {

		if (connections == null) {

			System.out.println("数据库连接池不存在!");
			return;

		}

		PoolConnection pConn = null;

		Iterator<PoolConnection> iterator = connections.iterator();

		while (iterator.hasNext()) {

			pConn = iterator.next();

			if (conn == pConn.getConn()) {

				pConn.setBusy(false);
				break;

			}

		}

	}

	// 刷新数据库连接
	public synchronized void refreshConnections() throws SQLException {

		// 确保连接池己创新存在
		if (connections == null) {
			System.out.println(" 连接池不存在,无法刷新 !");
			return;
		}

		PoolConnection pConn = null;
		Iterator<PoolConnection> it = connections.iterator();

		while (it.hasNext()) {
			// 获得一个连接对象
			pConn = it.next();
			// 如果对象忙则等 5 秒 ,5 秒后直接刷新
			if (pConn.isBusy()) {
				wait(5000); // 等 5 秒
			}

			// 关闭此连接,用一个新的连接代替它。
			closeConnection(pConn.getConn());
			pConn.setConn(newConnection());
			pConn.setBusy(false);

		}
	}

	// 关闭数据库连接池
	public synchronized void closeConnectionPool() throws SQLException {

		// 确保连接池己创新存在
		if (connections == null) {
			System.out.println(" 连接池不存在,无法刷新 !");
			return;
		}

		PoolConnection pConn = null;
		Iterator<PoolConnection> it = connections.iterator();

		while (it.hasNext()) {
			// 获得一个连接对象
			pConn = it.next();
			// 如果对象忙则等 5 秒 ,5 秒后直接刷新
			if (pConn.isBusy()) {
				wait(5000); // 等 5 秒
			}

			// 关闭此连接,用一个新的连接代替它。
			closeConnection(pConn.getConn());

			connections.remove(pConn);

		}

		connections = null;
	}

	private Connection findFreeConnection() throws SQLException {

		Connection conn = null;
		PoolConnection pConn = null;
		// 获得连接池向量中所有的对象
		Iterator<PoolConnection> iterator = connections.iterator();
		// 遍历所有的对象,看是否有可用的连接
		while (iterator.hasNext()) {
			pConn = iterator.next();
			if (!pConn.isBusy()) {
				// 如果此对象不忙,则获得它的数据库连接并把它设为忙
				conn = pConn.getConn();
				pConn.setBusy(true);
				// 测试此连接是否可用
				
				
//				if (!testConnection(conn)) {
//					// 如果此连接不可再用了,则创建一个新的连接,
//					// 并替换此不可用的连接对象,如果创建失败返回 null
//					try {
//						conn = newConnection();
//					} catch (SQLException e) {
//						System.out.println(" 创建数据库连接失败! " + e.getMessage());
//						return null;
//					}
//					pConn.setConn(conn);
//				}
				
				
				break; // 己经找到一个可用的连接,退出
			}
		}
		return conn;// 返回找到到的可用连接
	}

//	private boolean testConnection(Connection conn) {
//		try {
//
//			// 判断测试表是否存在
//			if (testTable.equals("")) {
//				// 如果测试表为空,试着使用此连接的 setAutoCommit() 方法
//				// 来判断连接否可用(此方法只在部分数据库可用,如果不可用 ,
//				// 抛出异常)。注意:使用测试表的方法更可靠
//				conn.setAutoCommit(true);
//			} else {// 有测试表的时候使用测试表测试
//				// check if this connection is valid
//				Statement stmt = conn.createStatement();
//				stmt.execute("SELECT COUNT(*) FROM " + testTable);
//			}
//		} catch (SQLException e) {
//			// 上面抛出异常,此连接己不可用,关闭它,并返回 false;
//			closeConnection(conn);
//			return false;
//		}
//		// 连接可用,返回 true
//		return true;
//	}

	private Connection getFreeConnection() throws SQLException {
		// 从连接池中获得一个可用的数据库连接
		Connection conn = findFreeConnection();
		if (conn == null) {
			// 如果目前连接池中没有可用的连接
			// 创建一些连接
			createConnections(incrementalConnections);
			// 重新从池中查找是否有可用连接
			conn = findFreeConnection();

		}
		return conn;
	}

	public synchronized Connection getConnection() throws SQLException {
		// 确保连接池己被创建
		if (connections == null) {
			return null; // 连接池还没创建,则返回 null
		}
		
		Connection conn = getFreeConnection(); // 获得一个可用的数据库连接
		
		// 如果目前没有可以使用的连接,即所有的连接都在使用中
		
		while (conn == null) {
			// 等一会再试
			wait(250);
			conn = getFreeConnection(); // 重新再试,直到获得可用的连接,如果
			// getFreeConnection() 返回的为 null
			// 则表明创建一批连接后也不可获得可用连接
		}
		
		return conn;// 返回获得的可用的连接
	}
}

 

分享到:
评论

相关推荐

    java数据库连接池.rar

    C3P0、druid、JDBCTemplate

    jdbc—Java开发数据库连接

    jdcb—java开发中数据库连接,在Java开发中数据库的连接很重要 jdbc的使用可以解决这个问题

    java-JDCB.zip_JDCB_java教程

    Java_Servlet入门教程,JDBC代码手册,Java+Servlet和JSP教程

    JDCB树状结构与MySQL安装,内附视频讲解

    JDCB树状结构与MySQL安装,内附视频讲解,JDCB树状结构与MySQL安装,内附视频讲解,JDCB树状结构与MySQL安装,内附视频讲解,JDCB树状结构与MySQL安装,内附视频讲解,

    DbUtil-jdcb-connection

    很好用的JDBC

    原神官网 (采用HTML+CSS+JS+JDCB+Servlet+JSP+mysql).zip

    原生官网这个项目前端采用HTML+CSS+JS实现,后端采用JDCB+Servlet+JSP实现,数据库采用mysql,与北大青鸟易买网类似。附带项目答辩PPT

    SAP HANA JDCB

    Sap HaNa 数据库链接 jar包。可自定义Maven坐标 添加到私有库 想不要积分,CSDN 最低要求1积分 #mvn install:install-file -Dfile=C:\work\hanajdbclib\ngdbc.jar -DgroupId=sap.hana.jdbc -DartifactId=ngdbc -...

    jdbc的配置文件需要的下下啊

    jdbc的工具类,平时用的很顺手,今天共享出来给大伙,有需要的下下

    JDBC版本的增删改查

    这是我刚开始学JDCB 时的工程(刚整理出来)---Version1.0 : 表说明: 表名 customer 列名 cid ,cname, cpassword 工程说明:对单表的 增 删 改 查 。...

    JDBC访问数据库的几个步骤.doc

    Java中的驱动程序分为4类 1、JDBC-ODBC桥:将JDCB转为ODBC驱动。这里要求每个客户端都要装载ODBC驱动 2、部分Java技术的本地API驱动程序 3、全部Java技术的本地API驱动程序 4、全部基于Java技术的本地协议驱动程序

    jasync-sql:用Kotlin编写的Java和Kotlin MySQL和PostgreSQL异步数据库驱动程序

    是一个简单的,基于Netty,异步,高性能和可靠的数据库驱动程序,用于用Kotlin编写的PostgreSQL和MySQL。 入门 // Connection to MySQL DB Connection connection = MySQLConnectionBuilder . createConnection...

    原神官网 具有前后端的毕设.zip

    这个项目前端采用HTML+CSS+JS实现,后端采用JDCB+Servlet+JSP实现,后端实现了CRUD的操作,前端页面风格统一、美观,可以切换多种风格,现代风、古风等等,正在做毕业设计的小伙伴们或者有需要的小伙伴都可以下载...

Global site tag (gtag.js) - Google Analytics