各家JDBC driver的现行版本及使用用法[转]

有鉴于许多版友对于寻找JDBC driver或者如何使用driver常常发问,
在这边我简单整理一下比较代表性的driver跟使用方式.

Microsoft SQL Server series (6.5, 7.x and 2000) and Sybase 10

JDBC Name: jTDS
URL: http://jtds.sourceforge.net/
Version: 0.5.1
Download URL: http://sourceforge.net/project/showfiles.php?group_id=33291

语法:

Class.forName("net.sourceforge.jtds.jdbc.Driver ");
Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://host:port/database","user","password");
or
Connection con = DriverManager.getConnection("jdbc:jtds:sybase://host:port/database","user","password");



MySQL

JDBC Name: Connector/J 3.0
URL: http://www.mysql.com/
Version: 3.0.8 -stable
Download URL: http://www.mysql.com/downloads/api-jdbc-stable.html

语法:

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");



Oracle

JDBC Name: Connector/J 3.0
URL: http://otn.oracle.com/
Version: 3.0.8 -stable
Download URL: http://otn.oracle.com/software/tech/java/sqlj_jdbc/content.html

语法:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:port:databse","user","password");



Sybase

Driver: jConnect 4.5/5.5 (JDBC 2.0 请使用5.5)

语法:


Class.forName("com.sybase.jdbc2.jdbc.SybDriver").newInstance();
DriverManager.getConnection("jdbc:sybase:Tds:IP
地址:2638?ServiceName="+数据库名称,"账号","密码");



Postgresql

JDBC Name: PostgreSQL JDBC
URL: http://jdbc.postgresql.org/
Version: 7.3.3 build 110
Download URL: http://jdbc.postgresql.org/download.html

语法:

Class.forName("org.postgresql.Driver");
Connection con=DriverManager.getConnection("jdbc:postgresql://host:port/database","user","password");



IBM AS400主机在用的JDBC语法

有装V4R4以上版本的Client Access Express
可以在C:/Program Files/IBM/Client Access/jt400/lib
找到 driver 档案 jt400.zip,并更改扩展名成为 jt400.jar

语法

java.sql.DriverManager.registerDriver (new com.ibm.as400.access.AS400JDBCDriver ());
Class.forName("com.ibm.as400.access.AS400JDBCConnection");
con = DriverManager.getConnection("jdbc:as400://IP","user","password");

各家JDBC driver的现行版本及使用语法各家JDBC driver的现行版本及使用语法各家JDBC driver的现行版本及使用语法各家JDBC driver

<think>首先,用户的问题是关于如何将D3D9解码在显卡一上,通过wgl换到OpenGL纹理在显卡二上。我需要参考提供的引用,但用户说这些引用仅供参考,我应该更多地基于用户上一次的问题和我的回答。不过,我还没有之前的回答,因为这是新对话的开始。用户消息中包含了引用[1]到[4],所以我必须参考它们。 回顾引用: - 引用[1]:讨论了WGL_NV_DX_interop和WGL_NV_DX_interop2的区别,特别提到在DX11下wglDXSetResourceShareHandleNV()被移除,但在DX9中还有用。还提到了共享资源(如Texture或Surface),以及线程问题:OpenGL的context是线程相关的。 - 引用[2]:关于raw视频分流器的选项,如帧率、宽度、高度等,可能不直接相关。 - 引用[3]:关于raw音频分流器的选项,如声道数、采样率,也不直接相关。 - 引用[4]:关于Mesa作为OpenGL的实施,适用于各种硬件。 用户的问题焦点是:将D3D9解码在显卡一上,通过wgl换到OpenGL纹理在显卡二上。这涉及到跨显卡的共享。 关键点: - D3D9在显卡一上解码视频。 - 然后通过wgl(Windows OpenGL)换到OpenGL纹理在显卡二上。 - 这需要共享资源,因为涉及到两个不同的显卡。 从引用[1],它提到了WGL_NV_DX_interop扩展,这个扩展允许在DirectX和OpenGL之间共享资源。特别地,它说WGL_NV_DX_interop支持在NVIDIA、AMD和Intel显卡上,但可能有驱动问题。 引用[1]还提到: - DX11下移除了wglDXSetResourceShareHandleNV(),但在DX9中可能还在使用。 - 共享资源可以是Texture或Surface。 - OpenGL context是线程绑定的,所以需要在同一个线程中操作或处理多线程问题。 用户指定D3D9,所以DX9是相关的。 实现步骤可能包括: 1. 在显卡一上使用D3D9解码视频,得到一个资源(如IDirect3DTexture9或IDirect3DSurface9)。 2. 使用WGL_NV_DX_interop扩展来共享这个资源到OpenGL。 3. 在显卡二上,OpenGL context中,接收并绑定这个共享的资源。 但问题在于显卡一和显卡二是不同的显卡。这增加了复杂性,因为资源共享通常在同一显卡上更容易。 引用[1]提到WGL_NV_DX_interop支持在多个显卡上,但可能需要处理共享句柄。 具体如何实现: - 首先,确保显卡支持WGL_NV_DX_interop。引用[4]提到Mesa支持,但这是在Windows上,所以可能使用NVIDIA或AMD的驱动。 - 步骤: a. 初始化D3D9在显卡一上。 b. 解码视频,得到一个纹理或表面。 c. 使用wglDXOpenDeviceNV来打开D3D9设备。 d. 使用wglDXRegisterObjectNV来注册D3D9资源(如纹理)到OpenGL。 e. 然后,在显卡二上,创建一个OpenGL context,并使用wglDXLockObjectsNV和wglDXUnlockObjectsNV来访问共享资源。 但显卡二是不同的显卡,这可能导致问题,因为共享通常在同一GPU上工作。引用[1]提到“在另一家显卡上也可以”,但有小概率问题。 引用[1]说:“WGL_NV_DX_interop最早是Nvdia写的一个扩展,现在N卡,A卡和Intel显卡驱动已经都支持了。所以理论上在各家的显卡上都可以用”,但这可能指的是在同一个系统上,如果显卡不同,但系统支持多GPU。 在Windows上,如果系统有两个显卡(如集成和独立),资源共享可能通过系统内存或特定扩展实现。 用户提到“显卡一”和“显卡二”,暗示两个不同的物理显卡。 所以,实现可能涉及: - 使用共享内存或跨GPU的共享机制。 但WGL_NV_DX_interop是设计用于同一GPU或系统级别的共享。 引用[1]提到线程问题:OpenGL context是线程绑定的,所以如果在一个线程初始化,另一个线程使用无效。这可能相关,因为如果两个显卡在不同的线程或设备上,但用户指定了显卡。 或许需要在同一个线程中处理共享,但这不现实。 另一个方式是使用D3D和OpenGL之间的共享表面,但通过系统内存。 但效率低。 理想是使用扩展。 搜索记忆:对于跨GPU共享,可能需要使用更高级的API或特定厂商的解决方案。 但基于引用,WGL_NV_DX_interop应该支持。 步骤总结(根据知识): 1. 在显卡一上: - 创建D3D9设备。 - 解码视频到IDirect3DTexture9或类似。 2. 获取D3D9设备句柄。 3. 使用wglDXOpenDeviceNV打开D3D设备。 4. 使用wglDXRegisterObjectNV注册D3D资源到一个共享句柄。 5. 在显卡二上: - 创建一个OpenGL context(确保在支持OpenGL的显卡上)。 - 使用wglDXOpenDeviceNV打开同一个D3D设备?但D3D设备是绑定到显卡一的。 问题:D3D设备是创建在显卡一上的,而OpenGL context在显卡二上。WGL_NV_DX_interop可能假设资源在同一个GPU上。 引用[1]提到“在另一家显卡上也可以”,但unspecified。 或许通过共享句柄。 在注册时,wglDXRegisterObjectNV返回一个GLuint handle,可以在OpenGL中使用。 但OpenGL context需要在能访问该资源的显卡上。 如果显卡二不同,可能需要两个显卡在同一个系统中,并且驱动支持跨GPU共享。 实现: - 确保两个显卡驱动都支持WGL_NV_DX_interop。 - 在显卡一上初始化D3D9和资源。 - 在显卡二上初始化OpenGL。 - 然后,使用wgl函数来共享。 具体函数: - wglDXOpenDeviceNV: 打开D3D设备,返回一个HANDLE。 - wglDXRegisterObjectNV: 注册D3D资源,返回一个GLuint。 但在OpenGL端,当调用wglDXLockObjectsNV时,它需要访问资源,所以可能资源必须可访问。 在双GPU系统中,如果显卡二是主显卡或类似,可能可行。 另一个方式:使用共享表面或通过CPU拷贝,但用户要求通过wgl。 用户指定“通过wgl换”,所以使用WGL_NV_DX_interop是途径。 从引用[1],它提到线程问题,但没说跨GPU问题。 所以,在回答中,我应该概述步骤。 添加引用:引用[1]讨论了一些细节,如DX9下的wglDXSetResourceShareHandleNV,但它说在DX11移除,但DX9还在。用户是D3D9,所以可用。 引用[1]:"DX11上去掉了wglDXSetResourceShareHandleNV()函数的调用根据官方文档, DX11下为了保持和DX9的调用流程兼容,调用wglDXSetResourceShareHandleNV也不会报错,调用也没有实际效果" – 所以在DX9中,它可能还有用,但文档说兼容。 在DX9中,wglDXSetResourceShareHandleNV是需要的?我需要查一下。 标准流程: 对于D3D9: - 在D3D端:创建设备和解码纹理。 - 调用wglDXSetResourceShareHandleNV来设置共享句柄(如果支持)。 - 然后wglDXRegisterObjectNV。 但在引用中,它说DX11移除,但DX9可能有。 用户是D3D9,所以可能。 步骤: 1. 初始化D3D9在显卡一上。 2. 解码视频到纹理(例如IDirect3DTexture9)。 3. 获取纹理的共享句柄(如果需要,但wglDXSetResourceShareHandleNV可能不需要;在D3D9中,资源可能有内在句柄)。 4. 初始化OpenGL在显卡二上。这需要指定在哪个显卡上创建context。在Windows,使用wglCreateContext和设置像素格式,可能需要枚举适配器。 在OpenGL,创建context时,可以指定设备上下文,但通常绑定到显示器。对于多GPU,需要小心。 或许使用wglCreateContextAttribsAR或类似,但标准wgl可能不支持直接选择GPU。可能需要使用DXGI或WDDM功能。 在Windows上,为了OpenGL选择特定GPU,可以使用wglCreateContext和设置像素格式,但像素格式与显示适配器关联。 所以,在创建OpenGL context时,确保它在显卡二上。 然后: 5. 使用wglDXOpenDeviceNV打开D3D9设备。D3D9设备有设备句柄。 6. 调用wglDXRegisterObjectNV注册D3D纹理,指定类型(如D3D9_RESOURCE_TEXTURE),并获取一个GLuint纹理句柄。 7. 在OpenGL中,使用这个GLuint作为纹理ID。 8. 使用wglDXLockObjectsNV来锁定资源,访问,然后解锁。 但关键是,如果显卡一和显卡二是不同的物理GPU,这可能导致性能问题或不被支持,因为资源需要被拷贝或共享。 引用[1]提到“有极小概率会在某一版的显卡驱动里会出现工作不正常”,所以可能工作,但不保证。 在回答中,概述步骤。 添加注意事项。 现在,回答结构: - 解释过程。 - 给出步骤。 - 引用相关引用。 - 添加相关问题。 系统指令:使用中文,行内数学用$...$,独立公式用$$...$$,但这个问题可能不需要数学。 添加引用标识。 例如,引用[1]在末尾。 回答结构清晰。 最后,生成相关问题。 </think> ### 将D3D9解码从显卡一通过WGL换到OpenGL纹理在显卡二上的实现方法 实现将D3D9解码在显卡一上生成的视频数据通过WGL_NV_DX_interop扩展共享到OpenGL纹理在显卡二上,是一个涉及DirectX 9 (D3D9) 和 OpenGL 跨显卡资源共享的过程。这需要处理多GPU环境、资源注册和线程同步问题。以下是基于引用[1]的关键细节(如WGL_NV_DX_interop的跨厂商支持、D3D9调用流程差异和线程绑定特性)的逐步实现方案。注意,跨显卡共享可能存在驱动兼容性问题(如引用[1]提到的“有极小概率会在某一版的显卡驱动里会出现工作不正常”),因此在实际部署前需测试目标系统的显卡驱动版本。 #### 前提条件 - **系统环境**:Windows 系统,支持多GPU(如显卡一用于D3D9解码,显卡二用于OpenGL渲染)。 - **硬件要求**:两张显卡均需支持WGL_NV_DX_interop扩展(NVIDIA、AMD或Intel显卡驱动通常支持,参考引用[1])。 - **软件依赖**: - D3D9 用于视频解码(例如,使用DirectShow 或自定义解码器)。 - OpenGL 上下文初始化在显卡二上。 - WGL_NV_DX_interop 扩展函数(通过 `wglext.h` 或动态加载)。 #### 实现步骤 以下是核心步骤,分为D3D9端(显卡一)和OpenGL端(显卡二)的处理。代码示例使用C++,并假设已初始化必要的库。 1. **在显卡一上初始化D3D9和解码视频** 使用D3D9创建设备,解码视频到纹理资源(如 `IDirect3DTexture9`)。确保纹理格式兼容,如引用[1]提到的“D3D/OpenGL之间共享的资源可以是Texture”,格式需为常见类型(如 `D3DFMT_A8R8G8B8`)。 ```cpp // D3D9端(显卡一) IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION); IDirect3DDevice9* pDevice; D3DPRESENT_PARAMETERS d3dpp = {0}; pD3D->CreateDevice(adapter1, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDevice); // 解码视频到纹理(示例:创建空白纹理) IDirect3DTexture9* pD3DTexture; pDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pD3DTexture, NULL); // 假设解码器填充pD3DTexture数据(如通过StretchRect或解码输出) ``` 2. **使用WGL_NV_DX_interop注册D3D资源** 在D3D9端,通过WGL函数注册纹理为共享资源。注意,D3D9下需调用 `wglDXSetResourceShareHandleNV` 设置共享句柄(DX11中已移除,但D3D9兼容,调用无实际错误但可选,参考引用[1])。然后,注册资源以获取OpenGL可用的句柄。 ```cpp // 加载WGL扩展函数(需动态加载或使用wglext.h) PFNWGLDXOPENDEVICENVPROC wglDXOpenDeviceNV = ...; // 动态加载函数 PFNWGLDXREGISTEROBJECTNVPROC wglDXRegisterObjectNV = ...; // 打开D3D设备到WGL HANDLE hD3DDevice = wglDXOpenDeviceNV(pDevice); if (!hD3DDevice) { /* 错误处理 */ } // 注册D3D纹理资源(类型为D3D9_RESOURCE_TEXTURE) // 在D3D9中,可调用wglDXSetResourceShareHandleNV以兼容旧流程(尽管DX9下可能冗余) wglDXSetResourceShareHandleNV(pD3DTexture, TRUE); // 可选,参考引用[1] HANDLE hShared = wglDXRegisterObjectNV(hD3DDevice, pD3DTexture, GL_TEXTURE_2D, WGL_ACCESS_READ_ONLY_NV); if (!hShared) { /* 错误处理 */ } ``` 3. **在显卡二上初始化OpenGL上下文** 创建OpenGL渲染上下文(render context)并绑定到显卡二。注意,OpenGL上下文是线程绑定的(参考引用[1]),因此所有操作应在同一线程或通过同步机制处理。使用 `wglMakeCurrent` 确保上下文正确附加。 ```cpp // OpenGL端(显卡二) HDC hDC = GetDC(hWnd); // 获取显卡二关联的设备上下文 // 设置像素格式选择显卡二(需枚举适配器,例如使用EnumDisplayDevices) PIXELFORMATDESCRIPTOR pfd = { ... }; int format = ChoosePixelFormat(hDC, &pfd); SetPixelFormat(hDC, format, &pfd); HGLRC hGLRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hGLRC); // 绑定当前线程 // 加载OpenGL扩展 PFNWGLDXLOCKOBJECTSNVPROC wglDXLockObjectsNV = ...; PFNWGLDXUNLOCKOBJECTSNVPROC wglDXUnlockObjectsNV = ...; ``` 4. **在OpenGL中访问共享纹理** 使用注册的资源句柄(`hShared`)在OpenGL中创建纹理对象。通过 `wglDXLockObjectsNV` 锁定资源以确保安全访问,然后像普通OpenGL纹理使用。 ```cpp // 在OpenGL上下文中绑定共享资源 GLuint glTexture; glGenTextures(1, &glTexture); glBindTexture(GL_TEXTURE_2D, glTexture); // 锁定资源并关联 wglDXLockObjectsNV(hD3DDevice, 1, &hShared); // 锁定 // 此时,glTexture 与共享数据关联,可直接操作 // 例如:glTexImage2D或渲染使用 wglDXUnlockObjectsNV(hD3DDevice, 1, &hShared); // 解锁 ``` 5. **跨显卡共享的注意事项** - **线程同步**:由于OpenGL上下文绑定到线程(参考引用[1]),所有共享操作需在同一线程执行,或使用线程间共享上下文技术(如 `wglShareLists`)。 - **性能与兼容性**:跨GPU共享可能通过系统内存隐式拷贝实现,而非零拷贝,影响性能。测试驱动兼容性(引用[1]提到“各家显卡驱动已支持,但有小概率问题”)。 - **资源类型**:仅共享纹理(`Texture`)而非Surface,因StretchRect在跨表面时限制多(引用[1])。 #### 完整示例框架 ```cpp // 伪代码框架 void D3D_to_OpenGL_Share() { // 显卡一:D3D9初始化 IDirect3DDevice9* pDevice = initD3D9(adapter1); IDirect3DTexture9* pTex = decodeVideoToTexture(pDevice); // WGL共享设置 HANDLE hD3DDev = wglDXOpenDeviceNV(pDevice); HANDLE hShared = wglDXRegisterObjectNV(hD3DDev, pTex, ...); // 显卡二:OpenGL初始化 HGLRC hGLRC = initOpenGL(adapter2); // 选择显卡二适配器 wglMakeCurrent(...); // 在OpenGL使用共享纹理 GLuint glTex; glGenTextures(1, &glTex); wglDXLockObjectsNV(hD3DDev, 1, &hShared); glBindTexture(GL_TEXTURE_2D, glTex); // 渲染操作... wglDXUnlockObjectsNV(hD3DDev, 1, &hShared); } ``` #### 注意事项 - **驱动问题**:如引用[1]所述,WGL_NV_DX_interop在部分驱动版本可能不稳定,建议测试NVIDIA/AMD最新驱动。 - **跨GPU限制**:共享效率取决于系统架构(如PCIe带宽);若性能不足,可回退到CPU拷贝(效率低)。 - **错误处理**:检查所有WGL函数返回值,使用 `glGetError` 和D3D错误码。 - **替代方案**:如果不支持跨GPU共享,考虑使用中间系统内存拷贝(例如,D3D纹理拷贝到CPU内存,再上传到OpenGL),但违背“通过wgl”的要求。 通过以上步骤,可以实现D3D9解码资源在显卡一到OpenGL纹理在显卡二的换。实践中,需针对具体硬件调试[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值