Java JDBC和连接池选项

Java JDBC和连接池选项,java,jsp,jakarta-ee,jdbc,connection-pooling,Java,Jsp,Jakarta Ee,Jdbc,Connection Pooling,我必须使用SQLite数据库实现连接池和标准JDBCDAO。实现连接池以重用数据库连接以减少web应用程序开销的最简单选项是什么?以下是我编写的代码: package persistance; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public c

我必须使用SQLite数据库实现连接池和标准JDBCDAO。实现连接池以重用数据库连接以减少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配置

以下是一些现成的实现:


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

如果是web应用程序,所有主流的当代应用程序服务器都包括数据库连接池,通常通过JNDI配置

以下是一些现成的实现:


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

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


      这些问题已经解决,解决起来不再有趣。编写自己的连接池将很难正确进行,也很难进行测试。除非您有充分的理由编写自己的连接池,否则我强烈建议您使用Hibernate和C3P0。

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

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


      这些问题已经解决,解决起来不再有趣。编写自己的连接池将很难正确进行,也很难进行测试。除非你有很强的编写自己的理由,我强烈建议Hibernate和C3P0.

      ,正如其他人提到的,有许多预构建的解决方案你可能需要考虑。 但是,如果您想要最简单的自定义池实现,可以使用大小合理的循环数组,如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个连接之前,分配和打开100个连接几乎没有意义。因此,您可能希望至少在
      SQLite
      类中添加一个
      isBusy()
      方法,并实现仲裁器类,以便它搜索第一个不是bust的
      SQLite
      ,并使用该方法,仅在所有现有实例都忙时分配一个新的方法(且仅当阵列中仍有空间容纳新阵列时)


      您可能还希望您的
      SQLite
      类在
      query()中验证连接是否仍处于打开状态< /代码>,因为大多数数据库将关闭一个连接,如果它闲置太长时间。这是至少在连接池中偶尔会发生的事情。

      正如其他人提到的,有许多预构建的解决方案,您可能需要考虑。 但是,如果您想要最简单的自定义池实现,您可以使用一个大小合理的循环数组,如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个连接之前,分配和打开100个连接几乎没有意义。因此,您可能至少需要添加一个
      isBusy()
      方法,并实现仲裁器类,以便它搜索第一个不是bust的
      SQLite
      ,并使用该类,仅当所有现有实例都忙时(并且仅当数组中仍有空间容纳新实例时)才分配新实例


      您可能还希望您的
      SQLite
      类在
      query()中验证连接是否仍处于打开状态
      ,因为大多数数据库都会在连接闲置太长时间后关闭连接。这肯定会在连接池中偶尔发生。

      最简单的事情是不写一个。最简单的事情是不写一个。你不需要使用JNDI数据源吗?如果正在使用连接,我们不需要吗从池中删除它?您不需要使用JNDI数据源吗?如果正在使用连接,我们不需要从池中删除它吗?