Java JNI调用dll通过OLEDB Jet 4.0(dBase IV)连接数据库,JRE 7环境中的Borland



我的java项目已经调用了dll(C#项目),它通过OleDB jet 4.0将dBase(IV)数据库与Borland数据库引擎(BDE)连接起来。

当我用JRE 6.0运行java项目时,我没有发现任何错误,但当我用JRE 7.0运行它时,我发现崩溃了。

我试着用Windows调试(WinDbg)来调试JRE 6.0和JRE 7.0环境之间的区别。当dll进程试图连接数据库时,我发现了错误。

internal bool LoadTable(String _provider, String _prop, String _datasource,
String _table, ref DataTable _dt, ref String _error)
{
....
db = new OleDbConnection(connectionString);
db.Open();//Error Here.
....
}

Windows调试中的跟踪告诉我,当它调用依赖dll(IDAPI32.dll)连接数据库时,它崩溃了。

JRE 7.0

[Trace] Connection string: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:SOME_PATHDATA;Extended Properties=dBase IV;
[Trace] Create database connection.
[Trace] Opening database.
ModLoad: 00000000`6a830000 00000000`6a8d3000   C:WindowsassemblyNativeImages_v4.0.30319_32System.Transactionsea4b09c3c6f55fc808fae12477465c1bSystem.Transactions.ni.dll
ModLoad: 00000000`6bd20000 00000000`6bd67000   C:WindowsMicrosoft.NetassemblyGAC_32System.Transactionsv4.0_4.0.0.0__b77a5c561934e089System.Transactions.dll
ModLoad: 00000000`72b00000 00000000`72b5f000   C:WindowsSysWOW64sxs.dll
ModLoad: 00000000`676a0000 00000000`67774000   C:Program Files (x86)Common FilesSystemOle DBoledb32.dll
ModLoad: 00000000`71630000 00000000`7164f000   C:WindowsSysWOW64MSDART.DLL
ModLoad: 00000000`72a30000 00000000`72a47000   C:WindowsSysWOW64bcrypt.dll
ModLoad: 00000000`6ca20000 00000000`6ca34000   C:Program Files (x86)Common FilesSystemOle DBOLEDB32R.DLL
ModLoad: 00000000`75390000 00000000`7539e000   C:WindowsSysWOW64pcRtRemote.dll
ModLoad: 00000000`631f0000 00000000`63326000   C:WindowsSysWOW64comsvcs.dll
ModLoad: 00000000`6bd00000 00000000`6bd14000   C:WindowsSysWOW64ATL.DLL
ModLoad: 00000000`72960000 00000000`7299d000   C:WindowsSysWOW64bcryptprimitives.dll
ModLoad: 00000000`6afa0000 00000000`6affa000   C:WindowsSysWOW64msjetoledb40.dll
ModLoad: 00000000`71350000 00000000`714d5000   C:WindowsSysWOW64msjet40.dll
ModLoad: 00000000`71290000 00000000`71328000   C:WindowsSysWOW64mswstr10.dll
ModLoad: 00000000`71260000 00000000`71271000   C:WindowsSysWOW64msjter40.dll
ModLoad: 00000000`71250000 00000000`71256000   C:WindowsSysWOW64MSJINT40.DLL
ModLoad: 00000000`635b0000 00000000`63626000   C:WindowsSysWOW64msxbde40.dll
ModLoad: 00000000`4bde0000 00000000`4be7a000   C:Program Files (x86)BorlandGemeinsame DateienBDEIDAPI32.DLL
ModLoad: 00000000`753b0000 00000000`753c2000   C:WindowsSysWOW64MPR.dll
ModLoad: 00000000`4c9e0000 00000000`4ca06000   C:Program Files (x86)BorlandGemeinsame DateienBDEIDR20007.DLL
ModLoad: 00000000`4e8e0000 00000000`4e904000   C:Program Files (x86)BorlandGemeinsame DateienBDEBANTAM.DLL
(1380.e30): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** WARNING: Unable to verify checksum for C:Program Files (x86)BorlandGemeinsame DateienBDEIDAPI32.DLL
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:Program Files (x86)BorlandGemeinsame DateienBDEIDAPI32.DLL - 
IDAPI32!DbiRenameTable+0x3075:
4be3a2d1 85c0            test    eax,eax

在使用JRE 6.0环境调用我的项目时,我没有发现此崩溃。

JRE 6.0

[Trace] Connection string: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:SOME_PATHDATA;Extended Properties=dBase IV;
[Trace] Create database connection.
[Trace] Opening database.
ModLoad: 00000000`6bcf0000 00000000`6bd93000   C:WindowsassemblyNativeImages_v4.0.30319_32System.Transactionsea4b09c3c6f55fc808fae12477465c1bSystem.Transactions.ni.dll
ModLoad: 00000000`6afb0000 00000000`6aff7000   C:WindowsMicrosoft.NetassemblyGAC_32System.Transactionsv4.0_4.0.0.0__b77a5c561934e089System.Transactions.dll
ModLoad: 00000000`72b00000 00000000`72b5f000   C:WindowsSysWOW64sxs.dll
ModLoad: 00000000`6a800000 00000000`6a8d4000   C:Program Files (x86)Common FilesSystemOle DBoledb32.dll
ModLoad: 00000000`71900000 00000000`7191f000   C:WindowsSysWOW64MSDART.DLL
ModLoad: 00000000`72a30000 00000000`72a47000   C:WindowsSysWOW64bcrypt.dll
ModLoad: 00000000`71740000 00000000`71754000   C:Program Files (x86)Common FilesSystemOle DBOLEDB32R.DLL
ModLoad: 00000000`75390000 00000000`7539e000   C:WindowsSysWOW64RpcRtRemote.dll
ModLoad: 00000000`67850000 00000000`67986000   C:WindowsSysWOW64comsvcs.dll
ModLoad: 00000000`71630000 00000000`71644000   C:WindowsSysWOW64ATL.DLL
ModLoad: 00000000`72960000 00000000`7299d000   C:WindowsSysWOW64bcryptprimitives.dll
ModLoad: 00000000`6ad40000 00000000`6ad9a000   C:WindowsSysWOW64msjetoledb40.dll
ModLoad: 00000000`71350000 00000000`714d5000   C:WindowsSysWOW64msjet40.dll
ModLoad: 00000000`71290000 00000000`71328000   C:WindowsSysWOW64mswstr10.dll
ModLoad: 00000000`71260000 00000000`71271000   C:WindowsSysWOW64msjter40.dll
ModLoad: 00000000`71250000 00000000`71256000   C:WindowsSysWOW64MSJINT40.DLL
ModLoad: 00000000`677d0000 00000000`67846000   C:WindowsSysWOW64msxbde40.dll
ModLoad: 00000000`4bde0000 00000000`4be7a000   C:Program Files (x86)BorlandGemeinsame DateienBDEIDAPI32.DLL
ModLoad: 00000000`753b0000 00000000`753c2000   C:WindowsSysWOW64MPR.dll
ModLoad: 00000000`4c9e0000 00000000`4ca06000   C:Program Files (x86)BorlandGemeinsame DateienBDEIDR20007.DLL
ModLoad: 00000000`4e8e0000 00000000`4e904000   C:Program Files (x86)BorlandGemeinsame DateienBDEBANTAM.DLL
ModLoad: 00000000`67710000 00000000`677d0000   C:WindowsassemblyNativeImages_v4.0.30319_32System.Ente96d83b35#ed906f21883851cfbb9bd06b0d2a4daaSystem.EnterpriseServices.ni.dll
ModLoad: 00000000`6cb20000 00000000`6cb3f000   System.EnterpriseServices.Wrapper.dll
ModLoad: 00000000`0f2e0000 00000000`0f2ff000   System.EnterpriseServices.Wrapper.dll
ModLoad: 00000000`6c640000 00000000`6c67e000   C:WindowsassemblyNativeImages_v4.0.30319_32System.Ente96d83b35#ed906f21883851cfbb9bd06b0d2a4daaSystem.EnterpriseServices.Wrapper.dll
ModLoad: 00000000`6cb20000 00000000`6cb3f000   C:WindowsMicrosoft.NetassemblyGAC_32System.EnterpriseServicesv4.0_4.0.0.0__b03f5f7f11d50a3aSystem.EnterpriseServices.Wrapper.dll
[Trace] Query with sql: SELECT * FROM XXXX.DBF
[Trace] Add data to data table
ModLoad: 00000000`4dde0000 00000000`4de56000   C:Program Files (x86)BorlandGemeinsame DateienBDEIDDBAS32.DLL
ModLoad: 00000000`6af80000 00000000`6afa7000   C:WindowsassemblyNativeImages_v4.0.30319_32System.Numericsde2a832558f95db343e443c365bd3575System.Numerics.ni.dll
[Trace] bla bla bla....
[Trace] Close database.

其他环境信息(JRE 6和7)-.Net Framework版本4.0.30319.34209-运行程序时,操作系统体系结构为32位(x86)。-操作系统Windows 7 64位

JRE 6和7之间的环境和在运行时崩溃有什么不同?

只是猜测,但区别可能是dll搜索路径。

要尝试的一件事是使用procmon来跟踪文件访问,直到出现故障。查看它试图从哪些路径加载该idapi32 dll。

您有时也可以使用旧的dependens.exe实用程序来启动jre。。。

当然,即使您解决了这个问题,您也会希望捕获抛出的任何异常,并将其作为java异常进行审查。

最后,如果您正在寻找一个类型4的odbc/ado驱动程序,izmado有一个价格非常合理的驱动程序。我们已经在大约一百次部署中使用了它,没有出现任何问题。有时最好不要重新制造轮子!

感谢Kevin的指导。我使用dependens.exe来检查dll的依赖关系。我在dll环境中发现了一些线索,这可能是这个问题的主要原因。

我发现JRE 6.0可以在不崩溃的情况下调用JNI complete,因为JRE 6.0有类似的环境BDE(VC++6.0和VC++7.1),但JRE 7.0没有类似的环境BD。

Borland数据库引擎(BDE)是旧的遗留系统。它是从vc++6.0版本创建的。

JRE 6.0中的java.dll是从vc++7.1版(MS vc++2003)创建的。

JRE 7.0中的java.dll是从vc++10.0版(MS vc++2010)创建的。

我通过在JNI中创建exe来调用模块来证明这一假设。我们发现由MS VC++2010创建的exe也发现了同样的问题,但由MS VC++2003创建的exe没有发现问题。

我通过将数据库提供程序从BDE更改为Microsoft Access数据库引擎2010的数据库提供程序来解决这个问题。(https://www.microsoft.com/en-us/download/details.aspx?id=13255)

最新更新