如鹏网 大学生计算机学习社区

CowNew开源团队

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  363 随笔 :: 2 文章 :: 808 评论 :: 0 Trackbacks

本版主要新增特性:
  1、对Show语句的支持

       自从CowNewSQL2.1开始,我们提供了对Show语句的支持,主要用来查看系统中的表定义、字段定义、支持的函数等。由于各个数据库中取得这些元信息的方式各有不同,经常需要关联查询很多系统表才能搬到,为了简化用户的使用,我们创新性的设计了Show系列语句,这样您至少使用非常短的语句就可以实现以前需要编写很复杂的语句才能实现的功能。

       Show语句语法列表:

1show  tables:显示系统中默认Schema下的所有表的表名。

2show  tables Schema名:显示指定Schema下的所有表的表名。例子:show tables DEMO

3show  functions:显示系统支持的函数的列表。

4show  functioncolumns:显示系统支持的函数参数以及返回值的详细说明。

5show  tablecolumns 表名:显示指定表的数据列信息。例子:show  tablecolumns table_1。
2、提供了JDBC驱动的使用方式 

       自从CowNewSQL2.1开始,我们提供了以JDBC驱动方式使用的支持(支持最新的JDBC4.0标准)。通过这种方式用户无需修改系统的任何代码,只要修改原有的JDBC连接字符串就可以轻松的将CowNewSQL融入系统,使用CowNewSQLJDBC驱动后系统中所有的SQL语句在送到数据库系统中执行前都将会自动进行翻译。

       CowNewSQLJDBC驱动类为:com.cownew.cownewsql.imsql.jdbc.DBDriver;连接字符串格式为:jdbc:cownewsql:目标数据库类型:目标数据库JDBC驱动类:JDBC连接字符串。

使用方式举例:

       原有程序连接到Oracle数据库,使用的Oracle驱动类为oracle.jdbc.driver.OracleDriverJDBC连接字符串为:jdbc:oracle:thin:@192.168.88.128:1521:XE

       我们只要将CowNewSQLJar包(包括cownewsql***.jarantlr.jarcommons-lang**.jarretrotranslator-runtime**.jar等)加入程序的ClassPath,然后修改使用的数据库驱动为:com.cownew.cownewsql.imsql.jdbc.DBDriver,然后修改JDBC连接字符串为:jdbc:cownewsql:oracle:oracle.jdbc.driver.OracleDriver:jdbc:oracle:thin:@192.168.88.128:1521:XE

       这样我们无需修改任何代码就将CowNewSQL翻译器轻松的植入了原有系统。
3、增加了对Alter Table语句的支持;修正了Convert函数在各个数据库中取值范围不一致的Bug;改进了方言管理器的实现机制;修复了若干Bug。

下载地址1:http://www.blogjava.net/Files/huanzhugege/cownewsql-2.1.zip
下载地址2:http://www.cownew.com/Soft/UploadSoft/cownewsql-2.1.zip


=======================================================================================
 

       由于种种原因,各个数据库系统的SQL语句语法以及支持的函数都不尽相同,这造成了如下两个问题:(1)系统在多个不同数据库之间移植变得非常困难,特别是需要维护多个数据库版本的时候;(2)开发人员必须对各种数据库的语法差异非常了解,这加大了开发难度。

       虽然Hibernate通过HQL等技术部分的解决了跨数据库移植的问题,但是在对性能要求比较高的场合还是需要直接使用SQL语句访问数据库的,在这种情况下如何编写能被不同数据库支持的SQL语句就成了。目前解决这种差异的最常用的技术就是SQL语句翻译,使用SQL翻译器可以将SQL语句翻译为在不同的数据库中支持的特定平台的SQL语句。CowNewSQL就是这样一款产品。

       CowNewSQL简化了跨数据库产品的开发,比如取当前日期在MSSQL中是“SELECT GETDATE()”,在MYSQL中是“SELECT NOW()”,在Oracle中是“SELECT SYSDATE FROM DUAL”,使用CowNewSQL以后您只要使用“SELECT NOW()”,那么CowNewSQL就会为您自动将其翻译为对应数据库平台支持的SQL语句,而且CowNewSQL的兼容性也非常好,比如“SELECT NOW()”写成“SELECT GETDATE()”同样可以被正确的翻译;取数据库前10条记录,在MSSQL中是“Select top 10 from T_1”、在MYSQL中是“SELECT  LIMIT 0, 10 ”、在Oracle中是“SELECT  FROM DUAL WHERE ROWNUM <= 10”,使用CowNewSQL以后您只要使用“Select top 10 from T_1”,那么CowNewSQL就会为您自动将其翻译为对应数据库平台支持的SQL语句。

       CowNewSQL还通过变通的方式对目标数据库不直接支持的语法进行了支持。比如MYSQL是不支持“select * from t1 where fid in(select fid from t2 limit 0,5)”这样在子查询中的Limit语句的,CowNewSQL通过将子查询进行二次结果集包装的方式巧妙的对其进行了支持,“delete from T_SaleInvoice where FId in(select top 5 FParentId from T_SaleInvoiceDetails)”通过CowNewSQL的翻译以后就成了“DELETE FROM T_SaleInvoice WHERE FId IN (select * from(SELECT FParentId FROM T_SaleInvoiceDetails LIMIT 0, 5 ) t_temp_sub)”这样被MYSQL支持的语法了;MYSQL中没有提供计算两个日期之间月份差异的函数,CowNewSQL通过组合其他日期函数的方式模拟了这个函数,这样使用者只要使用MONTHS_BETWEEN函数即可了,无需关心内部的差异。

       CowNewSQL支持如下几种类型的SQL语句:CreateTable/AlterTable/DropTable/CreateIndex/DropIndex/Select/Insert/Delete/Update/Show;支持子查询、JoinUnion等高级的SQL特性;支持日期(包括取当前日期、从日期中提取任意部分、计算日期差异、日期前后推算等)、数学(包括取绝对值、取PI值、四舍五入、对数计算、随机数等)、字符串(包括取子字符串、取字符串长度、字符串截断、大小写转换等)、基本数据处理(包括数字字符串互转、日期转字符串、非空判断等)等函数。

