首页 > 解决方案 > 调用数据库连接时我的视图停止工作

问题描述

我正在尝试创建一个将数据保存在 mysql db 上的简单视图,但是当我调用控制器函数从 JavaFx 按钮保存时它不起作用,应用程序开始使用孔内存直到崩溃。当我从终端中的简单静态 void main 调用时,它可以正常工作。

我已经尝试将连接作为线程启动,但它也不起作用,应用程序不会崩溃,但具有连接的线程保持活动状态,直到我手动关闭。当我调试应用程序时,连接线程立即变成 mysql-cj-abandoned-connection-cleanup [连接线程] https://drive.google.com/file/d/19DfJ-eZPtk895rd0iZs_6HkOZIAPFD9v/view?usp=sharing

主班

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            URL url = new File("src/application/Cadastro.fxml").toURI().toURL();
            Pane root = FXMLLoader.load(url);
            Scene scene = new Scene(root, 358, 227);
            primaryStage.setScene(scene);
            primaryStage.setTitle("Login Teste");
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
   }

看法

<AnchorPane maxHeight="400.0" maxWidth="400.0" minHeight="400.0" minWidth="400.0" prefHeight="400.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.CadastroController">
   <children>
      <Button fx:id="btnSalvar" layoutX="108.0" layoutY="226.0" mnemonicParsing="false" onAction="#onClick" prefHeight="25.0" prefWidth="174.0" text="Salvar" />
      <TextField fx:id="fieldNome" layoutX="108.0" layoutY="133.0" prefHeight="25.0" prefWidth="174.0" />
      <TextField fx:id="fieldSenha" layoutX="108.0" layoutY="188.0" prefHeight="25.0" prefWidth="174.0" />
      <Label layoutX="108.0" layoutY="165.0" prefHeight="17.0" prefWidth="100.0" text="Senha" />
      <Label layoutX="108.0" layoutY="107.0" text="Usuário" />
   </children>
</AnchorPane>

视图控制器

public class CadastroController implements Initializable {

    @FXML
    private TextField fieldNome;
    @FXML
    private TextField fieldSenha;

    @FXML
    private void onClick() {
        UsuarioController uControl = new UsuarioController();
        Usuario u = new Usuario(fieldNome.getText(), fieldSenha.getText());
        uControl.salvar(u);
        Alert a = new Alert(AlertType.INFORMATION, "Usuario salvo no bd");
        a.show();
    }

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        // TODO Auto-generated method stub

    }

   }

连接工厂

public class ConnectionFactory {
    private static EntityManagerFactory emf;

    private static synchronized void buildEmf() {
        try {
            emf = Persistence.createEntityManagerFactory("sistema");
        }catch(Exception e) {
            e.printStackTrace();
        }
    }


    public static EntityManagerFactory getEntityManager() {
        if (emf == null)
            buildEmf();
        return emf;
    }

    public static void closeEntityManagerFactory() {
        if (emf.isOpen()) {
            emf.close();
        }
    }

   }

模型

@Entity
@Table(name="usuarios")
public class Usuario implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String nome;
    private String senha;

    public Usuario() {

    }

    public Usuario(String nome, String senha) {
        super();
        this.nome = nome;
        this.senha = senha;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getSenha() {
        return senha;
    }
    public void setSenha(String senha) {
        this.senha = senha;
    }


   }

控制器

public class UsuarioController {

    public void salvar(Usuario usuario) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("sistema");
        EntityManager em = emf.createEntityManager();

        try {
            em.getTransaction().begin();
            em.persist(usuario);
            em.getTransaction().commit();
            System.out.println("USUARIO SALVO NO BD");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            em.close();
            emf.close();
        }
    }

   }

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
 version="2.1">
 <persistence-unit name="sistema" transaction-type="RESOURCE_LOCAL">
 <properties>
 <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/usertest?useTimezone=true&amp;serverTimezone=UTC"/>
 <property name="javax.persistence.jdbc.user" value="root" />
 <property name="javax.persistence.jdbc.password" value="" />
 <property name="hibernate.hbm2ddl.auto" value="create" />
 <property name="hibernate.current_session_context_class" value="thread"/>
 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>

 </properties>
 </persistence-unit>
</persistence>

这个问题让我抓狂,因为连接正常,视图运行正常,直到我从 javafx 按钮调用 Connection 如果我从简单的静态 void main 调用连接,则数据正常发送到数据库。

标签: javajpajavafx

解决方案


推荐阅读