分享
 
 
 

通用数据库软件完成的最后总结

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

做了约有一个月的软件基本完成,本以为会做成一个和J2EE有关的组件,被make的毕业设计导师(此处隐去此人姓名)带错道路,以至开发成为一个完全的软件。

在最后的几天里,基本时间浪费在调和数据库连接上,本软件用到了5个数据库

Sql Server,MySql,Oracle,DB2 UDB,Sybase

在我机器上的情况:它们各自的库都保存到jbuilder/lib/ext文件夹下,部分保存到软件驱动里面,以备以后使用。

一、下面分别说一下遇到的相关问题:

1.Sql Server

一定要装上sp3才能顺利完成,有时机器会出现只有自己机器能访问,别的机器都连不上的情况,重启一下会有很好效果。

存储过程查询xx库所有的所有的表名

exec sp_tables

获得所有库

exec sp_databases

2.MySql

用winmysqladmin.exe输入的用户名登陆有时出现问题是odbc@localhost……,不知道怎么回事,在

use mysql

insert into user(host,user,password) values("","","")

新建一个用户就可以用此用户登陆了

新建数据库都可以在mysql>提示符下进行操作

3.Oracle

这可是个大家伙,首先要注意的是如果机器装过一次oracle再次装时候会及其难装,所以卸载时候有说法,要仔细的卸载,或者干脆重新装,

所以装在虚拟机上是个不错的选择。

第二次装时候,即使装上了也会出现这样或那样问题,比如说明明有这个用户,监听器也开着哪可是就是连不上,不是别的原因,重新装,别犹豫。

例如,Oracle提供了2种JDBC drivers :

- JDBC Thin for Java applets and applications

- JDBC OCI for Java applications

按照所用的JDBC的不同,URL也有所不同。

// Oracle Jdbc Thin driver

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection dbCon = DriverManager.getConnection("jdbc:oracle:oci7:@mydatabase", "scott", "tiger");

// Oracle Jdbc OCI driver

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection dbCon = DriverManager.getConnection("jdbc:oracle:thin:@myhost:1521:orcl", "scott", "tiger");

oracle中新建用户

建议你create user luck identified by 123;(不要有"")

grant connect,resource to luck;

默认用户有system密码manager

对应每个用户有不同的用户表

4.DB 2

我装得是8.2,出现情况是当数据库在使用中的时候,你删除它严重问题会出现你连服务都启动不了。

默认用户名和密码是db2admin db2admin

用db2admin在别的软件登陆能查询到的是模式是db2admin的表,所以你的表一定要建成db2admin模式的

1) com要大写COM

COM.ibm.db2.jdbc.net.DB2Driver 或

COM.ibm.db2.jdbc.app.DB2Driver

2) url与类不匹配

jdbc:db2://localhost:5000/sample 要使用net型的.

3) 保证db2java.zip在类路径中

此文件在sqllib\java\下

关于版本问题,只要作到你程序使用的jdbc驱动版本和远程数据库使用的一样

远程连接DB2数据库时候用的驱动:应该使用COM.ibm.db2.jdbc.net.DB2Driver

5.Sybase

这个一个和Sql Server很像的程序,首先出现的问题是打开central时候会出现can't open scsslgen这个东东,你到安装的根目录(这个根目

录不是平常意义的根目录,比如你装在c:\sybase则根目录是c:\,)下面的sybtool里面搜索scsslgen并改名为 scsslgch还有一个……en.cnt

文件也要重命名为……cn.cnt,这是为解决中文问题,我用的sybase版本是11.5,对了他带我一直想要的powerdesigner.

还有他不支持元数据查询,比如conn.getMetaData他是不支持的。

默认用户名是sa密码为空

所有数据库一定要记得用户名和密码

二、在Jbuilder里面只要在project properties 中把库加入进来就ok了

三、在这个软件中大部分都是用到元数据获得用户表名,此处有几个从系统表选出用户表的查询语句:

Oracle

SELECT TABLE_NAME FROM USER_TABLES ORDER BY TABLE_NAME

MySQL

SHOW TABLES

MS SQL Server

select name from sysobjects where type = N'U' order by name

DB2 UDB

