ormlite JdbcPooledConnectionSource 正确用法

ormlite JdbcPooledConnectionSource correct usage

我们正在使用 JavaFx 开发一个新的桌面应用程序,其中我们使用 SQLite 进行离线存储,而对于 orm,我们使用 ormlite。

我想实现数据库连接池,其中应该在开始时设置固定数量的连接,并根据需要使用、释放和重用。另外,如果我们可以适当地利用 "readonly" 和 "writeonly" 连接来最大化性能,那就太好了。

这就是我们目前所写的内容。

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;
    }
}

这里的问题是每次我们创建 table (TableUtils.createTableIfNotExists) 时,池连接源正在建立一个新连接而不是重用之前的连接 used/created。

在 Internet 上找不到足够的代码示例来说明如何正确使用 JdbcPooledConnectionSource。

JdbcPooledConnectionSource correct usage

您使用的是哪个 SQLite 驱动程序? Xerial 驱动程序将 Sqlite 代码实际编译到 Jar 中。这意味着您实际上并不是 "connecting" 另一个数据库,只是直接调用该数据库,即使它前面有一个 JDBC 接口。

这意味着您真的不需要JdbcPooledConnectionSource。只有当您通过网络连接到数据库服务器时,池连接才真正有用。如果您查看您的应用程序,您应该看到文件描述符(如果在 Linux 中,则在 /prod/#/fd 中),它显示打开的 FD 到数据库而不是套接字。

The problem here is everytime we are creating table (TableUtils.createTableIfNotExists) the pooled connection source is making a new connection and not reusing the one earlier used/created.

嗯。我在池连接源周围的单元测试中有一些很好的覆盖。我很惊讶听到它没有重用连接。你能给我一个单元测试来演示吗?