Play Framework 2.6连接PostgreSQL时DB对象找不到问题求助
解决Play 2.6中无法找到
DB对象的数据库连接问题 你遇到的问题是因为Play 2.6彻底移除了旧版本中静态的DB类/对象——这个API在Play 2.5就已经被标记为弃用,2.6里完全重构了JDBC访问的方式,转而使用依赖注入来管理数据库连接池实例。下面是具体的解决步骤:
1. 改用依赖注入获取Database实例
Play 2.6鼓励通过构造函数注入Database对象来访问数据库,而不是用静态方法。修改你的RadioParameters类如下:
import models._ import play.api.db._ import java.sql.Connection // 把Database作为构造参数注入 class RadioParameters(_ap_mac_id: String, db: Database) { val ap_mac_id = _ap_mac_id def radioparameters: radio = { // 使用withConnection自动管理连接(会自动关闭连接,避免泄漏) db.withConnection { connection => // 在这里执行你的数据库操作,示例: val stmt = connection.createStatement() val query = s"SELECT * FROM your_table WHERE ap_mac_id = '$ap_mac_id'" val rs = stmt.executeQuery(query) // 处理结果集,封装成radio对象 // ... 你的业务逻辑代码 ... // 返回封装后的radio实例 yourRadioInstance } } }
2. 正确获取RadioParameters实例
因为现在RadioParameters依赖注入了Database,你需要通过Play的依赖注入容器来获取它的实例,比如在控制器中:
import play.api.mvc._ import javax.inject.Inject class RadioController @Inject()(val controllerComponents: ControllerComponents, db: Database) extends BaseController { def getRadioParams(apMacId: String) = Action { // 创建RadioParameters实例时传入数据库连接 val radioParams = new RadioParameters(apMacId, db) val radio = radioParams.radioparameters // 返回响应 Ok(views.html.radio(radio)) } }
如果你的场景需要更灵活的注入方式,也可以定义一个工厂类,或者直接通过注入器获取,但推荐优先使用构造函数注入的方式,符合Play的设计理念。
3. 确认依赖与配置
- 你的
build.sbt依赖配置是正确的,不过可以考虑升级PostgreSQL驱动到适配你数据库版本的最新稳定版(比如PostgreSQL 9.4可以兼容42.2.x及以上版本,示例:libraryDependencies += "org.postgresql" % "postgresql" % "42.2.24")。 application.conf中的数据库配置无需修改,你的配置已经符合Play 2.6的要求。
补充说明
Play 2.6移除静态DB对象的原因是为了更好地支持依赖注入、测试(比如可以轻松替换测试用的数据库实例),以及更规范的资源管理。withConnection方法会自动帮你处理连接的打开和关闭,不需要手动调用connection.close(),能有效避免数据库连接泄漏问题。
内容的提问来源于stack exchange,提问作者Kamal Kumar
相关产品推荐
相关产品推荐

