【问题标题】:Change DB column type on the fly即时更改数据库列类型
【发布时间】:2019-02-04 06:19:17
【问题描述】:

鉴于理想情况下应该没有停机时间的 java 服务,我想将表的列类型从 varchar 更改为 longtext,同时保持服务处于活动状态。

该服务正在使用 spring --> jpa、hibernate 并与 mysql db 对话。

实体具有映射属性,我们称它为 foobar,用字符串表示。

所以现在它看起来像这样:

  • java 实体:String foobar

  • MySQL 专栏:varchar(255) foobar

我想做一个表格修改,所以它会是这样的:

  • java 实体:String foobar

  • MySQL 专栏:longtext foobar

问题

如果我更改 mysql 列并保持 java 服务运行,它仍然能够读取/写入该列还是会抛出错误?

【问题讨论】:

  • 最好的办法是尝试...
  • @Sharon Ben Asher 在我的情况下考虑到生产/开发环境的限制:没有。
  • 你试试告诉我们怎么样?这种迁移最安全(也是最好)的方法总是(首先)在本地或开发环境中执行。如果它在那里工作,并且该环境与您的生产环境足够接近,请继续。
  • 似乎很容易重新创建非生产环境中的情况......无论如何,鉴于您提到的限制,您有什么选择?您要根据此处的答案实施产品更改吗?
  • @SharonBenAsher 如果他的产品环境受到限制,因此他无法更新数据库,无论如何他都无法更改。

标签: java mysql hibernate jpa jdbc


【解决方案1】:

理论上我会说“是”,更改应该是透明的。毕竟这两种类型在 JDBC 中都由相同的java.sql.Types.VARCHAR 类型表示。

但是——那是理论——而且由于您的应用程序似乎非常关键,我不会盲目相信该理论。

在 DEV 或 TEST 环境中的简单测试会给你答案。

只要确保你使用完全相同

  • 数据库版本,
  • JPA 版本,
  • 休眠版,
  • JVM 版本,
  • 应用程序版本,
  • 图书馆,

【讨论】: