我正在尝试将Squeryl ORB与play 2.0框架一起使用,但在初始化期间调用DB.getConnection()
时,我得到:
BadPath:路径参数:路径无效' - 无法找到defaultdb的数据源':路径表达式中不允许使用令牌:' - ' (如果你真的想要这个,你可以加倍引用这个标记)
数据库配置如下所示(conf / application.conf):
db.default.url="jdbc:postgresql://localhost/mydb?user=postgres&password=postgres"
db.default.driver=org.postgresql.Driver
db.default.jndiName=defaultdb
初始化:
object Global extends GlobalSettings {
override def onStart(app: Application) {
SessionFactory.externalTransactionManagementAdapter = Some(() =>
Some(new Session(
DB.getConnection("defaultdb", true),
new PostgreSqlAdapter)))
...
这是正确的方法吗?将db.default.jndiName
配置值用作DB.getConnection()
的参数值是否正确?
或者应该这样做?:
SessionFactory.concreteFactory = Some(() =>
Session.create(
java.sql.DriverManager.getConnection("jdbc:postgresql://..."),
new PostgreSqlAdapter))
这样可行,但是我无法在模板中使用squeryl查询对象进行迭代,我希望可以使用externalTransactionManagementAdapter
。
我更正了以下内容:DB.getConnection("default", true)
并删除了db.default.jndiName
配置。
有了这个,我可以获得并使用连接,但是第二次调用getConnection()
时,它会抛出SQLException: Timed out waiting for a free available connection.
我还没有设法使用externalTransactionManagementAdapter
,但concreteFactory
效果很好 - 如下所述。
答案 0 :(得分:8)
接下来对我有用:
import play.db.DB
import play.api.Application
import play.api.GlobalSettings
import org.squeryl._
import org.squeryl.adapters._
...
object Global extends GlobalSettings
{
override def onStart(app:Application):Unit =
{
SessionFactory.concreteFactory = Some(
() => Session.create(DB.getDataSource().getConnection(),
dbAdapter)
);
}
override def onStop(app:Application):Unit =
{
}
val dbAdapter = new PostgreSqlAdapter();
}