采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer
都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的容易,是相对的。 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。 下面记录一下我做这件事情
都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的。
想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。
下面记录一下我做这件事情的过程和一些感悟。
当我接到该任务时,我先大致的理了一下思路:
要完成迁移,总体上有2大块工作要做,分别是:数据库层面的迁移 和 平台底层代码的改造
一、数据库层面的迁移过程:
1、通过sqlServer Studio2008 工具将数据从Oracle导入到SqlServer数据库
从SSMS2008开始才支持此功能,具体操作步骤(右键点击数据库-选择导入-点下一步-选择 Oracle Provider for OLE DB 数据源-点击属性-填写数据源,格式为 IP:端口/实例名),后面的步骤根据向导一步步的操作即可。需要注意的是在 选择源表和源视图的步骤中:
(1)、要把【目标】列中的默认前缀去掉,这样导入的表才会默认关联到dbo下,否则你每次查询表都要带上schema前缀,导致你之前的应用程序中的sql无法执行,因为你之前写的那些sql肯定不会带这种前缀。
(2)、先勾选你要导入的源,然后双击每一行记录,在弹出的对话框中检查是否所有的类型都正确绑定好了,我在检查的时候就遇到了oracle中是varchar2类型的,在该对话框显示的表结构中变成了130,只能手动的去将所有130改成varchar类型(sqlserver里没有varchar2类型)。还有原来是clob类型的,现在变成了varchar,要手动改成text类型(因为clob类型的字段比较少,所以可以通过在oracle中执行“select * from user_tab_columns c where c.data_type='CLOB';”来查看哪些表中用到了CLOB类型的字段)。
2、增加to_date、to_char、to_number、concat等常用的函数
说明:我在编写to_date函数的时候,只提供了一种格式“yyyy-mm-dd HH:mi:ss”,这是因为在sqlserver中是没有和to_date函数的类似的函数的,只能使用convert函数实现,但是convert函数不支持传入格式化字符串,只能传入格式字符对应的整型数字,而120对应的正是之前提到的“yyyy-mm-dd HH:mi:ss”格式;另外此次是迁移到Sqlserver2005,该版本是没有内嵌concat函数的,根据官方文档的说法,是从sqlServer2012开始才有concat函数的,所以这里我要自己编写一个concat函数。
<span>--</span><span>----------------------------------------------------------------concat函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[concat] Script Date: 03/10/2015 17:11:31 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>concat</span><span>]</span><span> ( </span><span>@param1</span> <span>varchar</span>(<span>500</span><span>), </span><span>@param2</span> <span>varchar</span>(<span>500</span><span>) ) </span><span>returns</span> <span>varchar</span>(<span>1000</span><span>) </span><span>as</span> <span>begin</span> <span>DECLARE</span> <span>@returntext</span> <span>varchar</span>(<span>1000</span><span>) </span><span>if</span> (<span>@param1</span> <span>is</span> <span>null</span><span>) </span><span>SELECT</span> <span>@returntext</span><span>=</span> <span>@param2</span><span>; </span><span>else</span> <span>if</span> (<span>@param2</span> <span>is</span> <span>null</span><span>) </span><span>SELECT</span> <span>@returntext</span><span>=</span> <span>@param1</span><span>; </span><span>else</span> <span>SELECT</span> <span>@returntext</span><span>=</span> <span>@param1</span> <span>+</span> <span>@param2</span><span>; </span><span>return</span> <span>@returntext</span><span>; </span><span>end</span> <span>--</span><span>------------------------------------------------------------------to_char函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[to_char] Script Date: 03/10/2015 17:12:09 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>to_char</span><span>]</span><span> ( </span><span>@param1</span> <span>datetime</span><span>, </span><span>@param2</span> <span>varchar</span>(<span>20</span><span>) ) </span><span>returns</span> <span>varchar</span>(<span>20</span><span>) </span><span>as</span> <span>begin</span> <span>return</span> <span>convert</span>(<span>varchar</span>(<span>20</span>),<span>@param1</span>,<span>120</span><span>) </span><span>end</span> <span>--</span><span>------------------------------------------------------------------to_date函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[to_date] Script Date: 03/10/2015 17:12:58 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>to_date</span><span>]</span><span> ( </span><span>@param1</span> <span>varchar</span>(<span>20</span><span>), </span><span>@param2</span> <span>varchar</span>(<span>20</span><span>) ) </span><span>returns</span> <span>datetime</span> <span>as</span> <span>begin</span> <span>return</span> <span>convert</span>(<span>datetime</span>,<span>@param1</span>,<span>120</span>)<span>--</span><span>120 means that yyyy-mm-dd hh:mi:ss(24h)</span> <span>end</span> <span>--</span><span>------------------------------------------------------------------to_number函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[to_number] Script Date: 03/10/2015 17:13:09 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>to_number</span><span>]</span><span> ( </span><span>@param1</span> <span>varchar</span><span> ) </span><span>returns</span><span> numeric </span><span>as</span> <span>begin</span> <span>return</span> <span>convert</span>(numeric,<span>@param1</span><span>) </span><span>end</span>
二、平台底层代码的改造
1、引入SqlServer的jar包:sqljdbc4-4.0.jar
<span><span>groupId</span><span>></span>com.microsoft.sqlserver<span></span><span>groupId</span><span>></span> <span><span>artifactId</span><span>></span>sqljdbc4<span></span><span>artifactId</span><span>></span> <span><span>version</span><span>></span>4.0<span></span><span>version</span><span>></span></span></span></span>
2、修改db.properties中关于数据库连接信息的配置
<span>jdbc.dialect=org.hibernate.dialect.SQLServerDialect jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=xxx jdbc.default_schema=dbo jdbc.username=xxx jdbc.password=xxx</span>
3、修改平台中使用的一些非sql标准的语法
在使用delete insert update这些dml语句的时候,切记不要使用别名,因为在oracle和sqlserver中,这些dml语句使用别名的语法是不一样的。
4、各实体类主键策略的改造
最好都使用string类型的主键,但是因为之前的代码中都用的sequence做主键策略,现在改成string类型工作量势必很大,所以决定使用table策略来兼容各种数据库。
5、dao层对sql的处理
由于sqlserver中调用自定义标量值函数,必须在函数名前加上dbo.的前缀,但是这样写势必会导致不能兼容其它的关系型数据库,所以只能从dao实现层,对sql进行统一的处理,处理规则就是:如果当前数据库是sqlserver,并且sql中出现了concat、to_date、to_char、to_number等函数,就为这些函数名加上dbo.的前缀。
以上做完,基本就可以让平台在sqlserver数据库上跑了,同时也可以通过改配置文件切换到Oracle数据库。
以上的做法可能并不是最优的方式,如果有更好的方案,希望各位大牛能给予指点。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

