`

原生jdbc连接池

 
阅读更多
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;

import javax.sql.DataSource;

/**
 * 原生jdbc连接池
 * 
 * @author guweiqiang
 */
public class JdbcPool implements DataSource{
	
	/**
	 * 使用LinkedList存放数据库连接池中的连接
	 */
	private static LinkedList<Connection> connList = new LinkedList<Connection>();
	
	/**
	 * 在静态代码块中加载db.properties数据库配置文件
	 */
	static {
		InputStream is = JdbcPool.class.getClassLoader().getResourceAsStream("mysql/db.properties");
		Properties prop = new Properties();
		
		try {
			// 获取配置文件参数
			prop.load(is);
			String driver = prop.getProperty("driver");
			String url = prop.getProperty("url");
			String user = prop.getProperty("user");
			String password = prop.getProperty("password");
			int initPoolSize = Integer.parseInt(prop.getProperty("initPoolSize"));
			
			//加载数据库驱动
            Class.forName(driver);
            
            // 初始化连接池
            Connection conn = null; // 连接对象
            for (int i = 0; i < initPoolSize; i++) {
            	conn = DriverManager.getConnection(url, user, password);
            	connList.add(conn);
            }
			
		} catch (Exception e){
			e.printStackTrace();
		}
		
	}
	

	@Override
	public PrintWriter getLogWriter() throws SQLException {
		return null;
	}

	@Override
	public void setLogWriter(PrintWriter out) throws SQLException {
		
	}

	@Override
	public void setLoginTimeout(int seconds) throws SQLException {
		
	}

	@Override
	public int getLoginTimeout() throws SQLException {
		return 0;
	}

	@Override
	public <T> T unwrap(Class<T> iface) throws SQLException {
		return null;
	}

	@Override
	public boolean isWrapperFor(Class<?> iface) throws SQLException {
		return false;
	}

	/**
	 * 获取数据库连接
	 */
	@Override
	public Connection getConnection() throws SQLException {
		// 如果数据库连接池中的连接对象数>0
		if(connList.size()>0){
			// 从数据库连接池中pop出一个连接对象
			final Connection conn = connList.removeFirst();
			System.out.println("连接池剩余连接数:" + connList.size());
			
			// 返回Connection对象
			return (Connection)Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler(){

				@Override
				public Object invoke(Object proxy, Method method, Object[] args)
						throws Throwable {
					if(!"close".equals(method.getName())){ // 非close方法,正常调用
						return method.invoke(conn, args);
					} else { // close方法,释放连接
						connList.add(conn); // 放还到连接池中
						System.out.println(conn + "被还给数据库连接池了!!");
						System.out.println("放还后连接池连接数:" + connList.size());
						return null;
					}
				}
			});
			
		} else {
			throw new RuntimeException("对不起,数据库忙");
		}
	}

	@Override
	public Connection getConnection(String username, String password)
			throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}

}

 

mysql/db.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://172.19.59.48:3306,172.19.59.50:3306/mysql?autoReconnect=true
user=root
password=123456
initPoolSize=5

 

测试代码:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class TestJdbcPool {
	
	private static JdbcPool pool = new JdbcPool();

	public static void main(String[] args) {
		List<User> userList = new ArrayList<User>();
		Connection conn = null;
		Statement stmt = null;
		
		try {
			// 建立连接
			conn = pool.getConnection();
			
			String sql = "select * from student";
			stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			while (rs.next()) {
				User user = new User();
				user.setName(rs.getString("name"));
				user.setAge(rs.getInt("age"));
				userList.add(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}

		for(User user : userList){
			System.out.println("name:" + user.getName() + "\t age:" + user.getAge());
		}
	}

}

 

 

分享到:
评论

相关推荐

    java jdbc原生连接+连接池.zip

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种...通过pool连接池提高性能,并将数据库数据直接转成json对象,且封装了几种取值方式。比传统的ojdbc性能更快更高效

    jdbc 帮助类 java 自带连接池 v1.01

    原包存在一个bug,请下载该版本 boolean delete(java.lang.String sql) 删除单条记录的方法,适用于简单的sql语句 boolean delete(java.lang.String sql, java.util.Map,java.lang.Object&gt; elements) ...

    原生jdbc超市订单管理系统

    6. 连接池:为了提高性能和资源利用率,项目可能使用了连接池(如C3P0、HikariCP、Apache DBCP),管理数据库连接的创建和释放,避免频繁创建和关闭连接带来的开销。 7. MVC架构:作为一个Java Web项目,可能会采用...

    java基于原生的MySql的JDBC分页组件

    - 考虑使用连接池管理数据库连接,如C3P0或HikariCP,提高性能。 - SQL的书写应遵循最佳实践,避免全表扫描,优化查询效率。 - 注意处理异常,确保程序健壮性。 10. **实际应用**: 分页组件通常与前端UI结合,...

    Spring boot连接oracle数据库JDBC配置步骤

    Spring Boot 连接 Oracle 数据库 JDBC 配置步骤 在本文中,我们将详细介绍如何使用 Spring Boot 连接 Oracle 数据库,配置 JDBC 驱动程序,并实现数据库的基本操作。 Step 1: 添加依赖项 在 Spring Boot 项目中,...

    数据库连接池PPT,待完成

    在实际应用中,数据库连接池能够有效地解决原生JDBC操作数据库时的效率问题。例如,通过预创建和管理连接,避免了每次请求时的连接建立时间,降低了数据库资源的消耗。此外,连接池还能够管理和控制数据库连接的生命...

    JavaSE-原生jdbc-每日作业卷1

    JavaSE中的原生JDBC(Java Database Connectivity)是Java编程语言与各种数据库进行交互的一种标准接口。本课程的每日作业卷1主要涵盖了JDBC的基本操作,包括连接数据库、执行SQL语句以及对数据库数据的增删改查。...

    数据库连接池的实现java

    数据库连接池是现代应用程序中管理数据库连接的重要工具,它的核心作用是提高数据库访问效率,减少系统资源消耗。在Java环境中,实现数据库连接池的方式多种多样,既可以集成到服务器容器(如Tomcat)的配置文件中,...

    jdbk连接驱动

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用C3P0可以有效地管理和复用数据库连接,避免频繁创建和销毁连接导致的性能开销。以下是使用C3P0配置和管理连接池的步骤...

    jdbc jar包

    JDBC连接步骤** 1. **加载驱动**:通过`Class.forName()`加载对应的数据库驱动类,例如`Class.forName("com.mysql.jdbc.Driver")`。 2. **建立连接**:使用`DriverManager.getConnection()`方法,传入数据库URL、...

    原生servlet+C3P0数据库连接池搭建的商城系统.zip

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在商城系统中,C3P0被用来管理数据库连接,提高系统性能。数据库连接池的主要作用是减少创建和释放连接的开销,当多个请求...

    hikari-cp:HikariCP JDBC连接池的Clojure包装器

    HikariCP是一款高效、高性能的JDBC连接池,它被设计为数据库连接管理的解决方案,以优化数据库访问性能和稳定性。在Java开发中,HikariCP因其极低的空闲连接开销和快速的连接创建速度而备受赞誉。然而,对于使用...

    原生servlet+C3P0数据库连接池搭建的商城系统.7z

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,提供了对JDBC连接的管理,包括连接的创建、分配、回收和释放。在商城系统中,数据库连接池的作用至关重要,它可以有效地管理和复用数据库连接,避免频繁创建...

    JDBC连接2008SQL数据库驱动Jar包

    在IT行业中,Java Database Connectivity(JDBC)是Java编程语言中用于与各种类型数据库交互的一组标准API。...在实际项目中,可能还需要考虑连接池管理、事务控制、异常处理等高级特性,以优化性能和稳定性。

    Sharding JDBC PPT 分享

    2. 原生JDBC驱动:它使用原生的JDBC驱动,避免了额外的性能开销和复杂性。 3. 多种分片策略:支持丰富的分片算法,包括范围分片、哈希分片等。 4. SQL解析和重写:Sharding JDBC能够解析SQL语句,并根据分片策略将...

    java jdbc连接数据库大全

    Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库...随着JDBC的不断优化,现代的JDBC驱动如JDBC 4.0及以上版本提供了更多的特性,如自动关闭资源、连接池等,进一步提高了开发效率和性能。

    java-JDBC学习笔记(java连接数据库编程)

    数据源(DataSource)接口是JDBC2.0中的一个重要概念,它是JDBC连接池的核心。DataSource提供了获取数据库连接的标准化方式,而不是直接使用`DriverManager.getConnection()`。通过DataSource,开发者可以配置连接池...

    hive_jdbc_2.5.20.zip

    5. **连接池管理**:通过 JDBC 连接池,可以更有效地管理和重用连接,减少资源消耗。 在 Cloudera Enterprise 框架下,Hive JDBC 连接器还可能集成了其他 Cloudera 服务,如 Sentry(权限管理)和 Impala(实时查询...

    JDBC数据库连接讲义.zip

    2. **JDBC连接过程** 要使用JDBC,首先需要加载并注册驱动,然后创建数据库连接。这通常包括以下步骤: - 加载驱动:`Class.forName("com.mysql.jdbc.Driver")` - 创建连接:`Connection conn = DriverManager....

    MyBatis面试题 37道1

    使用连接池可以改善,但在JDBC中需自行实现。 - SQL语句、参数设置和结果集处理硬编码,不利于维护。SQL变动需要修改代码并重新部署。 - 使用PreparedStatement传参数有硬编码问题,对于where条件数量不定的情况,...

Global site tag (gtag.js) - Google Analytics