java - 调用数据库连接时我的视图停止工作
问题描述
我正在尝试创建一个将数据保存在 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&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 调用连接,则数据正常发送到数据库。
解决方案
推荐阅读
- sql - 使用 pgAdmin 4 sql 将图像插入 Postgresql 时出错
- html - 非直接父元素如何影响其非直接子元素?
- reactjs - TypeError:无法读取未定义 Reactstrap Fade.js 的属性“propTypes”
- lisp - 阅读 lisp 流 - 意外的无限循环
- php - 打开一页时,XAMPP MySQL 已开始意外关闭
- c++ - Chase Lev deque 栅栏
- terraform - Azure 负载均衡器中的多个前端配置,带有使用 Terraform 的单个 VM
- javascript - 如何制作一个带有位置的块:固定在通过某个边界时改变颜色?
- android-jetpack-compose - FocusRequestor 正在吃后面的动作,需要额外的后面动作
- python - 如何并行运行python HTTP流服务器(PiCamera)+运动检测?