2012-03-31 135 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