posted on 2007-11-17 15:27 CowNew开源团队 阅读(2911) 评论(10)  编辑  收藏

评论

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-11-18 12:52 专注JAVA开源
下载地址1:http://www.blogjava.net/Files/huanzhugege/cownewsql-2.1.zip
下载地址2:http://www.cownew.com/Soft/UploadSoft/cownewsql-2.1.zip
这两个地址下载不了  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-11-18 13:49 CowNew开源团队
@专注JAVA开源
是不是您的网络有问题?我这可以下载,找了几个朋友试了一下也可以下载。  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-11-19 17:10 温少的日志
下载看了一下,似乎做的内容还是相当少。

建议你参考一下金蝶软件EAS BOS的KSQL,是一个应用在产品中的成熟的SQL翻译。单是测试用例就有数千个,支持Oracle、Microsoft SQL Server、Sybase、DB2、DB2 AS400。手工编写的文法分析,没有使用antlr,速度大约是antlr生成Parser的三至四倍左右吧。

KSQL的功能也比较完备,支持临时表、游标、流程控制语句WHILE、IF等。

这样的底层核心模块关键是稳定、高效、功能完备。高效还容易,稳定是最难的,需要大量的测试,包括实际应用中的测试,DB2的限制是最多的,你没有实际测试,可能想不到DB2的限制有如此之多。

我觉得你现在这三点都不具备。  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-11-19 17:42 CowNew开源团队
多谢温少指教,:)
1、暂时没有手工编写的文法分析的打算,因为考虑到数据库操作和SQL翻译的速度比起来不在一个档次上,提高SQL翻译的速度并不会有明显的性能提升。Antlr挺好用的,等到以后发现有性能瓶颈的时候会再考虑用手工编写的文法分析。
2、CownewSQL也计划在未来支持通用的存储过程。
3、DB2确实很讨厌,很多其他主流数据库支持的特性它都不支持,它竟然还是关系数据库的祖宗,看来祖宗就代表着守旧呀,呵呵。
再次感谢温少的指教,以后还请高手多提宝贵意见!  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-12-19 13:03 likaijin
我按照以上的步骤说明用拉一下,出现以下错误:
2007-12-19 12:52:48,448 ERROR [http-8088-Processor23] (cn.com.headsoft.database.OperateDB:53) - 无法取得数据库连接:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.cownew.cownewsql.imsql.jdbc.DBDriver'
java.lang.NullPointerException
at cn.com.headsoft.database.OperateDB.executeQuery(OperateDB.java:75)
at cn.com.headsoft.common.dao.impl.SqlUserLoginDAO.validateUser(SqlUserLoginDAO.java:97)
at cn.com.headsoft.common.action.UserLoginAction.execute(UserLoginAction.java:38)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1480)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:524)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at cn.com.headsoft.common.filter.CheckSessionFilter.doFilter(CheckSessionFilter.java:109)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at cn.com.headsoft.common.filter.EncodingFilter.doFilter(EncodingFilter.java:43)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:738)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
我用的是sqlserver2000数据库,直接在Tomcat服务器的server.xml中对数据源进行配置:
<Context path="/cost1" docBase="D:\eclipse\workspace\WZProject_V1\WebContent" debug="0" reloadable="true">
<Resource name="ProjectDataSource"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="sa"
password="sasa"
driverClassName="com.cownew.cownewsql.imsql.jdbc.DBDriver"
url="jdbc:cownewsql:net.sourceforge.jtds.jdbc.Driver:jdbc:jtds:sqlserver://192.198.64.168:1433/headcost"/>
</Context>  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-12-19 13:07 CowNew开源团队
@likaijin
请确保“CowNewSQL的Jar包(包括cownewsql***.jar、antlr.jar、commons-lang**.jar、retrotranslator-runtime**.jar等)加入程序的ClassPath”。  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-12-19 14:00 likaijin
我改为连接池配置方式:
<?xml version="1.0" encoding="GBK"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<alias>SQLServerDB</alias>
<driver-url>jdbc:cownewsql:sqlserver:net.sourceforge.jtds.jdbc.Driver:jdbc:jtds:sqlserver://127.0.0.1:1433/www</driver-url>
<driver-class>com.cownew.cownewsql.imsql.jdbc.DBDriver</driver-class>

<driver-properties>
<property name="user" value="sa"/>
<property name="password" value="sasa"/>
</driver-properties>
<maximum-connection-count>400</maximum-connection-count>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
</something-else-entirely>
已经不报错误,但后台sql编译还是有点问题,而且速度有些慢,这几个包我都直接放到我的工程WEB-INF/lib/文件夹下拉,应该是没有问题的,但还是看不到效果。。。。  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2007-12-19 14:18 CowNew开源团队
后台sql编译有什么问题???
你执行一下“select trim(' a b ')”,看看能不能得到“a b”,如果可以的话就说明没问题。  回复  更多评论
  

# re: 多数据库翻译器CowNewSQL 2.1 发布 2008-06-06 10:41 fire9
不错的东西啊!支持!  回复  更多评论
  

# CowNewSQl 临时表 2009-02-27 15:55 ysj
CowNewSQl 临时表和字符字段的连接无法翻译!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: