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()); } } }
相关推荐
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种...通过pool连接池提高性能,并将数据库数据直接转成json对象,且封装了几种取值方式。比传统的ojdbc性能更快更高效
原包存在一个bug,请下载该版本 boolean delete(java.lang.String sql) 删除单条记录的方法,适用于简单的sql语句 boolean delete(java.lang.String sql, java.util.Map,java.lang.Object> elements) ...
6. 连接池:为了提高性能和资源利用率,项目可能使用了连接池(如C3P0、HikariCP、Apache DBCP),管理数据库连接的创建和释放,避免频繁创建和关闭连接带来的开销。 7. MVC架构:作为一个Java Web项目,可能会采用...
- 考虑使用连接池管理数据库连接,如C3P0或HikariCP,提高性能。 - SQL的书写应遵循最佳实践,避免全表扫描,优化查询效率。 - 注意处理异常,确保程序健壮性。 10. **实际应用**: 分页组件通常与前端UI结合,...
简易ORM操作工具,低代码,操作简单,功能强大,上手快,纯原生JDBC+阿里的Druid连接池,集成Mybatis-Plus的条件构造器,在此之上添加了多表连接的条件构造,使增删改查变得更容易,支持动态一对一(一对多)查询,...
Spring Boot 连接 Oracle 数据库 JDBC 配置步骤 在本文中,我们将详细介绍如何使用 Spring Boot 连接 Oracle 数据库,配置 JDBC 驱动程序,并实现数据库的基本操作。 Step 1: 添加依赖项 在 Spring Boot 项目中,...
在实际应用中,数据库连接池能够有效地解决原生JDBC操作数据库时的效率问题。例如,通过预创建和管理连接,避免了每次请求时的连接建立时间,降低了数据库资源的消耗。此外,连接池还能够管理和控制数据库连接的生命...
java原生jdbc的封装,目前阶段仅允许mysql驱动的接入,但是数据库连接池可以引入好多的了,比如alibaba的druid。 该orm允许面向实体类数据库操作,也可以自定义sql。 今后考虑加上代码的自动生成,考虑到不同项目...
JavaSE中的原生JDBC(Java Database Connectivity)是Java编程语言与各种数据库进行交互的一种标准接口。本课程的每日作业卷1主要涵盖了JDBC的基本操作,包括连接数据库、执行SQL语句以及对数据库数据的增删改查。...
数据库连接池是现代应用程序中管理数据库连接的重要工具,它的核心作用是提高数据库访问效率,减少系统资源消耗。在Java环境中,实现数据库连接池的方式多种多样,既可以集成到服务器容器(如Tomcat)的配置文件中,...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用C3P0可以有效地管理和复用数据库连接,避免频繁创建和销毁连接导致的性能开销。以下是使用C3P0配置和管理连接池的步骤...
JDBC连接步骤** 1. **加载驱动**:通过`Class.forName()`加载对应的数据库驱动类,例如`Class.forName("com.mysql.jdbc.Driver")`。 2. **建立连接**:使用`DriverManager.getConnection()`方法,传入数据库URL、...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在商城系统中,C3P0被用来管理数据库连接,提高系统性能。数据库连接池的主要作用是减少创建和释放连接的开销,当多个请求...
HikariCP是一款高效、高性能的JDBC连接池,它被设计为数据库连接管理的解决方案,以优化数据库访问性能和稳定性。在Java开发中,HikariCP因其极低的空闲连接开销和快速的连接创建速度而备受赞誉。然而,对于使用...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,提供了对JDBC连接的管理,包括连接的创建、分配、回收和释放。在商城系统中,数据库连接池的作用至关重要,它可以有效地管理和复用数据库连接,避免频繁创建...
在IT行业中,Java Database Connectivity(JDBC)是Java编程语言中用于与各种类型数据库交互的一组标准API。...在实际项目中,可能还需要考虑连接池管理、事务控制、异常处理等高级特性,以优化性能和稳定性。
2. 原生JDBC驱动:它使用原生的JDBC驱动,避免了额外的性能开销和复杂性。 3. 多种分片策略:支持丰富的分片算法,包括范围分片、哈希分片等。 4. SQL解析和重写:Sharding JDBC能够解析SQL语句,并根据分片策略将...
Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库...随着JDBC的不断优化,现代的JDBC驱动如JDBC 4.0及以上版本提供了更多的特性,如自动关闭资源、连接池等,进一步提高了开发效率和性能。
数据源(DataSource)接口是JDBC2.0中的一个重要概念,它是JDBC连接池的核心。DataSource提供了获取数据库连接的标准化方式,而不是直接使用`DriverManager.getConnection()`。通过DataSource,开发者可以配置连接池...
5. **连接池管理**:通过 JDBC 连接池,可以更有效地管理和重用连接,减少资源消耗。 在 Cloudera Enterprise 框架下,Hive JDBC 连接器还可能集成了其他 Cloudera 服务,如 Sentry(权限管理)和 Impala(实时查询...