2014-04-30 31 views
3

試圖使ScalikeJDBC和SQLite正常工作。必須根據提供的例子一個簡單的代碼:ScalikeJDBC + SQlite:建立連接後無法更改只讀標誌

import scalikejdbc._, SQLInterpolation._ 

object Test extends App { 
    Class.forName("org.sqlite.JDBC") 
    ConnectionPool.singleton("jdbc:sqlite:test.db", null, null) 

    implicit val session = AutoSession 

    println(sql"""SELECT * FROM kv WHERE key == 'seq' LIMIT 1""".map(identity).single().apply())) 
} 

它失敗例外:

Exception in thread "main" java.sql.SQLException: Cannot change read-only flag after establishing a connection. Use SQLiteConfig#setReadOnly and QLiteConfig.createConnection(). 
at org.sqlite.SQLiteConnection.setReadOnly(SQLiteConnection.java:447) 
at org.apache.commons.dbcp.DelegatingConnection.setReadOnly(DelegatingConnection.java:377) 
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setReadOnly(PoolingDataSource.java:338) 
at scalikejdbc.DBConnection$class.readOnlySession(DB.scala:138) 
at scalikejdbc.DB.readOnlySession(DB.scala:498) 
... 

我都試過scalikejdbc 1.7和2.0,錯誤仍然存​​在。作爲sqlite驅動我使用"org.xerial" % "sqlite-jdbc" % "3.7.+"

我該如何解決這個錯誤?

+1

我試過用你的代碼,它工作正常。 https://github.com/tkawachi/sqlite-scalikejdbc-test請詳細說明。 – kawty

+1

不要選擇? – dmitry

+0

號碼自己試試:) – kawty

回答

1

我發現原因是您使用的是"org.xerial" % "sqlite-jdbc" % "3.7.15-M1"。這個版本看起來還不穩定。

使用"3.7.2"與@kawty相同。

+1

剛剛創建了一個問題:https://bitbucket.org/xerial/sqlite-jdbc/issue/136/sqlexception-when-calling-setreadonly-in –

1

以下將創建兩個單獨的連接,一個用於只讀操作,另一個用於寫入。

ConnectionPool.add("mydb", s"jdbc:sqlite:${db.getAbsolutePath}", "", "") 
ConnectionPool.add(
    "mydb_ro", { 
    val conf = new SQLiteConfig() 
    conf.setReadOnly(true) 
    val source = new SQLiteDataSource(conf) 
    source.setUrl(s"jdbc:sqlite:${db.getAbsolutePath}") 
    new DataSourceConnectionPool(source) 
    } 
)