SELECT NAME FROM SYSIBM.SYSTABLES WHERE TYPE = 'T' AND CREATOR != 'SYSIBM' ORDER BY NAME

四、关于多数据库支持的两种方式

应用软件厂商面临不同的客户需求时,需要支持不同的数据库产品,可是不同的数据库产品之间的SQL相差是巨大。

例如以下的SQL,在不同的数据库中的写法是不一样的。

SELECT TOP 1 * FROM T1 LEFT JOIN T2 ON T1.Id = T2.ParentId Order By T1.Id

Oracle:

SELECT * FROM (

SELECT * FROM T1, T2 WHERE T1.Id = T2.ParentId (+) ORDER BY T1.Id ASC

)

WHERE ROWNUM <= 1

Sybase:

SET ROWCOUNT 1

SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.Id = T2.ParentId ORDER BY T1.Id ASC

SET ROWCOUNT 0

MySQL:

SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.Id = T2.ParentId

ORDER BY T1.Id ASC LIMIT 0, 1

MS SQL Server:

SELECT TOP 1 * FROM T1 LEFT OUTER JOIN T2 ON T1.Id = T2.ParentId ORDER BY T1.Id ASC

DB2 UDB:

SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.Id = T2.ParentId

ORDER BY T1.Id ASC FETCH FIRST 1 ROW ONLY

五、支持多数据库是一种困难的事情。支持多数库有两种两种方式。

第一种方式,编写一个数据库抽象层,针对不同的数据库作不同的实现。

第二种方式,使用一种Common SQL,通过一个翻译引擎,将Common SQL翻译为Dialect SQL。

目前很多开放源代码项目,都支持多数据库,通常是使用第一种方式。第一种方式,有一个问题,就是要求程序员对不同数据库都熟悉,这个

要对,对大多数程序员而言,太高了。包括著名开源项目的Hibernate,也只是利用到数据库的相当少的一部分功能,没有针对不同数据库的优

化选项。不同数据库对Query Hints和Locking Hints的支持都不相同,而Hints又是数据库访问优化的重要办法。这种方式在实现的过程中,会

占用相当大一部分的开放实现,而且对程序的可维护性造成影响。

第二种方式,需要定义一套Common SQL,接近SQL-92标准,跟某一种Dialect SQL相似,例如可以跟MS SQL Server的Transact SQL相似。还需

要一个翻译引擎,把Common SQL翻译到不同的Dialect SQL,例如DB2的SQL、Oracle的P/L SQL,Microsoft的Transact SQL。这样,大多数程序

员只需要了解一种Dialect SQL,如果以Microsoft的Transact SQL为基准定义Common SQL,大多数的程序员都了解SQL Server的Transact SQL

,几乎不需要或者只需要很低培训成本,就可以支持多数据库了。

目前国外有一间公司提供有一个SQL翻译的产品,http://www.swissql.com/,但是该公司的翻译引擎做得还很不成熟,BUG很多。国内的也有相

应的软件厂商提供有相应的产品,其成熟度要比SwisSQL要高,翻译速度也相当快。

六、获得元数据

databaseMetaData的getTables

获得表中的信息

你可对DataBaseMetaData对象使用getTables()方法以得到数据库中表的信息。这

个方法有以下四个字符串参数:

results = dma.getTables(catalog, schema, tablemask, types[]);

参数的意义为:

catalog

用来寻找表名的目录名称。对于JDBC-ODBC数据库和许多其它的数据库,它可被设置为null。这些数据库的目录条目实际上为它们在文件系统

中的绝对路径。

schema

要包括的数据库schema。许多数据库并不支持schema,而对于其它的数据库,它为数据库所有者的用户名称。

tablemask

描述你要获取的表的名称的一个掩码。若你想获取所有的表名,将它设为通配符%。注意SQL用%作为通配符,而不是PC上的*。

types[]

描述你要获取的表的种类的一个字符串数组。数据库中通常包括一些用于内部管理的表,而这些表对用户来说是毫无用处的。若被设为null,

你将得到所有的表。若使该数组只包括一个元素,且将该元素设为字符串“TABLE”,你将得到用户所感兴趣的那些表。

获得数据库中表的名称相对于先得到DatabaseMetaData对象,然后再从中取得表的名称。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有