jdbc和jdbc-odbc的区别

爱吃芋头 2008-05-11 02:52:47
我做了一个数据库恢复的模块,如果是用jdbc-odbc桥连接的方法就可以用 use master->恢复自己的数据库->use 自己数据库 的方法恢复数据库
但是如果用jdbc直接连接的方法,上述方法就会报数据库正在使用的错误,必须得在master库里编写一个停止自己进程的存储过程然后调用存储过程在恢复数据库。
我想问问这是什么原因,为什么直接连会报错误,而用桥连接就没事?这俩种链接为什么有这样的差别?
如果我用第一种方法那么用户还得配置数据源,这样会很不方便
如果我用第二种方法,用户还得在master库里创建存储过程,这样也不方便
真头疼,有没有两全其美的办法?请高手指教
我的数据库:sql server
系统:桌面系统
...全文
672 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱吃芋头 2008-05-12
  • 打赏
  • 举报
回复
up
ts2794 2008-05-11
  • 打赏
  • 举报
回复
学习
Shine_Panda 2008-05-11
  • 打赏
  • 举报
回复
主要是性能把。
楼上好多详细的解释啊。
loujianchengdd 2008-05-11
  • 打赏
  • 举报
回复
up,学习中
ThirdDimension 2008-05-11
  • 打赏
  • 举报
回复
关注中。。。
bootupnow 2008-05-11
  • 打赏
  • 举报
回复
10楼的同学在普及知识,hoho~
up
bootupnow 2008-05-11
  • 打赏
  • 举报
回复
对一个database进行restore的时候,不要有其他的进程使用它。
比如你连到test数据库去操作,然后试图恢复test,就有问题。
爱吃芋头 2008-05-11
  • 打赏
  • 举报
回复
谢谢,我现在最想知道的就是用户在使用的时候除了附加数据库外,还用不用再master上创建存储过程用开停止进程??谢谢各位大侠
zuoguodang 2008-05-11
  • 打赏
  • 举报
回复
你用jdbc那么就不能直接操纵数据库,而jdbc-odbc桥则不一样了,实际还是由系统操纵的数据库,你知识调用系统对数据库进行操作。
xshy3412 2008-05-11
  • 打赏
  • 举报
回复
ODBC(Open DataBase Connectivity : 开放数据库连接)


ODBC 总体结构
应用程序
执行处理并调用odbc函数,提交sql语句并检索结果

Driver Manager
管理应用程序和驱动程序之间的通讯,根据应用程序加载并卸载驱动程序,
处理odbc函数调用,获把它们传送到驱动程序

驱动程序
处理odbc函数调用,把sql语句提交到数据源,并返回结果到应用程序,如有必要,
驱动程序修改一个应用程序请求,以使请求与相关的DBMS支持的语法一致

数据源
用户要访问的DBMS,以及相关os

Application
|
|
Driver Manager
| | |
| | |
驱动程序 驱动程序 驱动程序
| | |
数据源 数据源 数据源



结合现实的高层开发工作流程如下:
1.数据应用系统首先获得在ODBC数据源管理器中建立的DSN(存储了与数据提供程序连接的详细信息包含数据库位置、数据库类型及相应的ODBC驱动程序等),然后 Driver Manager依赖一种叫做数据库独立的交流(Database Indepedent Communications Technology)的技术与数据源建立联系(其中涉及客户端和服务器端多种Agent对象的问题,详情不叙,可参见下图).


2.Driver Mangaer调用特定ODBC驱动程序将ODBC标准API转化为适用于具体数据库系统的函数调用(数据库特征不同之处也在这里翻译如SQL语法差异等),然后经由客户端的Request Agent发送到数据源.
3.数据源Database Agent处理操作,将结果返回到客户端的Request Agent,再向上经Driver(这里会有翻译和标准化错误码的行为)、Driver Mangaer返回给Application.

需要说明的是定义和操作光标、维护事务、负责任何与访问数据源的必要软件层进行交互(包括与底层网络或文件系统接口的软件)等行为亦由驱动程序完成.

结合ODBC API调用顺序描叙工作流程:初始化(分配环境--->分配连接句柄--->与服务器连接--->分配语句句柄)-------->SQL处理(语句处理和检索部分)-------->终止(释放语句句柄--->与服务器断开--->释放连接句柄--->释放环境).

