当hibernate连接到mysql服务器时,无法改变表(被阻止)

时间:2015-01-12 10:12:26

标签: java mysql hibernate alter

我有一个表名test;

mysql> desc test;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | int(11)      | NO   | PRI | 0       |       |
| name   | varchar(255) | YES  |     | NULL    |       |
| gendar | varchar(255) | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from test;
+----+------+--------+
| id | name | gendar |
+----+------+--------+
|  0 | John | male   |
+----+------+--------+
1 row in set (0.00 sec)

有一个像这样的休眠实体:

@Entity
@Table(name = "test",schema = "", catalog = "mydb")
public class TestEntity {
    private int id;
    private String name;
    private String gendar;

    @Id
    @Column(name = "id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "gendar")
    public String getGendar() {
        return gendar;
    }

    public void setGendar(String gendar) {
        this.gendar = gendar;
    }

}

hibernate.xml是:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:mysql://localhost:3306/mydb</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">test</property>
        <property name="connection.password">test</property>
        <mapping class="me.armnotstrong.sql.TestEntity" />
        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

hibernate session由此工厂类生成:

public class HBSession {
    private static final SessionFactory ourSessionFactory;
    private static final ServiceRegistry serviceRegistry;

    static {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            ourSessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        Session session = ourSessionFactory.openSession();
        return session;
    }
}

我只是通过此

将用户添加到数据库
public class TestHb {
    public static void main(String[] argvs){
        Session session = HBSession.getSession();
        TestEntity testEntity = new TestEntity();
        testEntity.setName("John");
        testEntity.setGendar("male");
        Transaction tx = session.beginTransaction();
        session.save(testEntity);
        tx.commit();
        session.close();
    }
}

运行上面的TestHB代码将用户添加到mysql后,会话似乎只是挂在那里,并且不会收集,使用netstat -nap进行诊断只是证明了我的猜测,但没关系,我认为。实际上,这只是在休眠产品环境中模拟 long connection 到db的条件。

问题是,当我在hibernate连接仍然存在时改变表时,mysql客户端刚刚被阻止。除非我重新启动mysql服务,否则不会按照假定执行alter操作。在产品环境中,重新启动mysql服务之后,有一件事情接踵而至,hibernate应用程序将不再适用。

那么我应该怎么做才能改变桌子并保持休眠状态呢?


根据@Florent的要求,这里有一些来自命令SHOW FULL PROCESSLISTSHOW OPEN TABLES的附加信息;

mysql> show open tables;
+----------+----------+--------+-------------+
| Database | Table    | In_use | Name_locked |
+----------+----------+--------+-------------+
| test     | merchant |      0 |           0 |
| test     | test     |      0 |           0 |
| test     | orders   |      0 |           0 |
| test     | product  |      0 |           0 |
| test     | codes    |      0 |           0 |
+----------+----------+--------+-------------+
5 rows in set (0.02 sec)

mysql> show full processlist;
+-----+--------+-----------------+--------+---------+------+-------+-----------------------+
| Id  | User   | Host            | db     | Command | Time | State | Info                  |
+-----+--------+-----------------+--------+---------+------+-------+-----------------------+
|  42 | test   | localhost:35790 | test   | Sleep   |    4 |       | NULL                  |
|  43 | test   | localhost:35801 | test   | Sleep   |    4 |       | NULL                  |
|  44 | test   | localhost:35802 | test   | Sleep   |    4 |       | NULL                  |
|  45 | test   | localhost:35803 | test   | Sleep   |    4 |       | NULL                  |
|  46 | test   | localhost:35804 | test   | Sleep   |    4 |       | NULL                  |
| 157 | test   | localhost:51516 | test   | Sleep   |  174 |       | NULL                  |
| 161 | test   | localhost:53988 | test   | Sleep   |  174 |       | NULL                  |
| 180 | test   | localhost:58501 | test   | Sleep   |  174 |       | NULL                  |
| 192 | test   | localhost:47228 | test   | Sleep   | 7217 |       | NULL                  |
| 193 | test   | localhost:49372 | test   | Sleep   | 4485 |       | NULL                  |
| 196 | test   | localhost       | test   | Sleep   | 9256 |       | NULL                  |
| 197 | test   | localhost       | test   | Sleep   | 4555 |       | NULL                  |
| 198 | test   | localhost:42411 | test   | Sleep   | 4485 |       | NULL                  |
| 200 | test   | localhost       | test   | Query   |    0 | NULL  | show full processlist |
+-----+--------+-----------------+--------+---------+------+-------+-----------------------+
14 rows in set (0.00 sec)

0 个答案:

没有答案