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.
嗯。我在池连接源周围的单元测试中有一些很好的覆盖。我很惊讶听到它没有重用连接。你能给我一个单元测试来演示吗?
我们正在使用 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.
嗯。我在池连接源周围的单元测试中有一些很好的覆盖。我很惊讶听到它没有重用连接。你能给我一个单元测试来演示吗?