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