Java 获取SQLite只读C3P0 ComboPooledDataSource

Java 获取SQLite只读C3P0 ComboPooledDataSource,java,sqlite,jdbc,datasource,c3p0,Java,Sqlite,Jdbc,Datasource,C3p0,我需要获取SQLite只读C3P0 ComboPooledDataSource。我在这里找到的代码()创建了一个SQLite只读数据源: //put the imports where they really go, obviously... import javax.sql.*; import org.sqlite.*; import com.mchange.v2.c3p0.*; // configure SQLite SQLiteConfig config = new org.sqlite

我需要获取SQLite只读C3P0 ComboPooledDataSource。我在这里找到的代码()创建了一个SQLite只读数据源:

//put the imports where they really go, obviously...
import javax.sql.*;
import org.sqlite.*;
import com.mchange.v2.c3p0.*;

// configure SQLite
SQLiteConfig config = new org.sqlite.SQLiteConfig();
config.setReadOnly(true);
config.setPageSize(4096); //in bytes
config.setCacheSize(2000); //number of pages
config.setSynchronous(SQLiteConfig.SynchronousMode.OFF);
config.setJournalMode(SQLiteConfig.JournalMode.OFF);

// get an unpooled SQLite DataSource with the desired configuration
SQLiteDataSource unpooled = new SQLiteDataSource( config );

// get a pooled c3p0 DataSource that wraps the unpooled SQLite DataSource
DataSource pooled = DataSources.pooledDataSource( unpooled );
它很好用。但是我尝试调整的方法返回ComboPooledDataSource。如何获取连接?

如您所述,在创建连接后更新readonly

有时,覆盖标准连接属性(如transactionIsolation、holdability或readOnly)的默认值很有用。c3p0提供了一个“钩子”接口,您可以实现该接口,它使您有机会在连接从数据库签出后,即在签出时交给客户端之前,以及在签入时返回池之前,修改或跟踪连接,就在水池最终摧毁之前。传递给ConnectionCustomizer的连接是原始的物理连接,可以访问所有特定于供应商的API。请参阅ConnectionCustomizer的API文档

我建议,做一个类似于Spring框架的切换,从C3P0切换到连接池

HikariCP允许您设置只读属性:

只读 此属性控制默认情况下从池获得的连接是否处于只读模式。注意:一些数据库不支持只读模式的概念,而另一些数据库在连接设置为只读时提供查询优化。您是否需要此属性在很大程度上取决于您的应用程序和数据库。默认值:false


我只需要使用C3P0获得SQLite的只读连接。我尝试使用推荐的ConnectionCustomizer,但收到错误消息:建立连接后无法更改只读标志。使用SQLiteConfig#setReadOnly和SQLiteConfig.createConnection()。因此,在创建连接之前,必须将其设置为只读。上面的代码可以工作,只是我需要一个ComboPooledDataSource而不是一个DataSourceId。你试过我的答案来使用HikariCP吗?