即时更改数据库列类型
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中的对象类型转换? [用于即时代码更改]