SQLite JDBC PRAGMA设置

时间:2012-03-31 18:10:56

标签: java sqlite jdbc connection-pooling pragma

我正在尝试设置PRAGMA foreign_key = ON;在sqlite数据库中。我在java中使用jdbc驱动程序为sqlite编写了一些软件,这个:http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC

我也在使用连接池来加速DB的查询。我正在使用这个库: http://commons.apache.org/dbcp/

到目前为止,一切都很好。现在,我需要设置PRAGMA设置,具体来说PRAGMA foreign_key = ON;在创建表之前,因为我需要确定db中某些列之间的一致性。

创建数据库时,它会自动设置为OFF。所以我必须打开它才能使用它。

但我不知道怎么做,我准备poolable数据源的方式是这样的:

    public static DataSource getDataSource(String connectURI) {
GenericObjectPool connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory =
    new DriverManagerConnectionFactory(connectURI, null);
PoolableConnectionFactory poolableConnectionFactory =
    new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);
DataSource dataSource = new PoolingDataSource(connectionPool);
return dataSource;
}

但我不知道如何正确设置该pragma,我发现这个可行:

SQLiteConfig config = new SQLiteConfig();
config.enforceForeignKeys(true);

但我不知道如何使用它与那些可靠的棘手设置...

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,这比DBite更像是一个DBCP问题。我同意,在DBCP中必须有一个位置来设置/更新给定数据源的配置。我希望在PoolingDataSource类中看到它,但当然不存在。

要考虑的一个选项是使用利用ConnectionPoolDataSource接口的jdbc池库。如果是这样,您可以使用SQLiteConnectionPoolDataSource设置连接池,如下所示:

  //Set config
    org.sqlite.SQLiteConfig config = new org.sqlite.SQLiteConfig();
    config.enforceForeignKeys(true);


  //Create JDBC Datasource
    SQLiteConnectionPoolDataSource dataSource = new SQLiteConnectionPoolDataSource();
    dataSource.setUrl("jdbc:sqlite:" + db.toString().replace("\\", "/"));
    dataSource.setConfig(config);

请注意,DBCP有一个名为DriverAdapterCPDS的扩展名。它是ConnectionPoolDataSource接口的一个实现,所以从理论上讲,您应该能够将SQLiteConnectionPoolDataSource与DBCP一起使用。