【问题标题】:MySQL PersistenceException, "Connection is closed" in Play! 2.2MySQL PersistenceException,Play 中的“连接已关闭”! 2.2
【发布时间】:2013-09-30 18:44:02
【问题描述】:

我正在试用 Play 框架并使用 2.2.0 版本和 Java 版本。

我想使用 MySQL 作为数据库,我已按照网站上的说明进行操作。我能够运行进化脚本,但我无法将任何内容保存到数据库中。在数据库中创建的表。我在尝试调用 Ebean.save() 方法时得到了[PersistenceException: java.sql.SQLException: Connection is closed!],该方法位于我的控制器中。

我所做的是:

  1. 设置 build.sbt 并添加插件

    libraryDependencies ++= Seq(
        javaJdbc,
        javaEbean,
        cache,
        "mysql" % "mysql-connector-java" % "5.1.18"
    )
    
  2. 设置 conf/application.conf

    db.default.driver=com.mysql.jdbc.Driver
    db.default.url="jdbc:mysql://localhost:3306/TLC?characterEncoding=UTF-8"
    db.default.user=root
    db.default.pass=secret
    
  3. Ebean 服务器

    ebean.default="models.*"
    
  4. 创建的控制器类 包控制器;

    import com.avaje.ebean.Ebean;
    import play.*;
    import play.data.Form;
    import play.mvc.*;
    import models.Bar;
    import views.html.*;
    
    public class Application extends Controller {
    
        public static Result index() {
            return ok(index.render("Your new application is ready."));
        }
    
        public static Result addBar() {
            Bar bar = Form.form(Bar.class).bindFromRequest().get();
            bar.save();
            return redirect(routes.Application.index());
        }
    }
    
  5. 创建表单

    <form action="@routes.Application.addBar()" method="post">
        <input name="name"/>
        <input type="submit"/>
    </form>
    
  6. 添加路线

    POST    /bars                       controllers.Application.addBar()
    
  7. 当然是模型本身。 封装模型;

    import play.db.ebean.Model;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    
    @Entity
    public class Bar extends Model {
        @Id
        public String id;
        public String name;
    
    }
    
  8. 当然还有在 mysql 中创建数据库本身。

我错过了什么?我已经做了 4 个小时了,仍然不知道出了什么问题。如果我在内存数据库中使用 h2,它工作得很好。请帮帮我。

谢谢!

【问题讨论】:

  • 您必须在数据库会话中执行与数据库相关的事情。根据您的描述,当您尝试保存对象时,似乎没有活动会话(或者您没有使用它)。在 EBean API 的情况下,您可能只是缺少与基础表的连接,请看这个示例:avaje.org/ebean/getstarted_props.html
  • 你解决过这个问题吗?有类似的问题......奇怪的是调用 Ebean.update(obj) 工作(直到我做一些更复杂的事情),但 Ebean.save(obj) 从来没有。令人抓狂。
  • 所以我最终解决了这个问题。切换到 JPA(似乎 ebean 可能很快会移动到外部包)并且不仅收到连接关闭错误,而且由于 SQL 错误而导致(先前)错误。如果我将 ebean 配置为向控制台输出错误(不确定当前如何执行此操作),我会发现它 - 发生 SQL 错误,因此连接被关闭。可能想检查您是否也遇到了这种情况。

标签: java mysql sql playframework ebean


【解决方案1】:

我遇到了类似的问题,我找到了解决方案。

罪魁祸首是您的Bar 实体的id 属性。您已将id 定义为字符串,并且在保存Bar 时未设置它。在Long 的情况下,id 值会自动生成,但对于 String 需要显式设置。

所以,

Bar bar = Form.form(Bar.class).bindFromRequest().get();
bar.id = UUID.randomUUID().toString();
bar.save();

应该可以解决这个问题。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您可以尝试的一件事是升级 mysql 连接器。您使用的有点旧(2011 年 4 月发布)

    “mysql”%“mysql-connector-java”%“5.1.26”

    如果这没有帮助,那么我会尝试确保凭据 + 连接 URL 正确。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题(在 Mac OS X 和 MySQL 上),但我没有使用 String ID

       User {
           @Id
           public long id;
           public String fullName;    
       }
      

      当我尝试时:

      Ebean.save(user) 
      

      我明白了:

      [PersistenceException: java.sql.SQLException: Connection is closed!]

      使用自动增量策略并更新 mysql 连接器对我没有帮助。

      问题在于尝试在字段中编写 unicode,因为没有 Unicode 一切正常。 经过仔细检查,发现 MySQL 数据库是在没有 utf8_general_ci 的情况下创建的,但是在现有数据库上使用 ALTER 添加此属性不起作用。

      使用默认排序规则utf8_general_ci创建一个新数据库,对我有用。

      【讨论】:

        【解决方案4】:

        有时它可能是插入期间跳过的“非空”列。在我的情况下,我添加了一个带有“not null”的“int”类型的新列,并忘记为它们插入值。希望它可以帮助一些人。

        【讨论】:

          猜你喜欢
          • 2017-02-17
          • 2013-12-31
          • 1970-01-01
          • 2017-11-03
          • 1970-01-01
          • 2016-07-18
          • 1970-01-01
          • 2016-04-04
          • 2013-05-31
          相关资源
          最近更新 更多