`

我的JDBC工具类二(代理模式来创建自己的Connection)

阅读更多

创建数据库连接池:
package com.mengya.JDBCUitl;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;

public class DataSource {
 private InputStream inStream;

 private Properties pro;

 private static int initCount = 10;// 初始连接数

 private static int maxCount = 100;// 数据库最大连接数

 static int currentConnt = 0;// 当前数据库的连接数,同包能放问

 LinkedList<Connection> connectionpool = new LinkedList<Connection>();//同包能放问

 DataSource() {
  inStream = this.getClass().getResourceAsStream("/system.properties");
  pro = new Properties();
  try {
   pro.load(inStream);
   try {
    Class.forName(pro.getProperty("driver"));
    for(int i=0;i<initCount;i++){
     this.connectionpool.add(this.CreateConnection());
    }
   } catch (ClassNotFoundException e) {
    e.printStackTrace();
    throw new RuntimeException("注册数据库驱动错误!");
   }
  } catch (IOException e) {
   e.printStackTrace();
   throw new RuntimeException("加载配置文件出错!");
  }
 }
 //创建数据库连接...所有创建的Connection都是自己写的那个MyConnection,而在MyConnection的Close方法我又重写了***************
 private Connection CreateConnection() {
  Connection conn = null;
  try {
   conn = DriverManager.getConnection(pro.getProperty("url"), pro
     .getProperty("username"), pro.getProperty("password"));
  } catch (SQLException e) {
   e.printStackTrace();
   throw new RuntimeException("创建数据库连接时失败!");
  }
  currentConnt++;
  return new MyConnection(conn, this);
 }
 //得到数据库连接
 public Connection getConnection() {
  Connection conn = null;
  synchronized (connectionpool) {
   if (connectionpool.size() > 0) {
    conn = this.connectionpool.removeFirst();
   }
   else if(currentConnt<maxCount){
    conn = new MyConnection(this.CreateConnection(),this);
   }
   else{
    throw new RuntimeException("数据库已达到最大连接数!");
   }
  }
  return conn;
 }
 //释放数据库连接
 public void freeConnection(Connection conn){
  this.connectionpool.addLast(conn);
 }
 
}
在上面的数据库连接池中的Connection全都是下面自己写了MyConnection,目的就是为了使别人用的时候和普通的Connection一样,关键是自己写了MyConnection的close方法不是直

接关闭了,而是放到了数据库连接池当中去了.

创建自己的Connection类:
说明:MyConnection继承了Connection接口,所在MyConnection要实现接口中的所有方法,但这个接口实现起来非常复杂,并且和数据库有关.故在Myconnection构造方法中需要一个

真正的Connection对象,该对象可以由DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("username"), pro.getProperty("password"));
得到,这样在Myconnection中的方法就可以由传过来的Connectioin负责实现了.
自己写了一个MyConnection继承了Connection接口主要是为了改变它的close方法,在它的close方法时将Connection放到数据库连接池当中去,故构造方法也需要一个数据库连接池.


package com.mengya.JDBCUitl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Savepoint;
import java.sql.Statement;
import java.util.Map;

public class MyConnection implements Connection {

 private Connection conn;

 private DataSource ds;

 private int maxUseCount = 10;// 当前对象最大使用次数

 private int currentUseConnt = 0;// 当前本对象使用的次数

 public MyConnection(Connection conn, DataSource ds) {
  this.conn = conn;
  this.ds = ds;
 }
 public void clearWarnings() throws SQLException {
  this.conn.clearWarnings();
 }
 //这里的close方法才是我们最感趣的方法
 // close方法就是我要重写的方法
 public void close() throws SQLException {
  this.currentUseConnt++;//不能在始例化的时候作为使用的次数,因为始例化后就放到了数据库连结池当中去了
  if(currentUseConnt<maxUseCount){
   this.ds.connectionpool.addLast(this);
  }else{  
   this.conn.close();//关闭数据库连接.也是就这个对象已经达到了最大的使用次数,释放与数据库的连结,让数据库创建一个新的.
   this.ds.currentConnt--;//当前数据库连接个数
  } 
 }
 public void commit() throws SQLException {
  this.conn.commit();
 }
 public Statement createStatement() throws SQLException {
  return this.createStatement();
 }
 public Statement createStatement(int resultSetType, int resultSetConcurrency)
   throws SQLException {
  return this.createStatement(resultSetType, resultSetConcurrency);
 }
 ...Connection接口还有很多其它的方法,这里我就不写了,所有做法都和上面的一样,由构造方法传过来的Connectoin负责处理.
 
}

JDBC工具类(负责得到Connection和关闭资源):
package com.mengya.JDBCUitl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBConnectionUitl {
 private static DBConnectionUitl dbconuitl;

 private static DataSource ds;
 
 private DBConnectionUitl(){
  ds=new DataSource();
 }
 //单例模式,DBConnectionUitl只实例化一次
 public static DBConnectionUitl getDBConnectionUitl(){
  if(dbconuitl==null){
   synchronized (DBConnectionUitl.class) {
    if(dbconuitl==null){
     dbconuitl=new DBConnectionUitl();
    }
   }
  }
  return dbconuitl;
 }
 //得到Connection。(其实是我们自己实现了的MyConnection而不是DriverManager产生的Connection)
 public Connection getConnection(){
  return ds.getConnection();
 }
 
 public void free(ResultSet rs,Statement sta,Connection con){
  try {
   if(rs!=null){
    rs.close();
   }
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   try {
    if(sta!=null){
     sta.close();
    }
   } catch (Exception e) {
    e.printStackTrace();
   }finally{
    if(con!=null){
     try {
      con.close();//在这里就可以真接关掉,但它并不是正真的闭了,而在放到了数据库连接池当中去了。
     } catch (SQLException e) {
      e.printStackTrace();
     }
    }
   }
  }
 }
}

分享到:
评论

相关推荐

    JDBC的工具类

    在实际开发中,为了提高代码的可重用性和减少重复性工作,我们通常会创建一个JDBC工具类,将数据库连接、关闭资源等操作封装起来。以下是一个关于JDBC工具类的详细解释。 1. **JDBC工具类的作用** - 提高代码的可...

    JDBC工具类

    JDBC工具类是开发者为了简化JDBC操作而自定义的一组方法集合,通常包括数据库连接、SQL语句的执行、结果集处理等功能。封装JDBC工具类可以提高代码的可读性和复用性,减少重复的样板代码,使得数据库操作更加简洁...

    jdbc连接mysql工具类

    下面将详细介绍如何使用Eclipse作为开发环境,通过编写一个JDBC工具类来连接MySQL数据库,并实现基本的增删改查功能。 首先,我们需要引入MySQL的JDBC驱动,也就是`mysql-connector.jar`。这个库文件包含了连接...

    jdbc工具类

    **JDBC工具类详解** Java Database Connectivity(JDBC)是Java编程语言中用来规范客户端程序如何访问数据库的应用程序...在实际项目中,根据需求和场景选择合适的JDBC工具类设计模式,将极大提升开发效率和代码质量。

    Oracle jdbc 单例 工具类

    Oracle JDBC工具类是一种常见的设计模式应用,用于简化与Oracle数据库的交互。在Java编程中,JDBC(Java Database Connectivity)是连接Java应用程序和各种数据库的标准接口。Oracle JDBC驱动程序是Oracle公司提供的...

    JDBC非常实用的工具类

    对于初学者来说,使用JDBC工具类可以大大简化数据库操作,避免重复编写连接、关闭等代码,提升代码的可读性和可维护性。在实际开发中,有很多开源的JDBC工具类库,如Apache的DBUtils和MyBatis的SqlSession,它们已经...

    jdbc连接工具类 单例连接模式,进度1

    具体实现方式可能在名为“jdbc工具类连接单例模式0914”的文件中详细描述,包括如何初始化连接池,如何处理并发场景下的连接获取与释放,以及可能的异常处理机制。 总之,通过结合JDBC连接工具类和单例设计模式,这...

    jdbc连接oracle工具类

    总的来说,创建一个JDBC连接Oracle的工具类能帮助我们更方便、安全地管理和控制数据库连接,提高代码的可维护性和可复用性。在实际开发中,还需要注意异常处理、事务管理、连接池等高级话题,以优化性能和提高系统的...

    自己封装的JDBC工具类源码

    最近刚学习了JDBC,最后封装了一段简单的工具类,主要功能有: 1、执行sql语句返回单条查询结果; 2、执行查询语句sql返回结果集; 3、执行数据的插入,修改,删除; 4、执行批处理; 5、调用存储过程; 6、...

    jdbc工具类2

    1. **数据库连接**: JDBC工具类通常会提供一个静态方法来获取数据库连接。这个方法内部会使用`DriverManager.getConnection()`,需要传入数据库URL、用户名和密码。例如: ```java public static Connection get...

    java开发Servlet使用jdbc工具类

    分析和学习这些源代码可以帮助我们更好地理解和应用自定义的JDBC工具类,提升我们的Java Web开发效率。在实际项目中,这样的工具类库可以提高代码的可读性和可维护性,减少重复代码,同时降低出错的可能性。

    jdbc经典工具类

    1. **JDBC工具类**:JDBC工具类通常封装了数据库连接、预编译SQL语句、执行SQL、关闭资源等常见操作,以减少重复代码,提升开发效率。`connJdbcUtil`可能是一个实现了这些功能的Java类。 2. **数据库连接配置**:...

    JDBC工具类.txt

    ### JDBC工具类知识点详解 #### 一、JDBC概述与工具类的作用 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。...

    JDBC简单地工具类.rar

    7. **JDBC工具类设计** 为了简化JDBC操作,通常会封装一个工具类,将上述步骤整合成便捷的方法。这个资源中的"JDBC简单地工具类"可能就实现了这样的功能,提供如`queryBySql()`, `executeUpdateBySql()`等方法,...

    jdbc的工具类,获取connection

    包含oracle,msyql,sqlserver的连接工具类,方便整洁 包含oracle,msyql,sqlserver的连接工具类,方便整洁 包含oracle,msyql,sqlserver的连接工具类,方便整洁

    数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯

    在本文中,我们将深入探讨如何通过代理模式来实现JDBC的数据库连接池,以及这一技术的重要性和实际应用。 首先,让我们理解代理模式的基本概念。代理模式是一种设计模式,它提供了一个代理对象来控制对原始对象的...

    JDBC数据库操作工具类

    9. **重用连接池**:在实际应用中,为了提高性能和减少数据库连接创建与销毁的开销,工具类往往结合连接池(如C3P0、HikariCP或DBCP)来管理数据库连接。 10. **线程安全**:如果工具类在多线程环境中使用,需要...

    JDBC工具类和Druid数据连接池实现数据库数据增删查改操作

    先创建tb_brand数据库,创建Brand实现类,创建Brand的测试类完成下面操作,使用JDBC工具类操作步骤:完成MySQL的jar包加载,注册类的驱动,获取连接,定义SQL语句,获取SQL语句执行的Statement对象,执行SQL语句,...

    JDBC 工具类JdbcUtils封装与测试应用(针对mysql)

    JDBC工具类JdbcUtils的封装对于简化数据库操作、提高代码可读性和可维护性至关重要。本篇文章将深入探讨如何创建一个针对MySQL的JdbcUtils工具类,并进行测试应用。 首先,JdbcUtils的核心功能是管理数据库连接。...

Global site tag (gtag.js) - Google Analytics