我们正在JavaFx中开发一个新的桌面应用程序,其中对于离线存储,我们使用的是SQLite,而对于orm,我们使用的是ormlite。
我想实现数据库连接池,其中应该在开始时设置固定数量的连接,并且应该根据需要使用,释放和重用。此外,如果我们能够恰当地使用“只读”和“写入”连接以最大化性能,那将是一件好事。
这是我们到目前为止所写的内容。
public class DAO {
private static JdbcPooledConnectionSource connectionSource;
private static DAO instance = null;
private DAO() throws SQLException {
try {
final File path = SystemUtils.getDatabaseFile();
final String DATABASE_URL = Constants.DATABASE_URL + path.getAbsolutePath();
Class.forName(Constants.DATABASE_DRIVER);
connectionSource = new JdbcPooledConnectionSource(DATABASE_URL);
//connectionSource.setMaxConnectionAgeMillis(5 * 60 * 1000);
connectionSource.setCheckConnectionsEveryMillis(5000);
connectionSource.setMaxConnectionsFree(5);
connectionSource.initialize();
init();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void init() throws ClassNotFoundException, SQLException {
TableUtils.createTableIfNotExists(connectionSource, Customer.class);
TableUtils.createTableIfNotExists(connectionSource, Address.class);
TableUtils.createTableIfNotExists(connectionSource, Location.class);
TableUtils.createTableIfNotExists(connectionSource, City.class);
TableUtils.createTableIfNotExists(connectionSource, Area.class);
TableUtils.createTableIfNotExists(connectionSource, Category.class);
TableUtils.createTableIfNotExists(connectionSource, Product.class);
TableUtils.createTableIfNotExists(connectionSource, AddonCategory.class);
TableUtils.createTableIfNotExists(connectionSource, ProductAddon.class);
}
public synchronized <D extends Dao<T, ?>, T> D getDao(Class<T> cls) throws SQLException {
Dao<T, ?> dao = DaoManager.createDao(connectionSource, cls);
D daoImpl = (D) dao;
return daoImpl;
}
public synchronized static DAO getInstance() throws SQLException {
if (instance == null) instance = new DAO();
return instance;
}
}
这里的问题是每当我们创建表(TableUtils.createTableIfNotExists)时,池化连接源正在建立新连接而不重用之前使用/创建的连接。
在Internet上没有找到足够的代码示例来说明如何正确使用JdbcPooledConnectionSource。
答案 0 :(得分:0)
JdbcPooledConnectionSource正确用法
您使用的是哪个SQLite驱动程序? Xerial驱动程序将Sqlite代码实际编译到Jar中。这意味着您实际上并没有“连接”到另一个数据库,只是直接调用数据库,即使它是由JDBC接口提供的。
这意味着您确实不需要JdbcPooledConnectionSource
。当您通过网络连接到数据库服务器时,池化连接实际上只有帮助。如果你查看你的应用程序,你应该看到文件描述符(如果在Linux中,在/ prod /#/ fd中)显示开放FD到数据库而不是套接字。
这里的问题是每当我们创建表(TableUtils.createTableIfNotExists)时,池化连接源正在建立新连接而不重用之前使用/创建的连接。
槽糕。我在围绕池连接源的单元测试中有一些很好的覆盖。我很惊讶地发现它没有重复使用连接。你能给我一个单元测试来证明吗?