【问题标题】:Get SQLite read-only C3P0 ComboPooledDataSource获取 SQLite 只读 C3P0 ComboPooledDataSource
【发布时间】:2019-12-08 21:11:21
【问题描述】:

我需要获得一个 SQLite 只读 C3P0 ComboPooledDataSource。我在这里找到的这段代码 (Set SQLite connection properties in c3p0 connection pool) 创建了一个 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。我怎样才能得到一个?

【问题讨论】:

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

标签: java sqlite jdbc datasource c3p0


【解决方案1】:

正如你提到的,C3P0 只读更新 连接创建后

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

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

HikariCP 允许您设置只读属性:

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

【讨论】:

    猜你喜欢
    • 2017-04-27
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2016-05-11
    相关资源
    最近更新 更多