2015-10-04 29 views
0

我们正在JavaFx中开发一个新的桌面应用程序,其中对于脱机存储,我们使用的是SQLite,而对于orm,我们使用的是ormlite。ormlite JdbcPooledConnectionSource正确的用法

我想实现数据库连接池,其中应该在开始时设置固定数量的连接,并且应该根据需要使用,释放和重用。另外,如果我们能够恰当地使用“只读”和“只写”连接以最大限度地提高性能,那将是一件好事。

这就是我们迄今为止所写的内容。

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

因此,有很多关于池连接源和重新使用连接的单元测试。你能否添加更多关于你为什么认为是这种情况的信息? https://github.com/j256/ormlite-jdbc/blob/master/src/test/java/com/j256/ormlite/jdbc/JdbcPooledConnectionSourceTest.java – Gray

+0

此外,根据您使用的SQLite的数据库引擎,池连接源不会帮助你,因为SQLite通常是嵌入式的。池连接源实际上只对远程数据库有帮助。 – Gray

+0

谢谢格雷!我们正在开发一个桌面应用程序(JavaFx),其中数据库没有嵌入,但是是分开的(SQLite文件)。我想要在ormlite中使用池连接的示例DAO设计模式。 –

回答

0

JdbcPooledConnectionSource正确使用

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

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

这里的问题是,我们每次创建表(TableUtils.createTableIfNotExists)时,池连接源都在创建一个新连接,而不是重复使用先前使用/创建的连接。

Hrm。我在汇集连接源的单元测试中有一些很好的覆盖。我很惊讶地听到它没有重用连接。你能给我一个单元测试来证明它吗?

+0

谢谢格雷!如果我们不使用JdbcPooledConnectionSource,那么在执行写入操作时应如何确保DB文件未被锁定。有没有内置的功能,或者我们需要使用锁或任何其他同步技术来自行管理它。 –

+0

我不明白@ Rahul.B的问题。 Sqlite处理底层锁定。我不确定它是否让原始图片看到它是否已被锁定。 – Gray

+0

看到这个链接@ Rahul.B。 http://stackoverflow.com/questions/15822778/sqlite-connection-pool-in-java-locked-database – Gray