JDBC和连接池选项

时间:2011-07-07 00:05:21

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

我必须使用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;
    }
}

3 个答案:

答案 0 :(得分:2)

不要编写自己的数据库连接池。有许多非常好的开源实现。

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

以下是一些现成的实施:

答案 1 :(得分:2)

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

但是,如果你想要最简单的自定义池实现,你可以使用一个合理大小的循环数组,比如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个连接几乎没有意义,直到应用程序实际需要那么多。因此,您可能希望至少向isBusy()类添加SQLite方法,并实施仲裁类,以便搜索第一个SQLite使用那个,只在所有现有实例都忙时才分配一个新的(并且只有当数组中仍有空间用于新实例时)。

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

答案 2 :(得分:0)

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

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

这些问题已经解决,不再有趣解决。编写自己的连接池很难做到正确且难以测试。除非你有充分的理由自己编写,我强烈推荐使用Hibernate和C3P0。