【问题标题】:JDBC and connection pools optionsJDBC 和连接池选项
【发布时间】:2011-09-30 01:44:07
【问题描述】:

我必须使用 SQLite 数据库实现连接池以及标准 JDBC DAO。实现将重用数据库连接以减少 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;
    }
}

【问题讨论】:

  • 最简单的就是不写一个

标签: java jsp jakarta-ee jdbc connection-pooling


【解决方案1】:

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

但是,如果您想要最简单的自定义池实现,您可以使用一些合理大小的圆形数组,例如 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 个连接几乎没有意义。因此,您可能希望至少在您的 SQLite 类中添加一个 isBusy() 方法,并实现您的仲裁器类,以便它搜索第一个没有破产的 SQLite 并使用那个,仅当所有现有实例都忙时(并且仅当数组中仍有空间用于新实例时)才分配新实例。

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

【讨论】:

  • 你不必使用JNDI数据源吗?如果连接正在被使用,我们不需要将它从池中移除吗?
【解决方案2】:

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

如果是 Web 应用程序,当代所有主流应用程序服务器都包含数据库连接池,通常通过 JNDI 配置。 Here is an overview of how to set up JNDI-based connection pooling in Tomcat.

这里有一些现成的实现:

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多