JDBC(Java DataBase Connectivity : Java数据库连接)




JDBC设计很多借鉴于ODBC:
1.JDBC与ODBC都是基于X/Open的SQL调用级接口
2.JDBC很多设计思想沿袭了ODBC,包括许多抽象和SQL CLI实现
3.JDBC的总体结构类似于ODBC,有四个组件:应用程序、驱动程序管理器、驱动程序和数据源,工作原 理亦大体同于ODBC.

1.JDBC保持了ODBC的基本特性,也独立于特定数据库.
2.使用相同源代码的应用程序通过动态加载不同的JDBC驱动程序,可以访问不同的DBMS.连接不同的 DBMS时,各个DBMS之间仅通过不同的URL进行标识.
3.JDBC的DatabaseMetaData接口提供了一系列方法,可以检查DBMS对特定特性的支持,并相应确定有什 么特性,从而能对特定数据库的特性予以支持
4.JDBC也支持在应用程序中同时建立多个数据库连接,采用JDBC可以很容易地用SQL语句同时访问多个 异构的数据库,为异构的数据库之间的互操作奠定基础

Java的驱动解决方案有四种:1.JDBC-ODBC Bridge 2.本机API/集团式Java驱动程序 3.网络协议/全Java 4.本机协议/全Java
xshy3412 2008-05-11
  • 打赏
  • 举报
回复
关注支持,并学习!
爱吃芋头 2008-05-11
  • 打赏
  • 举报
回复
我是这样理解的不知道对不对:
我在开发系统的时候在自己机子上的master中创建了停止进程的存储过程,但是用户的机子并没有这个存储过程,附加数据库只能附加你自己的库的东西,包括触发器,存储过程,并不能附加到master中,所以用户在使用的时候必须还得在master中创建一个同样的存储过程!
爱吃芋头 2008-05-11
  • 打赏
  • 举报
回复
再次谢谢你
那我想问一下,用户要是使用的时候,除了附加数据库外是不是还得在master上创建存储过程啊?
yiyi_wx 2008-05-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bbjjqq 的回复:]
是啊,我的没停止就可以啊!!晕啊!!
那你是怎么停止的?
也是在master创建一个停止存储过程吗
[/Quote]
yes~~~~~~
我记得你以前的帖子我也给你回过
偶就是用的odbc 并且需要停止再恢复的。。。。
没深究过。。。
会不会是代码的问题。。。
爱吃芋头 2008-05-11
  • 打赏
  • 举报
回复
是啊,我的没停止就可以啊!!晕啊!!
那你是怎么停止的?
也是在master创建一个停止存储过程吗
yiyi_wx 2008-05-11
  • 打赏
  • 举报
回复
用odbc连接也是需要先停止再恢复的啊~~
我之前用的时候就是一开始没停止 结果总报错 后来查了半天才知道是需要先停止
lz的不用???
爱吃芋头 2008-05-11
  • 打赏
  • 举报
回复

如果是jdbc直接连接,恢复代码这样:
String="use master"+
"RESTORE DATABASE Chaoshi FROM disk='"+FileChooserTest.path+"' ";
执行sql 语句;
异常:因为数据库正在使用,所以未能获得对数据库的排它访问权
爱吃芋头 2008-05-11
  • 打赏
  • 举报
回复
我的数据库名称:Chaoshi

jdbc-odbc链接恢复数据库的代码:
String="use master"+
"RESTORE DATABASE Chaoshi FROM disk='"+FileChooserTest.path+"' ";
执行sql 语句;
结果:可以恢复

jdbc直接连接恢复的代码:

master上的存储过程代码:(在查询分析器上执行)
use master
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_killspid]
GO
create proc p_killspid
@dbname sysname
as
declare @s nvarchar(1000)
declare tb cursor local for
select s='kill '+cast(spid as varchar)
from master..sysprocesses
where dbid=db_id(@dbname)
open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb
go

程序数据库恢复的代码:
String="use master"+
"exec p_killspid 'Chaoshi'"+
"RESTORE DATABASE Chaoshi FROM disk='"+FileChooserTest.path+"' ";
执行sql语句;
结果:可以恢复


bootupnow 2008-05-11
  • 打赏
  • 举报
回复
贴代码,贴异常?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