【发布时间】:2021-06-07 17:45:16
【问题描述】:
我有一个通过 JDBC (UserDaoJDBCImpl ()) 和 Hibernate (UserDaoHibernateImpl ()) 分别与 DB 交互的 DAO 实现。它们有用于创建 (createUsersTable ()) 和删除 (dropUsersTable ()) 表的方法,在这两种实现中都是通过 statement.execute () 方法完成的。通过 JDBC 实现运行顺利。问题如下:如果在使用 Hibernate 工具(会话、事务)的方法后创建或删除表,则 statement.executeUpdate() 将挂在其中。我认为这是由于使用 Hibernate 后资源没有关闭,但我不明白究竟是什么。以下是创建、删除的方法,以及 kaput 所遵循的方法之一。还有link to the github。
public void createUsersTable() {
try (Statement statement = Util.connectDB().createStatement()) {
// нужен ли здесь автоинкремент у айди, если он прописан в аннотации?
statement.execute("CREATE TABLE IF NOT EXISTS User" +
"(id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT," +
"name VARCHAR(50) NOT NULL," +
"lastName VARCHAR(50)," +
"age TINYINT(3))");
} catch (SQLException e) {
System.out.println("Create table exception");
e.printStackTrace();
}
}
public void dropUsersTable() {
try (Statement statement = Util.connectDB().createStatement()) {
statement.execute("DROP TABLE IF EXISTS User");
} catch (SQLException e) {
System.out.println("Drop table exception");
e.printStackTrace();
}
}
public void saveUser(String name, String lastName, byte age) {
Session session = Util.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(new User(name, lastName, age));
session.getTransaction().commit();
session.close();
}
还有会话工厂:
private static final String URL = "jdbc:mysql://localhost:3306/usersdb?useSSL=false";
private static final String USER = "root";
private static final String PASSWORD = "root";
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
if(sessionFactory == null) {
try {
Properties properties = new Properties();
properties.setProperty("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver");
properties.setProperty("hibernate.connection.url", URL);
properties.setProperty("hibernate.connection.username", USER);
properties.setProperty("hibernate.connection.password", PASSWORD);
properties.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
Configuration configuration = new Configuration()
.addProperties(properties).addAnnotatedClass(User.class);
StandardServiceRegistryBuilder builder =
new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
} catch (Exception e) {
System.out.println("Creating sessionFactory exception");
// e.printStackTrace();
}
}
return sessionFactory;
}
在卡住的方法之前成功通过方法的日志:
мар. 09, 2021 10:26:17 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.0.Final}
мар. 09, 2021 10:26:17 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
мар. 09, 2021 10:26:17 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
мар. 09, 2021 10:26:17 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
мар. 09, 2021 10:26:17 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
мар. 09, 2021 10:26:17 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.cj.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/usersdb?useSSL=false]
мар. 09, 2021 10:26:17 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {password=****, user=root}
мар. 09, 2021 10:26:17 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
мар. 09, 2021 10:26:17 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
мар. 09, 2021 10:26:17 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
мар. 09, 2021 10:26:18 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
【问题讨论】:
-
如果在 main 方法中不添加任何 DB 调用会发生什么
-
@Acewin 所以一切正常