创建数据库连接池:
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工具类的详细解释。 1. **JDBC工具类的作用** - 提高代码的可...
JDBC工具类是开发者为了简化JDBC操作而自定义的一组方法集合,通常包括数据库连接、SQL语句的执行、结果集处理等功能。封装JDBC工具类可以提高代码的可读性和复用性,减少重复的样板代码,使得数据库操作更加简洁...
下面将详细介绍如何使用Eclipse作为开发环境,通过编写一个JDBC工具类来连接MySQL数据库,并实现基本的增删改查功能。 首先,我们需要引入MySQL的JDBC驱动,也就是`mysql-connector.jar`。这个库文件包含了连接...
**JDBC工具类详解** Java Database Connectivity(JDBC)是Java编程语言中用来规范客户端程序如何访问数据库的应用程序...在实际项目中,根据需求和场景选择合适的JDBC工具类设计模式,将极大提升开发效率和代码质量。
Oracle JDBC工具类是一种常见的设计模式应用,用于简化与Oracle数据库的交互。在Java编程中,JDBC(Java Database Connectivity)是连接Java应用程序和各种数据库的标准接口。Oracle JDBC驱动程序是Oracle公司提供的...
对于初学者来说,使用JDBC工具类可以大大简化数据库操作,避免重复编写连接、关闭等代码,提升代码的可读性和可维护性。在实际开发中,有很多开源的JDBC工具类库,如Apache的DBUtils和MyBatis的SqlSession,它们已经...
具体实现方式可能在名为“jdbc工具类连接单例模式0914”的文件中详细描述,包括如何初始化连接池,如何处理并发场景下的连接获取与释放,以及可能的异常处理机制。 总之,通过结合JDBC连接工具类和单例设计模式,这...
总的来说,创建一个JDBC连接Oracle的工具类能帮助我们更方便、安全地管理和控制数据库连接,提高代码的可维护性和可复用性。在实际开发中,还需要注意异常处理、事务管理、连接池等高级话题,以优化性能和提高系统的...
最近刚学习了JDBC,最后封装了一段简单的工具类,主要功能有: 1、执行sql语句返回单条查询结果; 2、执行查询语句sql返回结果集; 3、执行数据的插入,修改,删除; 4、执行批处理; 5、调用存储过程; 6、...
1. **数据库连接**: JDBC工具类通常会提供一个静态方法来获取数据库连接。这个方法内部会使用`DriverManager.getConnection()`,需要传入数据库URL、用户名和密码。例如: ```java public static Connection get...
分析和学习这些源代码可以帮助我们更好地理解和应用自定义的JDBC工具类,提升我们的Java Web开发效率。在实际项目中,这样的工具类库可以提高代码的可读性和可维护性,减少重复代码,同时降低出错的可能性。
1. **JDBC工具类**:JDBC工具类通常封装了数据库连接、预编译SQL语句、执行SQL、关闭资源等常见操作,以减少重复代码,提升开发效率。`connJdbcUtil`可能是一个实现了这些功能的Java类。 2. **数据库连接配置**:...
### JDBC工具类知识点详解 #### 一、JDBC概述与工具类的作用 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。...
7. **JDBC工具类设计** 为了简化JDBC操作,通常会封装一个工具类,将上述步骤整合成便捷的方法。这个资源中的"JDBC简单地工具类"可能就实现了这样的功能,提供如`queryBySql()`, `executeUpdateBySql()`等方法,...
包含oracle,msyql,sqlserver的连接工具类,方便整洁 包含oracle,msyql,sqlserver的连接工具类,方便整洁 包含oracle,msyql,sqlserver的连接工具类,方便整洁
在本文中,我们将深入探讨如何通过代理模式来实现JDBC的数据库连接池,以及这一技术的重要性和实际应用。 首先,让我们理解代理模式的基本概念。代理模式是一种设计模式,它提供了一个代理对象来控制对原始对象的...
9. **重用连接池**:在实际应用中,为了提高性能和减少数据库连接创建与销毁的开销,工具类往往结合连接池(如C3P0、HikariCP或DBCP)来管理数据库连接。 10. **线程安全**:如果工具类在多线程环境中使用,需要...
先创建tb_brand数据库,创建Brand实现类,创建Brand的测试类完成下面操作,使用JDBC工具类操作步骤:完成MySQL的jar包加载,注册类的驱动,获取连接,定义SQL语句,获取SQL语句执行的Statement对象,执行SQL语句,...
JDBC工具类JdbcUtils的封装对于简化数据库操作、提高代码可读性和可维护性至关重要。本篇文章将深入探讨如何创建一个针对MySQL的JdbcUtils工具类,并进行测试应用。 首先,JdbcUtils的核心功能是管理数据库连接。...