即时更改数据库列类型

Posted

技术标签:

【中文标题】即时更改数据库列类型【英文标题】: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 如果他的产品环境受到限制,因此他无法更新数据库,无论如何他都无法更改。 【参考方案1】:

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

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

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

只要确保你使用完全相同

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

【讨论】:

以上是关于即时更改数据库列类型的主要内容,如果未能解决你的问题,请参考以下文章

允许用户即时向其数据库添加列的最佳方式是啥? [关闭]

重新加载模块后Python中的对象类型转换? [用于即时代码更改]

更改数据表列数据类型 [重复]

映射数据流列模式类型 =='decimal' 不更改十进制列

使用 pandas 更改列数据类型

如何使用 sqitch postgresql 验证更改列数据类型更改?