繁体   English   中英

JDBC 和连接池选项

[英]JDBC and connection pools options

我必须实现一个连接池以及标准 JDBC DAO 和一个 SQLite 数据库。 实现将重用数据库连接以减少 web 应用程序开销的连接池的最简单选项是什么? 这是我编码的内容:

package persistance;

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

public class SQLite {

    Connection conn = null;
    Statement stat = null;

    public SQLite(String path) {
        String dbPath = path + "GTI525.db";
        System.out.println(dbPath);
        try {
            Class.forName("org.sqlite.JDBC");
            conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
            stat = conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public ResultSet query(String sql) {
        ResultSet rs = null;
        try {
            rs = stat.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }
}

不要编写自己的数据库连接池。 有许多很棒的现成开源实现。

如果是 web 应用程序,当代所有主流应用程序服务器都包含数据库连接池,通常通过 JNDI 配置。 下面概述了如何在 Tomcat 中设置基于 JNDI 的连接池

以下是一些现成的实现:

正如其他人所提到的,您可能需要考虑许多预构建的解决方案。

但是,如果您想要最简单的自定义池实现,您可以使用一些合理大小的圆形数组,例如 100。然后只需使用SQLite对象填充它,并在它前面放置一些仲裁器,将查询交给大批。 就像是:

public ResultSet runQuery(String sql) {
    SQLite connection = null;

    synchronized(this) {
        connection = connectionArray[currentIndex];
        currentIndex++;
        if (currentIndex >= connectionArray.length) {
            currentIndex = 0;
        }
    }

    return connection.query(sql);
}

然而,实际上,在应用程序实际需要那么多连接之前,分配和打开 100 个连接几乎没有意义。 As such, you would probably want to, at a minimum, add an isBusy() method to your SQLite class, and implement your arbiter class such that it searches for the first SQLite that is not bust and uses that one, allocating a new one仅当所有现有实例都忙时(并且仅当阵列中仍有空间用于新实例时)。

您可能还希望您的SQLite class 验证连接在query()中是否仍然打开,因为如果连接空闲时间过长,大多数数据库将关闭连接。 这是至少偶尔会在您的连接池中发生的事情。

直接使用 JDBC 并创建自己的连接池已不再流行!

我强烈建议查看 ORM 实现,例如 Hibernate。 然后,您可以将 C3P0 插入其中,以提供连接池。

这些问题已经解决,不再需要解决。 编写自己的连接池将很难正确且难以测试。 除非你有强烈的理由自己编写,否则我强烈推荐 Hibernate 和 C3P0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM