Java JDBC和连接池选项
我必须使用SQLite数据库实现连接池和标准JDBCDAO。实现连接池以重用数据库连接以减少web应用程序开销的最简单选项是什么?以下是我编写的代码: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
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配置 以下是一些现成的实现:
- 使用纯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数据源吗?如果正在使用连接,我们不需要从池中删除它吗?