`

数据库连接池的实现(含等待处理)

阅读更多
这是一个数据库连接池实现的例子,简单实现,含连接等待处理。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import org.lt.cj.config.ServerProperty;

//代理连接类
public class MyDataSource {

    private static MyDataSource instance = new MyDataSource();
    private static String driver = "com.mysql.jdbc.Driver";
    private static String url = "jdbc:mysql://127.0.0.1:3306/tmall";
    private static String user = "root";
    private static String password = "123456";
    private static int initCount = 3; // 初始化连接数
    private static int maxCount = 10; // 最大连接数
    private static int timeout = 100; //连接用完后再次获取连接间隔时间(毫秒)
    int currentCount = 0; // 当前连接数
    // LinkedList方便入列出列操作,性能比ArrayList好
    private final LinkedList<Connection> connectionsPool = new LinkedList<Connection>();

    public MyDataSource() {
        try {
            for (int i = 0; i < this.initCount; i++) {
                // 把初始化的连接对象存放到链表里面
                this.connectionsPool.addLast(this.createConnection());
                this.currentCount++;
            }
        } catch (SQLException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public static MyDataSource getInstance() {
        return instance;
    }

    //静态内部类在没有新建对象的情况下也可以加载
    static {
        ServerProperty sp = new ServerProperty();
        driver = sp.getValue("driver");
        url = sp.getValue("databaseUrl");
        user = sp.getValue("username");
        password = sp.getValue("password");
        initCount = Integer.parseInt(sp.getValue("initCount"));
        maxCount = Integer.parseInt(sp.getValue("maxCount"));
        timeout = Integer.parseInt(sp.getValue("timeout"));
        sp.closeI();

        try {
            Class.forName(driver);// 加载驱动程序,供调用,只执行一次
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public Connection getConnection() {
        synchronized (connectionsPool) {
            if (this.connectionsPool.size() > 0) { // 从链表里面删除头一个连接对象,并返回该连接对象
                return this.connectionsPool.removeFirst();
            }
            if (this.currentCount < maxCount) {
                try {
                    this.currentCount++;
                    return this.createConnection();
                } catch (SQLException ex) {
                    return null;  //无法创建连接,返回空
                }
            }
            return getConnection(timeout);
        }
    }

    /**
     *   根据指定延时取得一个连接
     */
    public synchronized Connection getConnection(long timeout) {
        Connection con = null;
        while ((con = getConnection()) == null) {
            try {
                Thread.sleep(timeout);
            } catch (InterruptedException e) {
            }
        }
        return con;
    }

    // 释放连接,把当前连接加到链表尾,并没有真正关闭
    public void free(Connection conn) {
        synchronized (connectionsPool) {
            this.connectionsPool.addLast(conn);
        }
    }

    // 父类引用指向子类对象,生成一个实现对象供使用
    private Connection createConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }
}



配置文件读取类:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ServerProperty {

    private Properties prop = null;
    private InputStream in = null;

    public ServerProperty() {
        initProperty();
    }

    public ServerProperty(String path) {
        try {
            prop = new Properties();
            in = new FileInputStream(path);
        } catch (FileNotFoundException ex) {
        }
    }

    private void initProperty() {
        try {
            prop = new Properties();
            in = new FileInputStream("conf/database.properties");
        } catch (FileNotFoundException ex) {
        }
    }

    private void setIs() {
        try {
            if (in == null) {
                in = new FileInputStream("conf/database.properties");
            }
        } catch (IOException ex) {
        }
    }

    public Properties getProperty() {
        try {
            setIs();
            prop.load(in);
        } catch (IOException ex) {
        }
        return prop;
    }

    public String getValue(String key) {
        String value = "";
        try {
            setIs();
            prop.load(in);
            value = prop.getProperty(key);
        } catch (IOException ex) {
        }
        return value;
    }

    public void closeI() {
        try {
            if (in != null) {
                in.close();
            }
        } catch (IOException ex) {
        }
    }
}



工程项目目录下的文件:conf/database.properties
内容:
#Oracle config#
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@192.168.0.23:1521:ora10g
#user=openlab
#password=open123

#Mysql config#
driver=com.mysql.jdbc.Driver
databaseUrl=jdbc:mysql://127.0.0.1:3306/tmall
username=root
password=123456
#初始连接数
initCount=3
#最大连接数
maxCount=20
#连接用完后再次获取连接间隔时间(毫秒)
timeout=100


调用:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class CollectImpl implements ICollectDao {

    private static final MyDataSource ds = new MyDataSource();
    private static Connection conn = null;

    public Connection getConnection() {
        return (Connection) ds.getConnection(); 
    }

    //释放操作
    public void closePsRs(PreparedStatement ps, ResultSet rs) {
        try {
            if (ps != null) {
                ps.close();
            }
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException ex) {
        }
    }

    public void free(Connection conn) {
        ds.free(conn);
    }

    //对分类表进行操作
    public void insertCategory(String name, int firstCate, int secondCate, String lanFrom, String toLan, int updated) {
        conn = getConnection();
        System.out.println("---------" + conn);
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "INSERT INTO `" + lanFrom + "_category` (`name`,`first_cate`,`second_cate`,`orig_lan`,`to_lan`,`updated`) VALUES(?,?,?,?,?,?)";
        try {
            ps = (PreparedStatement) conn.prepareStatement(sql);
            ps.setString(1, name);
            ps.setInt(2, firstCate);
            ps.setInt(3, secondCate);
            ps.setString(4, lanFrom);
            ps.setString(5, toLan);
            ps.setInt(6, updated);
            ps.executeUpdate();
        } catch (SQLException ex) {
        } finally {
            closePsRs(ps, rs);
            free(conn);
        }
    }
}

分享到:
评论

相关推荐

    C#高效数据库连接池源码

    `ConnectionPool`可能是项目或类库的命名空间或类,包含实际的数据库连接池实现;`Demo`可能是一个示例应用程序,展示如何使用自定义的数据库连接池。 5. **连接池实现细节**: - **初始化**:在应用程序启动时,...

    数据库连接池代码实现

    数据库连接池是现代应用程序开发中的重要组成部分,尤其是在处理大量数据交互的应用中,它极大地提高了数据库操作的效率和系统的稳定性。数据库连接池的概念是预先创建并维护一定数量的数据库连接,这些连接可以被多...

    delphi实现数据库连接池

    在Delphi这个强大的Windows应用程序开发环境中,实现数据库连接池能够有效地解决频繁创建和销毁数据库连接带来的性能问题。下面我们将详细探讨如何在Delphi中实现数据库连接池,以及其核心概念和优势。 数据库连接...

    数据库连接池的实现(很完整(支持多种数据库

    综上所述,这个压缩包提供了一个全面的数据库连接池实现,适用于多种数据库,包括源码和测试,对于学习和开发数据库相关的应用程序具有很高的价值。通过研究和使用这个实现,开发者可以更好地理解和优化自己项目的...

    MySql数据库连接池C#代码(有注释含测试代码)

    总的来说,这个代码示例提供了一个基础的MySQL数据库连接池实现,可以作为学习和开发的起点。然而,正如描述中提到的,代码可能存在优化空间,比如错误处理、性能调优等方面,建议开发者根据具体需求进行修改和完善...

    自定义的数据库连接池

    7. **连接池实现**:常见的开源数据库连接池实现有C3P0、DBCP、HikariCP、Druid等。自定义连接池需要考虑如何实现这些功能,例如使用`java.sql.Connection`接口和`java.sql.DataSource`接口来管理数据库连接。 8. *...

    JSP数据库连接池连接实例

    在JSP中,常见的数据库连接池实现有C3P0、Apache DBCP、HikariCP和Tomcat JDBC Connection Pool等。这些连接池库提供了API供开发者使用。例如,Tomcat JDBC Connection Pool可以集成到Web应用中,通过配置`context....

    数据库连接池完美讲解(含源码)

    常见的数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等。其中,HikariCP以其优秀的性能和稳定性受到广泛欢迎,它的设计理念是“快速失败”和“快速恢复”,提供了极低的连接创建和销毁开销,以及高效的连接...

    手动设计自定义数据库连接池

    这时候,就需要手动设计并实现一个自定义的数据库连接池。实现自定义连接池的关键步骤如下: 1. **初始化连接池**:定义连接池的最大连接数、初始连接数等参数,并根据这些参数创建初始的连接。 2. **提供获取连接...

    数据库连接池的图解原理

    常见的数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等。其中,HikariCP以其优秀的性能和稳定性受到许多开发者的青睐,它通过零拷贝、最小化锁竞争等手段优化了连接管理,降低了系统开销。 数据库连接池除了...

    各种数据库连接池

    标题中提到的"各种数据库连接池",包括了c3p、DBCP和Proxool,这些都是Java环境下常见的数据库连接池实现: 1. **C3P0**:这是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。...

    几种数据库连接池详细配置

    在IT领域,数据库连接池是优化数据库访问性能的关键技术之一,尤其在高并发的应用场景下,合理配置数据库连接池能够显著提升系统响应速度并降低资源消耗。本文将深入解析几种常用的数据库连接池——Apache DBCP、C3P...

    数据库连接池的例子数据库连接池的例子

    在实际应用中,有许多成熟的数据库连接池实现,例如 Apache 的 DBCP、C3P0、HikariCP 等,它们提供了更完善的功能,如连接健康检查、自动重连、连接超时处理等,提高了系统的稳定性和效率。开发人员可以根据项目需求...

    C# 数据库连接池实例

    数据库连接池是数据库管理中的一个重要概念,特别是在使用像C#这样的编程语言进行数据库操作时,它的存在极大地...通过合理的配置和编程实践,我们可以充分利用数据库连接池带来的优势,实现高效、稳定的数据库访问。

    jsp连接数据库连接池代码示例

    为了提高应用程序的性能和资源管理,我们通常会使用数据库连接池。本示例将深入讲解如何在JSP中利用连接池进行数据库连接,以"ConnectionPool.java"作为连接池类,并通过"verifylogin.jsp"和"Login1.jsp"展示实际...

    winform数据库连接池源码

    `SqlConnectionPool`就是一种针对SQL Server数据库的连接池实现,它通过管理和重用已建立的数据库连接,减少了创建和销毁连接的开销。 数据库连接池的基本原理是:当一个应用请求一个新的数据库连接时,连接池不会...

    数据库连接池选型

    通过上述配置,开发者可以实时查看数据库连接池的状态,包括连接数、活跃连接、等待队列长度等,从而对系统性能进行调优。 总结,数据库连接池的选型需要考虑其性能、易用性、监控能力等因素。阿里Druid凭借其丰富...

    JAVA数据库连接池类

    数据库连接池是Java应用程序中管理数据库连接的一种高效策略,它能显著提高系统性能并减少资源消耗。本篇文章将深入解析一个...理解并掌握数据库连接池的原理和实现,对于优化Java应用程序的性能和稳定性至关重要。

Global site tag (gtag.js) - Google Analytics