分享
 
 
 

Sybase JDBC驱动的改进

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

Sybase JDBC驱动的改进(jConnect™ for JDBC)

兕丢疋没有魔法

适宜读者:

正在使用JSP建立网站,或者开发J2EE应用程序;

使用Sybase SQL Server做为数据库服务器;

要求不能改变数据库使用的字符集设置;

使用或不使用Hibernate等ORM工具;

如果你的情况正如上述,那么建议你阅读本文。

方法概述:

建立JDBC驱动程序的包装类,在包装类中加入改进的字符集和获取自动生成编号功能。

针对平台:

Windows 2000/XP(主要是使用新版cmd console的新增shell语法)

jConnect™ 5.5

Sybase公司于2001年推出的JDBC驱动程序jConnect™,至今似乎就没有改动过。目前最高版本为5.5,是按照J2SE 1.2规范设计的,而现在用得较多的是J2SE 1.4,因此有很多特性都没有提供。特别是国际化问题,jConnect™的实现一直在困扰我,直到有一天拿jConnect™和其它JDBC驱动作比较时才发现原来是jConnect™的BUG!

为了让读者不会被同样的问题困扰,我把具体的改进方法写出来,供大家参考:

首先需要对jConnect™逆向工程(侵犯版权?管不了那么多了!),将jconnect.jar解开,用jad对其反编译:

C:\jconnect>for /d /r %i in (*) do jad -s .java -d %i %i\*

有些.class文件可能无法正常解开,不过不要紧,因为我们只改动一个文件:

com/sybase/jdbc2/jdbc/SybDriver.java

除此之外,添加如下文件:

com/sybase/jdbc2/jdbc/CachedCharset.java

com/sybase/jdbc2/jdbc/_SybConnection.java

com/sybase/jdbc2/jdbc/_SybStatement.java

com/sybase/jdbc2/jdbc/_SybPreparedStatement.java

com/sybase/jdbc2/jdbc/_SybCallableStatement.java

com/sybase/jdbc2/jdbc/_SybResultSet.java

com/sybase/jdbc2/jdbc/P_Connection.java

com/sybase/jdbc2/jdbc/P_Statement.java

com/sybase/jdbc2/jdbc/P_PreparedStatement.java

com/sybase/jdbc2/jdbc/P_CallableStatement.java

com/sybase/jdbc2/jdbc/P_ResultSet.java

新增的文件用于实现新的特性,为了区别新旧两个JDBC,我们约定将连接URL改成如下格式:

jdbc:stupy(新增属性):sybase:Tds:<SERVER>:<PORT>/<DATABASE>

以区别于:

jdbc:sybase:Tds:<SERVER>:<PORT>/<DATABASE>

举例:

jdbc:stupy(charset=gb2312):sybase:Tds:127.0.0.1:5000/BookStore

为了识别这个新的URL,找到SybDriver.java中acceptsURL方法,加入:

public boolean acceptsURL(String url)

throws SQLException

{

if (url.startsWith("jdbc:stupy:"))

return acceptsURL(url.replaceFirst("stupy\\(.*?\\)?:", ""));

int index = url.indexOf('/');

if(index != -1)

……

同理,在SybDriver.java中connect(String url, Properties info)中加入同样的内容(为什么不是其它connect方法?因为我们只需要关心public的方法),同时根据URL返回不同的Connection对象:

public final Connection connect(String url, Properties info)

throws SQLException

{

String stupy_props = null;

if (url.startsWith("jdbc:stupy")) {

stupy_props = url.substring(10, url.indexOf(":", 10));

if (stupy_props.startsWith("("))

stupy_props = stupy_props.substring(1, stupy_props.length()-1);

url = url.replaceFirst("stupy\\(.*?\\)?:", "");

}

Debug.println(this, "Connect(" + url + ")");

SybProperty props = new SybProperty(info, _version);

SybUrlManager uMgr = new SybUrlManager(url, info, props);

SybUrlProvider up = uMgr.getUrlProvider();

if(up == null)

return null;

SybConnection conn = new SybConnection(up, url);

if(_msgHandler != null)

conn.setSybMessageHandler(_msgHandler);

java.sql.SQLWarning w = props.getWarnings();

if(w != null)

conn.handleSQLE(w);

if (stupy_props != null)

return new _SybConnection(conn, stupy_props);

return conn;

}

接下来,建立我们自己的特性实现。为了突出重点,我们需要建立一些辅助工具,包括5个中间包装类P_xxx,1个简单的具有缓存功能的字符集类CachedCharset:

中间包装类的作用非常简单,它聚合一个外部对象,将所有方法调用转移到外部对象上。为什么不用继承呢?有几个原因,一是Java不支持多继承,二是为了重载已经声明为final的那些方法。这5个包装类因为本质上非常简单,比如包装类P_ResultSet,它的构造指定一个将被聚合的目标ResultSet实例rs,P_ResultSet的所有方法调用如getString(String colname)将返回rs.getString(colname)。为了方便读者使用CP技术(Copy/Paste),将这5个包装类贴在本文最后。

Part2èhttp://www.csdn.net/Develop/read_article.asp?id=27124

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有