ormlite JdbcPooledConnectionSource正确用法

时间:2015-10-04 04:23:30

标签: java sqlite ormlite

我们正在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。

1 个答案:

答案 0 :(得分:0)

  

JdbcPooledConnectionSource正确用法

您使用的是哪个SQLite驱动程序? Xerial驱动程序将Sqlite代码实际编译到Jar中。这意味着您实际上并没有“连接”到另一个数据库,只是直接调用数据库,即使它是由JDBC接口提供的。

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

  

这里的问题是每当我们创建表(TableUtils.createTableIfNotExists)时,池化连接源正在建立新连接而不重用之前使用/创建的连接。

槽糕。我在围绕池连接源的单元测试中有一些很好的覆盖。我很惊讶地发现它没有重复使用连接。你能给我一个单元测试来证明吗?