2012-03-31 138 views
1

我想设置PRAGMA foreign_key = ON;在sqlite数据库。我使用jdbc driver for sqlite编写了一些软件,这是一个:http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBCSQLite JDBC PRAGMA设置

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

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

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

但我不知道该怎么做,我正在准备可池化的数据源的方式是这样的:

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

但我不知道如何正确设置编译,我发现这一个是可能的:

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

但我不知道如何与池化棘手的设置连接使用它...

任何想法?

+0

This [link] [1]可能会有所帮助。 [1]:http://code-know-how.blogspot.ru/2011/10/how-to-enable-foreign-keys-in-sqlite3.html – Marco167 2013-11-28 14:39:22

回答

1

不幸的是,这是比SQLite更多的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接口的实现,所以理论上你应该可以使用带有DBCP的SQLiteConnectionPoolDataSource

+0

我试过了。它像一个魅力。除了该sql库,我正在使用此连接池管理器:http://www.source-code.biz/miniconnectionpoolmanager/。对我来说,这个话题已经解决了。 – stewenson 2012-04-01 21:56:57