2012-03-31 8 views
1

Ich versuche PRAGMA foreign_key = ON zu setzen; in SQLite-Datenbank. Ich code einige Software in Java mit JDBC-Treiber für SQLite, dieses: http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC.SQLite JDBC PRAGMA Einstellung

Ich verwende auch Verbindungspooling, um Abfragen für DB zu beschleunigen. Ich verwende diese Bibliothek: http://commons.apache.org/dbcp/.

Bis zu diesem Punkt ist alles gut. Jetzt muss ich PRAGMA einstellen, konkret PRAGMA foreign_key = ON; vor dem Erstellen von Tabellen, weil ich über die Konsistenz zwischen einigen Spalten in db sicher sein muss.

Wenn ich DB erstelle, wird er automatisch auf OFF gesetzt. Also muss ich es einschalten, um es zu benutzen.

Aber ich weiß nicht, wie es zu tun, so wie ich poolable Datenquelle vorbereite ist wie folgt:

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

Aber ich weiß nicht, wie das Pragma richtig zu setzen, ich, dass diese gefunden möglich ist:

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

Aber ich weiß nicht, wie es mit diesem poolable heikel Einstellungen ...

Irgendwelche Ideen in Verbindung zu benutzen?

+0

Diese [link] [1] könnte hilfreich sein. [1]: http://code-know-how.blogspot.ru/2011/10/how-to-enable-foreign-keys-in-sqlite3.html – Marco167

Antwort

1

Leider ist dies eher eine DBCP Frage als SQLite. Ich stimme zu, dass irgendwo in DBCP ein Platz sein muss, um die Konfiguration für eine gegebene Datenquelle einzustellen/zu aktualisieren. Ich würde erwarten, es in der PoolingDataSource-Klasse zu sehen, aber natürlich nicht dort.

Eine zu berücksichtigende Option ist die Verwendung einer jdbc-Pooling-Bibliothek, die die ConnectionPoolDataSource-Schnittstelle nutzt. Wenn ja, können Sie die SQLiteConnectionPoolDataSource verwenden, um einen Verbindungspool wie folgt einzurichten:

//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); 

Beachten Sie, dass es zu DBCP eine Erweiterung DriverAdapterCPDS genannt wird. Es ist eine Implementierung der ConnectionPoolDataSource-Schnittstelle, so dass Sie in der Lage sein sollten, das SQLiteConnectionPoolDataSource mit DBCP zu verwenden.

+0

Ich habe es versucht. Es wirkt wie ein Zauber. Ich verwende diesen Verbindungspool-Manager zusätzlich zu dieser SQL-Bibliothek: http://www.source-code.biz/miniconnectionpoolmanager/. Für mich ist dieses Thema gelöst. – stewenson