[英]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.