评估Java框架商业支持的性价比涉及以下步骤:确定所需的保障级别和服务水平协议(SLA)保证。研究支持团队的经验和专业知识。考虑附加服务,如升级、故障排除和性能优化。权衡商业支持成本与风险缓解和提高效率。

PHP框架的学习曲线取决于语言熟练度、框架复杂性、文档质量和社区支持。与Python框架相比,PHP框架的学习曲线更高,而与Ruby框架相比,则较低。与Java框架相比,PHP框架的学习曲线中等,但入门时间较短。

轻量级PHP框架通过小体积和低资源消耗提升应用程序性能。其特点包括:体积小,启动快,内存占用低提升响应速度和吞吐量,降低资源消耗实战案例:SlimFramework创建RESTAPI,仅500KB,高响应性、高吞吐量

根据基准测试,对于小型、高性能应用程序,Quarkus(快速启动、低内存)或Micronaut(TechEmpower优异)是理想选择。SpringBoot适用于大型、全栈应用程序,但启动时间和内存占用稍慢。

编写清晰全面的文档对于Golang框架至关重要。最佳实践包括:遵循既定文档风格,例如Google的Go编码风格指南。使用清晰的组织结构,包括标题、子标题和列表,并提供导航。提供全面准确的信息,包括入门指南、API参考和概念。使用代码示例说明概念和使用方法。保持文档更新,跟踪更改并记录新功能。提供支持和社区资源,例如GitHub问题和论坛。创建实际案例,如API文档。

根据应用场景选择最佳Go框架:考虑应用类型、语言特性、性能需求、生态系统。常见Go框架:Gin(Web应用)、Echo(Web服务)、Fiber(高吞吐量)、gorm(ORM)、fasthttp(速度)。实战案例:构建RESTAPI(Fiber),与数据库交互(gorm)。选择框架:性能关键选fasthttp,灵活Web应用选Gin/Echo,数据库交互选gorm。

在Go框架开发中,常见的挑战及其解决方案是:错误处理:利用errors包进行管理,并使用中间件集中处理错误。身份验证和授权:集成第三方库并创建自定义中间件来检查凭据。并发处理:利用goroutine、互斥锁和通道来控制资源访问。单元测试:使用gotest包,模拟和存根进行隔离,并使用代码覆盖率工具确保充分性。部署和监控:使用Docker容器打包部署,设置数据备份,通过日志记录和监控工具跟踪性能和错误。

Go框架学习的误区有以下5种:过度依赖框架,限制灵活性。不遵循框架约定,代码难维护。使用过时库,带来安全和兼容性问题。过度使用包,混淆代码结构。忽视错误处理,导致意外行为和崩溃。
